클래스, 모듈, 패키지

이상우·2021년 8월 9일
0
post-thumbnail

파이썬을 배우는데 있어서 가장 생소했고, 강의를 듣는데도 이해를 하지 못했다. 생성자는 무엇이고, 객체를 생성하고 그것이 어떻게 상호작용하는지. 그래서 제일 심도있게 공부한 파트이다.

클래스와 객체

image.png
점프 투 파이썬에서는 클래스와 객체를 과자 틀과 과자로 예를 들었다.

  • 과자 틀->클래스(class)
  • 과자 틀에 의해서 만들어진 과자 -> 객체(object)

클래스(class)란 똑같은 무엇인가를 계속해서 만들어 낼 수 있는 설계 도면이고(과자 틀), 객체(object)란 클래스로 만든 피조물(과자 틀을 사용해 만든 과자)을 뜻한다.

코드로 예를 들자면,

>> class Cookie:
>>    pass

위의 클래스는 아무 기능도 갖고 있지 않은 클래스이다. 하지만 이런 클래스도 객체를 생성하는 기능이 있다.

객체는 클래스로 만들며 하나의 클래스는 무수히 많은 객체를 만들어 낼 수 있다. 아래와 같이 a, b가 Cookie클래스로 만든 객체이다.

>> a = Cookie()
>> b = Cookie()

객체와 인스턴스의 차이

클래스로 만든 객체를 인스턴스라고도 한다. 그렇다면 객체와 인스턴스의 차이는 무엇일까? 이렇게 생각해 보자. a = Cookie() 이렇게 만든 a는 객체이다. 그리고 a 객체는 Cookie의 인스턴스이다. 즉 인스턴스라는 말은 특정 객체(a)가 어떤 클래스(Cookie)의 객체인지를 관계 위주로 설명할 때 사용한다. "a는 인스턴스"보다는 "a는 객체"라는 표현이 어울리며 "a는 Cookie의 객체"보다는 "a는 Cookie의 인스턴스"라는 표현이 훨씬 잘 어울린다.

또하나의 클래스를 보자.

>> class FourCal:
...     def setdata(self, first, second): # 메서드의 매개변수
...         self.first = first            # 메서드의 수행문
...         self.second = second          # 메서드의 수행문
...
>>

앞에서 만든 FourCal 클래스에서 pass 문장을 삭제하고 그 대신 setdata 함수를 만들었다. 클래스 안에 구현된 함수는 다른 말로 메서드(Method)라고 부른다.
메소드(Method)

  • 메소드는 함수와 비슷하다.
  • 클래스에 묶여서 클래스의 인스턴스와 관계되는 일을 하는 함수

setdata 메서드에는 self, first, second 총 3개의 매개변수가 필요한데 실제로는 a.setdata(4, 2)처럼 2개 값만 전달했다. 왜냐하면 a.setdata(4, 2)처럼 호출하면 setdata 메서드의 첫 번째 매개변수 self에는 setdata메서드를 호출한 객체 a가 자동으로 전달되기 때문이다. 다음 그림을 보면 객체를 호출할 때 입력한 값이 메서드에 어떻게 전달되는지 쉽게 이해할 수 있을 것이다.

파이썬 메서드의 첫 번째 매개변수 이름은 관례적으로 self를 사용한다. 객체를 호출할 때 호출한 객체 자신이 전달되기 때문에 self를 사용한 것이다. 물론 self말고 다른 이름을 사용해도 상관없다.

생성자란?

일반적으로 함수는 사용자가 함수이름( )과 같은 형태로 호출해야 코드가 수행된다. 이와 달리 클래스 내에서 특별한 이름(init)을 갖기만 하면 객체가 생성될 때 자동으로 호출되는 함수가 있는 이를 생성자라고 한다.

class Person:
    def __init__(self):
        print("태어남..")
p = Person()

위 코드를 수행하면 문자열이 출력되는데 이는 객체가 생성될 때 자동으로 생성자인 init( ) 이 호출됐기 때문이다. 이처럼 생성자는 객체가 생성될 때 자동으로 호출되기 때문에 객체를 초기화하거나 초깃값을 설정하는데 유용하게 사용된다.

클래스의 상속

상속(Inheritance)이란 "물려받다"라는 뜻으로, "재산을 상속받다"라고 할 때의 상속과 같은 의미이다. 클래스에도 이 개념을 적용할 수 있다. 어떤 클래스를 만들 때 다른 클래스의 기능을 물려받을 수 있게 만드는 것이다.

상속하는 이유

보통 상속은 기존 클래스를 변경하지 않고 기능을 추가하거나 기존 기능을 변경하려고 할 때 사용한다.

"클래스에 기능을 추가하고 싶으면 기존 클래스를 수정하면 되는데 왜 굳이 상속을 받아서 처리해야 하지?" 라는 의문이 들 수도 있다. 하지만 기존 클래스가 라이브러리 형태로 제공되거나 수정이 허용되지 않는 상황이라면 상속을 사용해야 한다.

메서드 오버라이딩(Overriding, 덮어쓰기)

