클래스란 무엇인가?
파이썬 클래스는 관련 데이터와 함수를 그룹화하는 방법입니다. 이를 통해 코드를 정리하고 유지보수하기 쉽게 만들 수 있습니다. 클래스는 데이터(속성)과 함수(메소드)로 구성됩니다. 속성은 클래스에 대한 정보를 저장하기 위해 사용되는 변수이며, 메소드는 그 데이터를 조작하거나 작업을 수행하기 위해 사용됩니다. 클래스에는 또한 기능을 분리하기 위해 서브 클래스를 포함할 수도 있습니다.
클래스를 설계할 때
- 생성자(constructor)
- 클래스를 만들 때 자동으로 호출되는 특수 함수. 파이썬에서는 이름을 __init__으로 할 필요가 있다. 첫 번째 인수로 객체 자신을 의미하는 self라는 특수한 변수를 갖게 된다.
- 메서드(method)
- 클래스가 갖는 처리, 즉 함수. 인스턴스를 조작하는 인스턴스 메서드, 클래스 전체를 처리하는 클래스 메서드, 인스턴스 없이도 실행할 수 있는 정적 메서드의 세 종류가 존재.
- 멤버(member)
- 클래스가 갖는 값, 즉 변수. 다른 객체 지향 언어에는 프라이빗(private, 클래스 외부에서 접근 불가)과 퍼블릭(public, 클래스 외부에서 접근 가능) 두 종류의 멤버가 마련되어 있지만, 파이썬에서는 모두 퍼블릭 멤버로 처리. 대신 파이썬에서는 멤버에 대한 접근(access)을 프로퍼티(property)로 제한할 수 있다.
클래스(멤버와 생성자)
# MyProduct 클래스를 정의
class MyProduct:
# 생성자를 정의
def __init__(self, name, price):
# 인수를 멤버에 저장
self.name = name
self.price = price
self.stock = stock
self.sales = 0
정의된 클래스는 설계도일 뿐 객체를 만들려면 클래스를 호출해야함.
# MyProduct를 호출하여 객체 product1을 만든다.
product1 = MyProduct('cake', 500, 20)
클래스를 호출할 때 작동하는 메서드를 생성자라고 함. 생성자는 init()로 정의하며, self를 생성자의 첫 번째 인수로 지정해야함. 클래스 내 멤버는 self.price처럼 변수명 앞에 self.를 붙임.
MyProduct가 호출되면 name=’cake’, price=500으로 생성자가 작동하고, 각 인수에 의해 멤버 name, price가 초기화 됨.
클래스(메서드)
# MyProduct 클래스를 정의
class MyProduct:
def __init__(self, name, price, stock):
# 인수를 멤버에 저장
self.name = name
self.price = price
self.stock = stock
self.sales = 0
# 구매 메서드
def buy_up(self, n):
self.stock += n
# 판매 메서드
def sell(self, n):
self.stock -= n
self.sales += n * self.price
# 개요 메서드
def summary(self):
message = f'called summary().\\n name: {self.name}\\n price: {str(self.price)}\\n stock: {str(self.stock)}\\n sales: {str(self.sales)}'
print(message)
메서드를 정의할 때 생성자와 마찬가지로 첫 번째 인수로 self를 지정해야 하며, 멤버 앞에 self.를 붙여야 함. 다른 부분은 일반 함수처럼 정의하면 된다. 메서드를 호출할 때는 ‘객체.메서드명’을 사용한다. 멤버는 직접 참조할 수도 있지만, 객체 지향으로는 바람직하지 않다. 멤버가 간단히 변경되지 않도록 하는 것이 좋은 클래스 설계의 기본.
클래스(상속, 오버라이드, 슈퍼)
다른 사람이 만든 클래스에 기능을 추가하고 싶을 때 기존의 클래스를 바탕으로 메서드나 멤버를 추가하거나 일부만 변경하여 새로운 클래스를 만들 수 있다. 바탕이 되는 클래스는 부모 클래스, 슈퍼 클래스, 기저 클래스 등으로 부르고, 새로 만든 클래스는 자식 클래스, 서브 클래스, 파생 클래스 등으로 부른다.
자식 클래스에서 하는 일
- 부모 클래스의 메서드와 멤버를 그대로 사용할 수 있음
- 부모 클래스의 메서드와 멤버를 덮어쓸 수 있음(오버라이드).
- 자기 자신의 메서드와 멤버를 자유롭게 추가할 수 있음.
- 자기 클래스에서 부모 클래스의 메서드와 멤버를 호출할 수 있음.(슈퍼)
# MyProduct 클래스를 상속하는 MyProductSalesTax를 정의한다.
class MyProductSalesTax(MyProduct):
# MyProductSalesTax는 생성자의 네 번째 인수가 소비세율을 받음.
def __init__(self, name, price, stock, tax_rate):
# super()를 사용하면 부모 클래스의 메서드를 호출할 수 있음.
# 여기서는 MyProduct 클래스의 생성자를 호출.
super().__init__(name, price, stock)
self.tax_rate = tax_rate
# MyProductSalesTax에서 MyProduct의 get_name을 재정의(오버라이드)함.
def get_name(self):
return self.name + '(소비세 포함)'
# MyProductSalesTax에서 get_price_with_tax를 새로 구현.
def get_price_with_tax(self):
return int(self.price * (1 + self.tax_rate))
product3 = MyProductSalesTax('phone', 30000, 100, 0.1)
print(product3.get_name())
print(product3.get_price_with_tax())
# MyProductSalesTax 클래스에는 summary() 메서드가 정의되어 있지 않지만,
# MyProduct를 상속하고 있기 때문에 summary() 메서드를 호출할 수 있다.
product3.summary()
'Python 기초' 카테고리의 다른 글
[Python] 문자열 다루기 (0) | 2023.03.18 |
---|---|
[Python] 연산자 정리 (0) | 2023.03.17 |
[Python] 자료형과 변수 (1) | 2023.03.10 |
[파이썬 기초] Functions : 함수, 모듈 (0) | 2023.02.12 |
파이썬 기초 (0) | 2023.02.10 |
댓글