내가 느끼기에는, 굉장히 추상적인 개념이라고 느껴졌다. 네이버에 검색하면 나오는 두산백과에서의 정의는 다음과 같다.
모듈
프로그램의 기능을 독립적인 부품으로 분리한 것을 모듈이라고 하며, 모듈화 프로그래밍이란 이러한 분리를 강조하여 유지 보수와 타 프로그램에서의 코드 재사용을 손쉽게 하는 소프트웨어 설계 기법을 말한다. 모듈은 일반적으로 서브루틴과 데이터 구조의 집합체로서, 그 자체로서 컴파일 가능한 단위이며, 재사용 가능하고 동시에 여러 다른 모듈의 개발에 사용될 수 있다. 모듈의 인터페이스는 모듈에 의해 제공되거나 필요로 되는 요소들을 표현한다. 모듈의 개념을 명시적으로 지원하는 언어로는 Ada, FORTRAN, Pascal, Python, Ruby 등이 있으며, 일반적으로 프로그래밍 언어에 따라 모듈의 개념을 패키지라 부르기도 하며 그 규모도 언어마다 상이하다.
[네이버 지식백과] 모듈 [module] (두산백과 두피디아, 두산백과)
뭐라고 정의하고 있는데, 마지막의 ‘그 규모도 언어마다 상이하다’라는 말에서 내가 느꼈던 바가 맞음을 알 수 있다.
정리하자면, 그 자체로 컴파일 가능하고 독립적인 기능을 가지는 단위를 의미하는 것 같다.
컴파일 가능
컴파일은 파일 단위가 아닌 라이브러리 단위로도 가능하다. 즉, 단독 파일만을 의미하지 않는다.
독립적인 기능
‘기능’이라는 건 사용하는 입장에서의 정의에 따라 규모가 다르다. 내가 휴대폰으로 ‘시계UI를 사용’할 때에는 시계UI가 기능의 제공자이고, 시계UI가 ‘지역 표준시 계산 기능을 사용’할 때에는 해당하는 라이브러리가 제공자가 될 것이다. 그 안에는 또 여러 파일들이 제공자가 될 것이고, 그 안에는 또 함수들이 제공자가 될 것이다. 함수 단위의 컴파일은 불가능하지만, 하나의 함수로 이루어진 파일이라면 함수도 모듈이라고 부를 수 있지 않을까.
즉, 모듈은 (함수가 될 수도, )파일이 될 수도, 라이브러리가 될 수도, 프로그램이 될 수도 있는 추상적인 개념이라고 이해했다.
단, 일반적으로 파이썬과 같이 모듈의 개념을 직접 사용하는 언어에서는 그 단위를 지칭하고, 자바나 Go와 같은 언어에서는 패키지가 모듈의 개념을 대체하고 있는 것으로 보인다.
모듈은 모듈화의 산물이다. 따라서 좋은 모듈이란 모듈화를 잘 하는 것을 의미한다.
모듈화를 잘 한다는 것은 **목적에 맞는 기능만으로 모듈을 나누는 것
**이다.
즉, 독립성이 높은 모듈일수록 좋다.
소프트웨어 공학에서 모듈의 독립성은 모듈의 결합도와 응집도로 측정한다.
독립성을 높이기 위해서는 모듈의 결합도를 낮추고 응집도를 높여야 한다.