부모 클래스(상속한 클래스)에 있는 메서드를 동일한 이름으로 다시 만드는 것. 이렇게 메서드를 오버라이딩하면 부모클래스의 메서드 대신 오버라이딩한 메서드가 호출된다.

모듈

모듈이란 함수나 변수 또는 클래스를 모아 놓은 파일이다. 모듈은 다른 파이썬 프로그램에서 불러와 사용할 수 있게끔 만든 파이썬 파일이라고도 할 수 있다. 다른 사람들이 만들어 놓은 모듈을 사용할 수도, 직접 만들어서 사용할 수도 있다.

#mod1.py
def add(a, b):
    return a + b
def sub(a, b): 
    return a-b

위와 같이 add와 sub 함수만 있는 파일 mod1.py를 만들고 C:\doit 디렉터리에 저장하자. 이 mod1.py 파일이 바로 모듈이다. 지금까지 에디터로 만들어 온 파일과 다르지 않다.

※ 파이썬 확장자 .py로 만든 파이썬 파일은 모두 모듈이다

모듈 사용 방법

import 모듈이름
import는 이미 만들어 놓은 파이썬 모듈을 사용할 수 있게 해주는 명령어이다.
※ import는 현재 디렉터리에 있는 파일이나 파이썬 라이브러리가 저장된 디렉터리에 있는 모듈만 불러올 수 있다. 파이썬 라이브러리는 파이썬을 설치할 때 자동으로 설치되는 파이썬 모듈을 말한다.

from 모듈이름 import 모듈함수

  • from mod1 import add, sub
    첫 번째 방법은 위와 같이 from 모듈 이름 import 모듈 함수1, 모듈 함수2처럼 사용하는 것이다. 콤마로 구분하여 필요한 함수를 불러올 수 있다.
    = from mod1 import
    두 번째 방법은 위와 같이
    문자를 사용하는 방법이다. 07장에서 배울 정규 표현식에서 문자는 "모든 것"이라는 뜻인데 파이썬에서도 마찬가지 의미로 사용한다. 따라서 from mod1 import 는 mod1.py의 모든 함수를 불러서 사용하겠다는 뜻이다.

if name == "main": 의 의미

improt을 할 mod1.py

#mod1.py 
def add(a, b): 
    return a+b
def sub(a, b): 
    return a-b
print(add(1, 4))
print(sub(4, 2))

import mod1을 수행하면 mod1.py가 실행이 되어 결과값을 출력한다.

#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))


if __name__ == "__main__"을 사용하면 C:\doit>python mod1.py처럼 직접 이 파일을 실행했을 때는 __name__ == "__main__"이 참이 되어 if문 다음 문장이 수행된다. 반대로 대화형 인터프리터나 다른 파일에서 이 모듈을 불러서 사용할 때는 __name__ == "__main__"이 거짓이 되어 if문 다음 문장이 수행되지 않는다.

# 패키지
패키지란 무엇인가?
**패키지(Packages)**는 도트(.)를 사용하여 **파이썬 모듈을 계층적(디렉터리 구조)으로 관리**할 수 있게 해준다. 예를 들어 모듈 이름이 A.B인 경우에 A는 패키지 이름이 되고 B는 A 패키지의 B모듈이 된다.

> ※ 파이썬에서 모듈은 하나의 .py 파일이다.

파이썬 패키지는 디렉터리와 파이썬 모듈로 이루어지며 구조는 다음과 같다.

**가상의 game 패키지 예**

>```python
game/
    __init__.py
    sound/
        __init__.py
        echo.py
        wav.py
    graphic/
        __init__.py
        screen.py
        render.py
    play/
        __init__.py
        run.py
        test.py

game, sound, graphic, play는 디렉터리이고 확장자가 .py인 파일은 파이썬 모듈이다. game 디렉터리가 이 패키지의 루트 디렉터리이고 sound, graphic, play는 서브 디렉터리이다.

init.py 파일은 조금 특이한 용도로 사용하는데 뒤에서 자세하게 다룰 것이다.

간단한 파이썬 프로그램이 아니라면 이렇게 패키지 구조로 파이썬 프로그램을 만드는 것이 공동 작업이나 유지 보수 등 여러 면에서 유리하다. 또한 패키지 구조로 모듈을 만들면 다른 모듈과 이름이 겹치더라도 더 안전하게 사용할 수 있다.

느낀점

  1. 클래스를 잘짠다면, 대형 프로그래밍에서 효율적인 코딩을 할 수 있다. 그러므로 필요한 요소를 클래스화할 수 있어야 한다.
  2. 파이썬은 함수 성격이 강한 언어인줄 알았지만, 이렇게 클래스를 사용할 수 있었는지 몰랐다.

참고 사이트

https://wikidocs.net/28 - 점프 투 파이썬/5장 파이썬 날개달기
https://programmers.co.kr/learn/courses/2/lessons/325 - 메소드 이해하기

profile
구상한것을 구현할 수 있는 개발자가 되고 싶습니다.

0개의 댓글