Skip to content

2.10. 내용정리: 10일차

흔한 찐따 edited this page Mar 24, 2022 · 3 revisions

모듈 (Module)

파이썬 공식 문서의 용어집에서는 다음과 같이 정의하고 있다.

  • 모듈이란, 파이썬 코드의 조직화 단위를 담당하는 객체이다.
  • 모듈은 임의의 파이썬 객체들을 담는 이름 공간(namespace) 을 갖는다.
    • 이름 공간(namespace)이란, 변수가 저장되는 장소를 의미한다.
    • 파이썬에서의 이름 공간은 딕셔너리(dict)로 구현되어 있다.
    • 객체에 중첩된 이름 공간(메서드에서) 뿐만 아니라 지역, 전역, 내장 이름 공간이 있다.
  • 모듈은 임포팅(importing) 절차에 의해 파이썬으로 로드된다.
    • 모듈을 불러올 때 import 키워드로 로드한다.

모듈의 개념

  • 모듈은 코드를 구조화하는 방법에 대한 생각에서 나온 개념이다.
  • 모듈을 검색해보면 "가장 첫 번째, 그리고 가장 맨 앞에 위치하는 구현의 단위" 등의 애매한 정의가 나온다.
  • 실질적으로 구현이 된 구현 단위와 산출물을 기준으로 삼는다.
  • 따라서, 모듈은 만들어진 산출물의 구현 단위라고 할 수 있다.

위의 내용을 쉽게 정리하여 말하자면 다음과 같다.

  • 모듈은 함수나 변수, 클래스들을 모아놓은 파이썬 파일이다.
    • 즉, 지금까지 .py 확장자로 만들었던 파이썬 파일들 모두 파이썬 모듈이다.
  • 모듈에는 지역, 전역, 내장 이름 공간이 존재한다.
    • 즉, 모듈에는 변수와 함수, 클래스의 효력 범위가 존재한다는 의미.
  • 즉, 모듈이란, 만들어진 산출물의 구현 단위를 의미한다.

컴포넌트(Component)

  • 컴포넌트란, 실행 중인 소프트웨어의 활동 단위를 의미한다.
  • 컴포넌트는 런타임 개체(즉, 프로그램이 동작하고 있는 중에 생성된 인스턴스 객체)를 참조하고 가시성이 없는 단위이다.
  • 실제로 운용 모델에서는 컴포넌트가 실행 가능한 바이너리 형식으로 전달된다고 한다.
    • 바이너리(Binary) 란, 0과 1의 집합을 의미한다.
  • 다시말해, 컴포넌트는 실행 중인 소프트웨어의 활동 단위라 할 수 있다.

모듈과 컴포넌트의 차이

  • 결론적으로, 모듈은 만들어진 산출물의 단위이며, 컴포넌트는 실행중인 소프트웨어의 활동 단위를 의미한다.
  • 클라이언트-서버(Client-Server) 시스템에서 하나의 서버가 10개의 클라이언트에게 정보를 제공할 경우를 보자.
  • 실행 중인 소프트웨어는 서버 1개, 클라어언트 10개로 컴포넌트는 11개라 할 수 있다.
  • 반면, 만들어진 산출물은 서버, 클라이언트 이렇게 2개라 할 수 있다.
  • 이렇듯, 컴포넌트와 모듈은 상하위 관계가 아닌 다른 개념이다.

모듈 만들기

  • 지금까지 해오던 것처럼 파이썬 예제들을 만들듯이 똑같이 .py 파일로 저장시키면 된다.
  • 그 다음 새로운 파이썬 파일에서 import 모듈명 으로 불러오면 된다.

예시

  • 먼저, test.py 라는 파이썬 파일을 생성한 후에 아래의 예시 코드와 같은 함수들을 정의한다.
    • 함수 add 는 매개 변수 xy 를 덧셈하는 함수이다.
    • 함수 sub 는 매개 변수 xy 를 뺄셈하는 함수이다.
  • 그 다음 test.py 를 저장한다.
# test.py

def add(x, y):
    return x + y

def sub(x, y):
    return x - y

import

