이전 포스트에서 객체지향 프로그래밍(OOP)이 무엇인지, 객체와 클래스가 무엇인지에 대해 살펴보았다. 아직 이 개념들에 대한 이해가 잘 서지 않는다면 우선 아래 포스트를 읽고 돌아오는 것을 추천한다.
이제 실제로 파이썬에서는 어떻게 이런 객체지향 프로그래밍을 구현할 수 있는지를 차례차례 알아보도록 하자.
클래스 작성하기
클래스 정의하기
클래스는 객체의 형태를 정의하는 틀(template)이라고 했다. 파이썬에서 클래스를 정의하고 객체를 생성하는 기본적인 방법은 다음과 같다.
클래스 안에는 객체의 상태를 나타내는 인스턴스 변수와, 객체의 동작을 나타내는 메서드를 정의한다. 이들은 클래스의 멤버(member)라고 부른다. 파이썬에서는 인스턴스 변수를 생성하려면 메서드 안에서 self.을 붙인 변수에 값을 할당하면 된다.
예제로 Counter라는 클래스를 작성해보자. 숫자를 세는 계수기를 하나의 객체라는 관점에서 보았을 때 상태가 있고 동작이 있다.
- 상태: 숫자
- 동작: 초기화하기, 1만큼 숫자 더하기, 현재 숫자 받아오기
자, 상태와 동작을 정리해두었으니 이제 클래스를 작성할 준비는 완료이다.
class Counter: # 1. 클래스 정의
# 2. 메서드 정의
def reset(self): # 3. self 변수
self.count = 0 # 4. 인스턴스 변수 사용
def increment(self):
self.count += 1
def get(self):
return self.count
- 클래스를 정의할 때는 키워드 class를 클래스의 이름 앞에 붙인다. 클래스 이름은 관습적으로 대문자로 시작한다.
- 클래스 안에는 메서드와 인스턴스 변수를 정의할 수 있는데, 여기서는 reset(), incremnet(), get() 세 개의 메서드를 정의했다.
- self 변수는 자기 자신을 가리키며 모든 메서드의 첫 번째 매개변수로 들어간다. 자기 자신이라는 의미는 이 클래스를 통해 생성되는 인스턴스를 말한다.
- self.변수와 같은 방식으로 클래스 내에서 인스턴스 변수에 접근할 수 있다.
객체 생성하기
Counter 클래스가 정의되었으니 이제 Counter 객체를 생성해 보자. 붕어빵 틀이 만들어졌으니 이제 붕어빵을 구워보자는 얘기다.
클래스 이름에 ()를 붙여 함수처럼 호출하면 객체가 생성되어 반환된다.
c = Counter()
메서드 호출하기
이제 객체를 통해 메서드를 호출해보자. 객체를 사용하기 전에는 reset()을 먼저 호출해야 인스턴스 변수가 생성된다. 각 줄마다 어떤 일이 일어나는지에 대한 설명은 주석으로 달아놓았다.
c = Counter() # 객체가 생성되어 객체의 참조값을 변수 c에 저장
c.reset() # 인스턴스 변수 count가 생성되고 0으로 초기화
c.increment() # count 값이 1만큼 증가
print("카운터 c의 값은", a.get()) # "카운터 c의 값은 1" 출력
이렇게 한번 클래스를 잘 정의해 두면 간단하게 객체를 생성할 수 있다.
c = Counter()
d = Counter()
c.reset()
d.reset()
생성자
위에서 만든 Counter 클래스로 생성한 객체들은 항상 reset()을 호출하여 카운터를 초기화해주고 있다. 하지만 생성자를 사용하면 객체가 생성될 때 자동으로 초기화가 되기 때문에 매번 reset()을 호출하지 않아도 된다. 생성자(constructor)는 객체가 생성될 때 객체를 기본값으로 초기화하는 특수한 메서드이며, 이곳에서 인스턴스 변수가 생성된다. 객체가 생성될 때 생성자는 자동으로 호출된다.
위의 예제에서 카운터 객체를 생성하며 클래스 이름 Counter과 동일한 메서드를 호출했는데, 이것이 생성자이다.
c = Counter()
생성자는 초기화 작업을 마치고 객체의 참조값을 반환한다. 이 값이 c 변수에 저장된 것이다.
파이썬에서는 생성자의 이름으로 __init__()을 사용한다. 초기화한다는 의미의 initialize의 앞 네 글자이다.
class Counter:
def __init__(self): # 생성자
self.count = 0 # count를 0으로 초기화
def reset(self):
self.count = 0
def increment(self):
self.count += 1
def get(self):
return self.count
파이썬에서는 클래스 당 하나의 생성자만을 허용하는데, 매개변수에 기본값을 전달해줄 수도 있다.
# 생성자가 전달한 값으로 count값을 초기화
# 생성자가 값을 전달하지 않으면 initValue는 0
def __init__(self, initValue = 0):
self.count = initValue
c = Counter(100) # counter: 100으로 초기화
d = Counter() # counter: 0으로 초기화
정리
파이썬에서 클래스를 생성하고 객체를 생성하는 방식과 생성자의 개념에 대해 알아보았다. 파이썬 뿐만이 아니라 다른 언어에서도 유사한 방식으로 객체지향을 구현하기 때문에 이번 포스트에서 다룬 내용들을 꼭 이해하고 넘어가자.
그럼 20000
'Language > Python' 카테고리의 다른 글
[Python] 파이썬 클래스 변수 이해하기 (클래스 변수 vs 인스턴스 변수) (0) | 2025.01.22 |
---|---|
[Python] 파이썬 정보 은닉 개념 이해하기 (0) | 2025.01.21 |
[Python] 객체지향 프로그래밍(OOP) 이해하기 (1) | 2025.01.20 |
[Python] 파이썬의 언패킹 연산자 (0) | 2025.01.20 |
[Python] 파이썬 딕셔너리(dictionary) 이해하기 (0) | 2025.01.18 |