파이썬: 클래스, 모듈, 패키지

Ju_Nik_e·2023년 4월 26일

PYTHON

목록 보기
4/9

클래스

클래스가 필요한 이유

  • 동일한 함수의 결괏값을 여러개 저장해놓아야 할 경우 함수를 따로 만들어야 함.
  • 이를 하나의 클래스로 간편하게 사용가능

클래스와 객체

  • 과자 틀 -> 클래스(class), 설계 도면
  • 과자 -> 객체(object), 클래스로 만든 피조물

    객체마다 고유한 성격을 가지며, 각 객체가 변하더라도 다른 객체에는 아무 영향을 주지 않음

>>> class Cookie:
>>>    pass
>>> a = Cookie()
>>> b = Cookie()
  • Cookie : 클래스
  • a, b : 객체
  • 즉 Cookie라는 도면을 이용해 a,b라는 똑같은 객체를 생성한 것.
  • 이후에 a,b는 서로 영향을 미치지 않음

클래스 만들기

클래스 기본형태

class FourCal:
	def setdata(self, first, second):
    	self.first = first
        self.second = second
  • 위 예시처럼 클래스 안의 함수는 메서드(Method)라고 부름.
  • 메서드의 첫 번째 매개변수 self는 메서드를 호출한 객체 a가 자동으로 전달됨
  • 파이썬만의 특징으로 자바같은 언어는 self가 필요없음.
>>> a = FourCal()
>>> a.setdata(4, 2)

사칙연산 클래스 완성

>>> class FourCal:
...     def setdata(self, first, second):
...         self.first = first
...         self.second = second
...     def add(self):
...         result = self.first + self.second
...         return result
...     def mul(self):
...         result = self.first * self.second
...         return result
...     def sub(self):
...         result = self.first - self.second
...         return result
...     def div(self):
...         result = self.first / self.second
...         return result
  • 위와 같이 클래스를 만들고 아래와 같이 2가지 객체를 생성 후 값을 비교하면 서로 영향을 미치지 않는다는 것을 알 수 있음
>>> a = FourCal()
>>> b = FourCal()
>>> a.setdata(4, 2)
>>> b.setdata(3, 8)
>>> a.add()
6
>>> a.mul()
8
>>> a.sub()
2
>>> a.div()
2
>>> b.add()
11
>>> b.mul()
24
>>> b.sub()
-5
>>> b.div()
0.375

생성자(Constructor)

객체가 생성될 때 자동으로 호출되는 메서드

  • 위에서 생성한 클래스에 setdata 메서드를 수행하지 않고 다른 메서드를 수행하면 에러가 발생함
  • 객체에 first, second와 같은 초깃값을 설정해야 할 필요가 있을 때는 setdata와 같은 메서드를 호출하여 초깃값을 설정하기보다는 생성자를 구현하는 것이 안전한 방법임

생성자 추가 방법

  • __init__을 사용하면 해당 메서드는 생성자가 됨

예시

>>> class FourCal:
...     def __init__(self, first, second):
...         self.first = first
...         self.second = second
...     def add(self):
...         result = self.first + self.second
...         return result
...     def mul(self):
...         result = self.first * self.second
...         return result
...     def sub(self):
...         result = self.first - self.second
...         return result
...     def div(self):
...         result = self.first / self.second
...         return result
...
>>> a = FourCal(4, 2)
>>> a.first
4
>>> a.second
2
>>> a = FourCal(4, 2)
>>> a.add()
6
>>> a.div()
2.0

클래스의 상속

  • 어떤 클래스에 다른 클래스의 기능을 물려받게 하는 것

    class 클래스이름(상속할 클래스 이름)

예시

>>> class MoreFourCal(FourCal):
...     def pow(self):
...         result = self.first ** self.second
...         return result
>>> a = MoreFourCal(4, 2)
>>> a.add()
6
>>> a.mul()
8
>>> a.sub()
2
>>> a.div()
2
>>> a.pow()
16

