파이썬은 객체 지향(object-oriented) 프로그래밍 언어로 모든 것이 객체로 구성된다. class는 이러한 객체를 만드는 틀이라고 볼 수 있다. class는 데이터와 특정 행동을 모두 포함(encapsulate)하는데 이것은 함수만 사용하는 것에 비해 재사용성이 좋고, 현실의 많은 것들은 데이터와 기능이 함께 존재하기에 현실을 더 현실스럽게 모델링할 수 있다.
built-in data type인 int, string 등도 모두 class다. 우리가 필요한 새로운 class를 만든다는 것은 새로운 type을 만든다는 것과 동일한 의미이다. 이러한 설명은 초보자에게 와닿지 않는 것을 알고있다. 모델링 관점에서 class를 이해하면 비슷한 성질과 행동을 하는 객체에 대한 설계도 정도로 이해하고 넘어가자.
이번 포스팅에서 두가지 class 예시를 통해 python에서 데이터(attribute)와 함수(method)를 포함해 class를 선언하는 방법과 class로부터 객체를 생성하는 방법에 대해 설명한다.
Person Class
class Person: #1
def __init__(self, name, age): #2
self.name = name #3
self.age = age
def say_hello(self): #4
print(f"Hello, my name is {self.name} and I'm {self.age} years old.") #5
class는 class
키워드위에 클래스명을 입력하는 것으로 선언된다. #1위의 예시에서는 Person
이라는 class가 선언되어 사람을 모델링한다. #2__init__
은 class로부터 객체가 생성될 때 초기화되는 함수이고, 입력으로 받을 대상을 __init__
method의 parameter로 정의한다. class에서 method를 정의할 때 (#2, #4) 첫번째 paramter self
는 class 자신을 가리키는 변수로 항상 입력해 주어야한다. 따라서 method의 입력되는 내용은 두 번째 파라미터부터다.
3) 부분은 객체 외부에서 입력된 name
과 age
를 객체의 attribute로 할당하는 부분이다. self.
이 붙은 변수들은 모두 attribute가 되고 class의 모든 mehtod에서 접근 가능하다. #5를 보면 다른 method에서 __init__
에서 정의된 self.name
과 self.age
에 접근할 수 있는 것을 확인할 수 있다.
여기서 프로그래머가 관심있는 사람의 특징은 class의 attribute인 '이름'과 '나이', 수행 시키고자 하는 행동은 인사
다. 이 class를 어떻게 사용하는 방법은 다음과 같다.
p = Person("LHC", 30)
print(p.name) # output : LHC
print(p.age) # output : 30
p.say_hello() # output : Hello, my name is LHC and I'm 30 years old.
이름과 나이를 입력으로 넣어 클래스를 초기화하고, 실현된 객체를 p에 할당한다. p 객체 내부의 attribute와 method는 p.
으로 접근이 가능하다. 2번, 3번 라인에서 attribute 값에 직접 접근하는 것을, 마지막 라인에서 method에 접근해 인사말을 출력하는 것을 볼 수 있다.
BankAccount
다른 예시로 은행 계좌에 입출금하는 것을 모델링할 수 있는 class를 보자.
class BankAccount:
def __init__(self, initial_balance):
self.__balance = initial_balance
def deposit(self, amount):
self.__balance += amount
def withdraw(self, amount):
if amount <= self.__balance:
self.__balance -= amount
else:
print("Insufficient balance")
def get_balance(self):
return self.__balance
은행 잔고와 같이 외부에서 접근하는 것을 막아야하는 데이터나 행동이 있을 수 있다. 이때는 attribute명을 __
(double underbar, dunder라고 부름) 붙여주면 name magling이라는 과정을 거쳐 위에서 name이나 age에 접근하는 방식으로는 데이터를 조작할 수 없도록 만든다. 이러한 종류의 attribute나 method를 private하다고 한다. 위의 예에서 잔고(__balance
)가 private attribute이다.
acct = BankAccount(1000)
print(acct.get_balance()) # Output: 1000
acct.deposit(500)
print(acct.get_balance()) # Output: 1500
acct.withdraw(200)
print(acct.get_balance()) # Output: 1300
acct.__balance = 10**9
acct에 1000원을 넣어 계좌를 개설하고 500원을 입금, 200원을 출금하는 과정을 보여준다. 마지막에 내 은행 계좌 데이터(__balance
)를 조작해 10억원으로 수정하려고 시도하면 실패를 하고만다.
결론
python의 class는 코드를 모듈화해 유지 보수성과 재사용성을 향상시킬 수 있는 방법이다. 데이터와 행동을 합쳐 더 복잡한 내용을 간단하게 구현할 수 있게 된다. 이번 포스팅을 통해 class를 선언하고 사용하는 방법에 대해 학습했다. class를 제대로 사용하기 위해서는 상속, polymorphism 등의 개념에도 익숙해져야 한다. 이러한 내용들은 기초적인 사용법을 익힌 후에 알아봐도 무방하다.
'프로그래밍 언어 > python' 카테고리의 다른 글
[python 기초 7] pandas 시작하기 (0) | 2023.04.16 |
---|---|
[python 기초 6] python libraries (0) | 2023.03.27 |
[python 기초 4] 함수 (0) | 2023.03.11 |
[python 기초 3] List, Tuple, Set, Dictionary (0) | 2023.03.06 |
[python 기초 2] 프로그램 제어 문법 (0) | 2023.03.02 |