-
Notifications
You must be signed in to change notification settings - Fork 1
2.10. 내용정리: 10일차
흔한 찐따 edited this page Mar 24, 2022
·
3 revisions
파이썬 공식 문서의 용어집에서는 다음과 같이 정의하고 있다.
- 모듈이란, 파이썬 코드의 조직화 단위를 담당하는 객체이다.
- 모듈은 임의의 파이썬 객체들을 담는 이름 공간(namespace) 을 갖는다.
- 이름 공간(namespace)이란, 변수가 저장되는 장소를 의미한다.
- 파이썬에서의 이름 공간은 딕셔너리(dict)로 구현되어 있다.
- 객체에 중첩된 이름 공간(메서드에서) 뿐만 아니라 지역, 전역, 내장 이름 공간이 있다.
- 모듈은 임포팅(importing) 절차에 의해 파이썬으로 로드된다.
- 모듈을 불러올 때
import키워드로 로드한다.
- 모듈을 불러올 때
- 모듈은 코드를 구조화하는 방법에 대한 생각에서 나온 개념이다.
- 모듈을 검색해보면 "가장 첫 번째, 그리고 가장 맨 앞에 위치하는 구현의 단위" 등의 애매한 정의가 나온다.
- 실질적으로 구현이 된 구현 단위와 산출물을 기준으로 삼는다.
- 따라서, 모듈은 만들어진 산출물의 구현 단위라고 할 수 있다.
위의 내용을 쉽게 정리하여 말하자면 다음과 같다.
- 모듈은 함수나 변수, 클래스들을 모아놓은 파이썬 파일이다.
- 즉, 지금까지
.py확장자로 만들었던 파이썬 파일들 모두 파이썬 모듈이다.
- 즉, 지금까지
- 모듈에는 지역, 전역, 내장 이름 공간이 존재한다.
- 즉, 모듈에는 변수와 함수, 클래스의 효력 범위가 존재한다는 의미.
- 즉, 모듈이란, 만들어진 산출물의 구현 단위를 의미한다.
- 컴포넌트란, 실행 중인 소프트웨어의 활동 단위를 의미한다.
- 컴포넌트는 런타임 개체(즉, 프로그램이 동작하고 있는 중에 생성된 인스턴스 객체)를 참조하고 가시성이 없는 단위이다.
- 실제로 운용 모델에서는 컴포넌트가 실행 가능한 바이너리 형식으로 전달된다고 한다.
- 바이너리(Binary) 란, 0과 1의 집합을 의미한다.
- 다시말해, 컴포넌트는 실행 중인 소프트웨어의 활동 단위라 할 수 있다.
- 결론적으로, 모듈은 만들어진 산출물의 단위이며, 컴포넌트는 실행중인 소프트웨어의 활동 단위를 의미한다.
- 클라이언트-서버(Client-Server) 시스템에서 하나의 서버가 10개의 클라이언트에게 정보를 제공할 경우를 보자.
- 실행 중인 소프트웨어는 서버 1개, 클라어언트 10개로 컴포넌트는 11개라 할 수 있다.
- 반면, 만들어진 산출물은 서버, 클라이언트 이렇게 2개라 할 수 있다.
- 이렇듯, 컴포넌트와 모듈은 상하위 관계가 아닌 다른 개념이다.
- 지금까지 해오던 것처럼 파이썬 예제들을 만들듯이 똑같이
.py파일로 저장시키면 된다. - 그 다음 새로운 파이썬 파일에서
import 모듈명으로 불러오면 된다.
- 먼저,
test.py라는 파이썬 파일을 생성한 후에 아래의 예시 코드와 같은 함수들을 정의한다.- 함수
add는 매개 변수x와y를 덧셈하는 함수이다. - 함수
sub는 매개 변수x와y를 뺄셈하는 함수이다.
- 함수
- 그 다음
test.py를 저장한다.
# test.py
def add(x, y):
return x + y
def sub(x, y):
return x - yimport 키워드는 파이썬 모듈을 불러오는 키워드이다.
-
test2.py라는 또다른 파이썬 파일을 생성하고 다음과 같이test.py에서 구현한 함수add와sub를 사용해본다. - 모듈에 구현되어 있는 함수나 클래스에 접근할 때 역시 접근 연산자
.를 사용해서 호출한다.
# test2.py
# 이전에 생성한 'test' 모듈을 불러온다.
import test
# 'test' 모듈에 구현되어 있는 함수 'add'를 호출한다.
a = test.add(10, 20)
print(a)
# 'test' 모듈에 구현되어 있는 함수 'sub'를 호출한다.
b = test.sub(10, 20)
print(b)- 때로는
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)"을 의미한다. 정규 표현식이 뭔지는 아직 잘 모르기 때문에 나중에 더 공부를 해야겠다.
- 모듈에는 이름 공간(namespace)이라는 개념이 존재한다고 상술하였다.
- 이름 공간이 정의된 변수가 바로
__name__이다.-
print(__name__)코드를 실행해보면 해당 이름 공간이 출력된다.
-
-
if __name__ == "__main__":이라는 것은 이름 공간이__main__일 경우를 묻는 것이다. - 프로그래밍에서의 메인(main) 의 의미는 프로그램의 진입점, 실행되는 프로그램 그 자체를 뜻한다.
-
C나JAVA같은 경우,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__": 구문이 실행된다.