import 키워드는 파이썬 모듈을 불러오는 키워드이다.

예시

  • test2.py 라는 또다른 파이썬 파일을 생성하고 다음과 같이 test.py 에서 구현한 함수 addsub 를 사용해본다.
  • 모듈에 구현되어 있는 함수나 클래스에 접근할 때 역시 접근 연산자 . 를 사용해서 호출한다.
# test2.py

# 이전에 생성한 'test' 모듈을 불러온다.
import test

# 'test' 모듈에 구현되어 있는 함수 'add'를 호출한다.
a = test.add(10, 20)
print(a)

# 'test' 모듈에 구현되어 있는 함수 'sub'를 호출한다.
b = test.sub(10, 20)
print(b)

from

  • 때로는 test.add , test.sub 처럼 쓰지 않고 add , sub 처럼 모듈 이름 없이 함수 이름만 쓰고 싶은 경우도 있을 것이다.
  • 이럴 때 사용하는 키워드가 바로 from 키워드이다.
  • 사용법은 from 모듈 이름 import 모듈 함수 이렇게 사용하면 된다.

예시

from 키워드로 불러오는 방법은 여러 방식이 존재한다.

  • 각각 add , sub 를 하나씩 불러오는 방식
# test3.py

from test import add
from test import sub

a = add(10, 20)
print(a)

b = sub(10, 20)
print(b)
  • 쉼표( , ) 기호를 통해 하나씩 불러오는 방식
# test4.py

from test import add, sub

a = add(10, 20)
print(a)

b = sub(10, 20)
print(b)
  • 별표( * ) 기호를 통해 모듈 내에 구현되어 있는 모든 것들을 한번에 불러오기
# test5.py

from test import *

a = add(10, 20)
print(a)

b = sub(10, 20)
print(b)

참고로 * 기호는 정규 표현식에서의 와일드카드 문자열이라고도 불리며, "모든 것(everythings)"을 의미한다. 정규 표현식이 뭔지는 아직 잘 모르기 때문에 나중에 더 공부를 해야겠다.

프로그램 진입점 if __name__ == "__main__":

의미

  • 모듈에는 이름 공간(namespace)이라는 개념이 존재한다고 상술하였다.
  • 이름 공간이 정의된 변수가 바로 __name__ 이다.
    • print(__name__) 코드를 실행해보면 해당 이름 공간이 출력된다.
  • if __name__ == "__main__": 이라는 것은 이름 공간이 __main__ 일 경우를 묻는 것이다.
  • 프로그래밍에서의 메인(main) 의 의미는 프로그램의 진입점, 실행되는 프로그램 그 자체를 뜻한다.
    • CJAVA 같은 경우, main 함수가 존재하는데, 이를 프로그램 진입점이라고 설명하고 있다.
  • 즉, if __name__ == "__main__": 의 의미는 모듈이 프로그램 진입점, 즉 실행되는 프로그램인 경우를 묻는 것을 의미한다.

예시와 설명

위의 test.py 의 코드를 아래와 같이 바꿔본다.

# test.py

def add(a, b): 
    return a+b

def sub(a, b): 
    return a-b

print(add(10, 20))
print(sub(10, 20))

그 뒤에 새로운 파이썬 파일 test6.py 를 만든 뒤에 아래의 코드를 작성한 후 실행해보면 아래와 같은 결과가 나온다.

#test6.py

import test

결과

30
-10

분명히 import 를 통해 모듈을 불러오기만 하는 코드임에도 불구하고 아래의 print 함수까지 전부 실행이 되어버린다.

이를 방지하기 위해 사용하는 것이 바로 if __name__ == "__main__": 구문을 추가하여 모듈이 실행되는 프로그램인지 여부를 판단한다.

# test.py

def add(a, b): 
    return a+b

def sub(a, b): 
    return a-b

if __name__ == "__main__":
    print(add(10, 20))
    print(sub(10, 20))

위와 같이 변경해주면 test.py 를 실행할 경우에만 아래의 if __name__ == "__main__": 구문이 실행된다.

흔한 찐따

안녕하세요, 흔한 찐따 입니다.

Clone this wiki locally