본문 바로가기
python

python - 모듈(modules)란?

by orangecode 2022. 4. 27.
728x90

 

module 모듈이란?

모듈 module란 함수나 변수 또는 클래스를 모아 놓은 파일을 말한다.

module은 다른 파이썬 프로그램에서 불러와 사용할 수 있게끔 만든 파이썬 파일이라고 할 수 있다.

 

복잡도를 낮추는 편리하고 중요한 기능으로,

 

연관되어 있는 것들을 하나의 이름으로 묶음으로써 복잡한 상황의 복잡도를 낮춰주는 걸 모듈(module)이라 한다.

 

 

다른 사람들이 이미 만들어 놓은 모듈을 사용하거나, 모듈을 직접 만들어서 사용할 수도 있다.

 

 

내장 모듈

## 내장모듈
import math  # math라는 이름의 모듈을 가져온다.
math.ceil(2.6) # 올림 : 2.6보다 큰 정수를 가져옴
math.floor(2.7) # 내림 : 2.7보다 작은 정수를 가져옴
math.sqrt(16) # 루트 : 16의 루트 값을 가져옴

math라는 python 내장 모듈을 가져온다.

 

ceil(올림), floor(내림), sqrt(루트)math라는 module에 포함되어있는 함수들이다.

 

 

모듈이 없을 때 & 모듈이 있을 때
## 모듈이 없을 때

def kim_a():
    return 'a'

# 매우 많은 코드
#~~~
# 매우 많은 코드

def lala_a():
    return 'B'  # 뒤에 정의된 a()값으로 정의되어 a()의 결과값이 바뀜
                # 프로젝트 복잡도 상승 -> solution?? 정리정돈/이름변형 -> 중복/덮어쓰기 문제 해결


# 매우 많은 코드

print(lala_a())

모듈이 없을 때나 코드가 매우 많을 때, 함수의 중복/이름겹침 등의 문제가 발생할 수 있다.

 

프로젝트 복잡도를 낮추고 문제를 예방하기 위해

 

정리정돈 / 이름변형의 방법으로 예방할 수 있다.

 

하지만 이름을 변형만하게되면 지저분하고 알아보기 힘든 코드로 바뀔 수 있다.

 

 

2가지 입장에서의 해결방법? 

 1) 주어진 프로그래밍 언어를 이용하는 사람 : 이름변형으로 충돌 회피

 

 2) 프로그래밍 언어 자체를 제작 : 근본적인 대책이 필요 -> module

 

 

모듈의 도입 

modules.py

from egoing import a  # modules_egoing라는 모듈로부터 a라는 함수를 import 한다.
import k8800 # modules_egoing, k8800이라는 py 파일을 찾음

print(egoing.a())
print(egoing.b())
print(k8800.a())

from egoing import a

: egoing.py에서 만든 모듈에서 함수 a()를 import 한다.

 

import k8800 

: k8800.py라는 파일을 찾고 import 한다.

 

print(egoing.a()) : egoing.py에서 a() 함수의 결과값을 print 한다.

print(egoing.b()) : egoing.py에서 b() 함수의 결과값을 print 한다.

 

print(k8800.a()) : k8800.py에서 만든 a()함수의 결과값을 print 한다.

 

 

egoing.py

def a():
    return 'a'
def b():
    return 'b'
def c():
    return 'c'

egoing.py 파일 안에는 함수(def) a(), b(), c() 3개의 함수가 있다.

 

각자 함수는 각자 다른 결과값을 반환한다.

a() = 'a' 

b() = 'b' 

c() = 'c'

 

 

k8800.py

def a():
    return 'B'

k8800.py 파일 안에는 함수(def) a()가 있다.

 

k8800.py의 함수 a()는 'B'라는 결과값을 반환한다.

 

로그인 애플리케이션

auth_modules.py : auth.py의 login() 모듈을 불러와 실행

 

auth.py : login 모듈

 

auth_modules.py

import auth
input_id = input("아이디를 입력하세요. \n")

if auth.login(input_id):
    print('Hello' + input_id)
else:
    print('who are you?')

import auth : auth.py을 불러온다.

 

input_id : 아이디를 입력한다.

 

if auth.login(input_id):  # login 모듈에서 member = input_id가 일치한다면, ['Hello' + input_id]를 print 한다.

    print('Hello' + input_id)  

else:

    print('who are you?') # login 모듈에서 member = input_id가 불일치한다면, [who are you?]를 print 한다.

### login module
def login(_id):
    members = ['kim', 'gong', 'lee']
    for member in members:
        if member == _id:
            return True
    return False

login 모듈

    members = ['kim', 'gong', 'lee'] # members list를 가지고 있다.

    for member in members:  # members의 member를 반복한다.

        if member == _id # 멤버와 입력 id가 같다면

            return True # True 값을 리턴한다.

    return False  # for ~ in 반복문이 다 돌때까지 True 값이 없다면 False를 반환한다.

 

__name__ = "__main__"
# mod1.py
# 곱하기
def multiply(a,b):
    return a*b

# 빼기
def subtract(a,b):
    return a-b

print(multiply(5, 4))
print(subtract(6, 4))

 

곱하기, 빼기 기능이 있는 함수를 사용하기 위해 import mod1을 수행하면

함수만 입력되는 게 아닌, 결과값까지 출력한다.

 

위와 같은 상황을 예방하기 위해 if __name__ = "__main__"을 사용한다.

 

if __name__ = "__main__"을 사용하면 

 

C:\Users> python mod1.py처럼 직접 파일을 실행할 경우,

__name__ = "__main__"이 참이 되어 if문 다음 문장을 수행한다.

 

대화형 인터프리터, 다른 파일에서 import 등 모듈을 불러서 사용할 경우,

__name__ = "__main__"이 거짓이 되어 if문 다음 문장을 수행하지 않는다.

 

 

※ __name__변수란?

__name__ 변수는 python에서 내부적으로 사용되는 특별한 변수의 이름이다.

python mod1.py 처럼 직접 mod1.py파일을 실행하면, __name__ 변수에 __main__값이 저장된다.

 

하지만 python shell이나 다른 python module에서 import 할 경우, 

mod1.py의 __name__변수에는 mod1.py의 모듈이름 값인 mod1이 저장되게 된다.

 

반응형

댓글