동일한 동작을 반복해서 사용한다면 함수(function)로 만들어야 하죠. 함수를 쓰면 스크립트의 재활용성(reusability) 뿐만아니라 가독성(readibility)도 올라갑니다. 함수는 짧아야 한다고 하죠. 'Clean Code'라는 책에서는 아래와 같이 말합니다.
함수의 첫번째 원칙은 작아야 한다는 것입니다. (The first rule of functions is that they should be small.)
두번째 원칙은 그것보다 더 작아야 한다는 것입니다. (The second rule of functions is that they should be smaller than that.)
그럼 도대체 얼마나 작아야 할까요? 같은 책에서 저자는 다른 프로그래머가 만든 프로그램을 예로 들며 4줄 이하여야 된다고 말합니다. 4줄이라니, 너무 가혹하죠?
함수는 한 가지 기능만을 담아야 하며, 동일한 레벨의 명령어들로 구성되어 있어야 합니다(가령 함수를 구성하는 작은 함수들은 비슷한 수준의 일을 수행해야 합니다). 그러려면 자연스럽게 4~5줄 정도로 구성이 될 것입니다. 이것보다 길다면? 너무 많은 일을 하고 있진 않은지 체크해봐야 합니다. 가독성과 재활용성을 높이기 위해 함수는 짧아야 하는 것입니다. 그럼 main 함수도 마찬가지일까요? 그렇습니다. main 함수도 높은 계층에서의 한 가지 일을 수행해야 합니다.
잠깐, 그런데 main 함수가 왜 필요하죠? python은 compile이 필요없는 script 언어 아닌가요? main 함수가 있는 python script를 봤을 때 제일 먼저 그 의문이 들었습니다.
앞서 말했듯 함수의 목적은 첫째가 재활용성, 둘째가 가독성입니다. 이 중 재활용성 때문에 main 함수가 필요합니다.
python의 장점은 함수들의 묶음인 모듈을 import
해서 쉽게 재활용할 수 있다는 점입니다.
그런데 import
할 때 import
하는 script의 모든 내용을 line-by-line 실행해 버립니다.
만약 main 함수가 없다면 main 함수에 해당하는 내용이 import
되는 순간 실행되어 버립니다. 상관없는 경우도 있겠지만, 그렇지 않은 경우가 훨씬 많겠죠.
함수는 정의만 되지 호출하기 전까지는 실행되지 않기 때문에 main 함수로 만들어버리면 문제 없이 다른 함수들을 불러다 쓸 수 있습니다. 그럼 main 함수가 담고 있는 내용을 독립적으로 terminal 등에서 실행하고 싶을 때는 어떻게 해야 할까요? main 함수를 정의했다면 반드시 아래와 같은 if 문을 써야 합니다.
if __name__ == '__main__': main()
이 if 문의 뜻은 namespace가 __main__
이라면 if문 안의 내용을 실행하라는 것입니다.
namespace는 모듈을 import
할 때 모듈의 이름(혹은 사용자가 정의한 alias)으로 정의됩니다.
import numpy as np arr = np.array([1, 2, 3]) # 여기서는 numpy라는 모듈의 namespace를 np라는 alias로 재정의 했습니다.
namespace는 여러 모듈을 import
할 때 동명의 변수, 함수, 클래스 등이 충돌하지 않도록 구분해주는 역할을 하죠.
만약 script가 다른 script에서 import 되는 것이 아니라 terminal 등에서 곧장 호출될 때는 자동으로 namespace가 __main__
으로 정의됩니다.
그래서 곧장 실행되어 그 모듈의 namespace가 __main__
이라면 if 문 아래의 명령문만 실행되는 것입니다.
이와 같은 방법으로 모듈은 그 자체로 하나의 기능을 완전히 수행하면서, 동시에 필요한 함수를 다른 모듈에 제공할 수 있습니다.
언제든 함수들이 재활용될 가능성을 염두하여 main 함수를 만드는 습관을 들이는 것이 좋습니다. 꼭 이름이 'main'일 필요는 없지만요.