상속을 사용하는 이유

  • 기존 클래스를 변경하지 않고 기능을 추가
  • 기존 기능을 변경
  • 클래스가 라이브러리 형태로 제공되거나 수정이 허용되지 않는 상황에서 사용

메서드 오버라이딩

  • 부모 클래스에 있는 메서드를 동일한 이름으로 다시 만드는 것
  • 부모클래스 메서드 대신 오버라이딩한 메서드가 호출됨

클래스 변수

  • 클래스 안에서 만든 변수는 만든 모든 객체에 공유 됨
>>> class Family:
...     lastname = "김"
>>> Family.lastname
김
>>> a = Family()
>>> b = Family()
>>> Family.lastname = "박"
>>> a.lastname
박
>>> b.lastname
박
  • 객체에서 lastname을 변경하면 해당 객체에서만 변경됨
>>> a.lastname = "최"
>>> a.lastname
최
>>> Family.lastname
박
>>> b.lastname
박

모듈

  • 함수, 변수 혹은 클래스를 모아 놓은 파이썬 파일
  • 다른 파이썬 프로그램에서 불러와 사용할 수 있게끔 만든 파이썬 파일

모듈 만들기

파이썬 확장자(.py)로 만든 파일은 모두 모듈로 사용가능

  • .py는 생략하고 모듈(파이썬 파일)이름만 써야함
import 모듈이름
  • 모듈에서 특정 함수만 쓰고 싶을 경우 아래와 같이 사용
from 모듈이름 import 함수이름, 함수이름

if __name__ == "__main__":

  • 아래와 같은 모듈이 있을 때 import를 하면 print문까지 바로 실행됨
# mod1.py 
def add(a, b): 
    return a+b

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

print(add(1, 4))javascript:page(30)
print(sub(4, 2))
C:\doit>python mod1.py
5
2
  • 이를 방지하려면 모듈을 아래와 같이 수정해야 함.
# mod1.py 
def add(a, b): 
    return a+b

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

if __name__ == "__main__":
    print(add(1, 4))
    print(sub(4, 2))
  • 직접 이 파일을 실행했을 때는 __name__ == "__main__"이 참이 되어 if문 다음 문장이 수행된다. 반대로 대화형 인터프리터나 다른 파일에서 이 모듈을 불러서 사용할 때는 __name__ == "__main__"이 거짓이 되어 if문 다음 문장이 수행되지 않는다.

__name__변수

  • 파이썬이 내부적으로 사용하는 특별한 변수 이름
  • 직접 해당 파일을 실행할 경우 __name__변수에는 "__main__" 이 저장됨
  • 다른 곳에서 import할 경우 __name__변수에는 해당 모듈 이름이 저장됨
>>> import mod1
>>> mod1.__name__
'mod1'

클래스나 변수를 포함하는 모듈

  • 클래스나 변수 등도 아래와 같이 사용가능
# mod2.py 
PI = 3.141592

class Math: 
    def solv(self, r): 
        return PI * (r ** 2) 

def add(a, b): 
    return a+b 
>>> import mod2
>>> print(mod2.PI)
3.141592
>>> a = mod2.Math()
>>> print(a.solv(2))
12.566368
>>> print(mod2.add(mod2.PI, 4.4))
7.541592

패키지

  • 도트(.)를 사용하여 파이썬 모듈을 계층적(디렉터리 구조)로 관리할 수 있게 해줌
  • 디렉터리와 파이썬 모듈로 이루어짐
game/
    __init__.py
    sound/
        __init__.py
        echo.py
        wav.py
    graphic/
        __init__.py
        screen.py
        render.py
    play/
        __init__.py
        run.py
        test.py

__init__.py의 용도

  • 해당 디렉터리가 패키지의 일부임을 알려주는 역할
  • 위 예시에서 game, sound, graphic 등 패키지에 포함된 디렉터리에 __init__.py파일이 없다면 패키지로 인식되지 ㅇ낳음

0개의 댓글