728x90

객체 지향 프로그래밍은 왜 쓸까?
파이썬 수업을 처음 들을 때 파이썬의 창시자가 크리스마스에 할 일이 없어 만든 언어라는 것과 함께 듣는 내용이 "python은 객체 지향 언어다" 라는 말이다. 그런데 python을 사용하다보면 object나 class를 사용하지 않아도 필요한 코드를 작성하는데 큰 문제가 없다. 그런데 만약 1)다른 사람들과 협업을 하거나 2)혼자라도 다루기 어려울 정도로 복잡한 프로그램을 작성하게 된다면 Object-oriented programming이 필요하게 될 것이다.
object는 현실의 대상을 모델링해 class를 정의하고 한번 정의된 class를 재사용해 여러 개의 instance를 생성하기 때문에 코드 작정 중 실수를 줄이고 사람이 이해하기 쉬운 코드를 작성할 수 있는 프로그래밍 패러다임이다. python에서 class를 사용하게 되면 다음과 같은 장점들이 있다.
- 데이터나 자료와 그것을 처리하는 방법들을 한 곳에 모아놓을 수 있음
- 프로그램을 모듈화하기 편리해 유지 보수 관점에서 유리함
- 프로그램의 기능들을 분리해 스파게티 코드를 방지할 수 있음
객체 지향 프로그래밍 용어
객체 지향 프로그래밍에 사용되는 용어들은 아래 표과 같이 정리할 수 있다. Class, object, instance 용어들이 헷갈릴 수 있다. 세 가지 용어를 잘 설명해 놓은 포스팅을 참고하자.
용어 | 설명 |
---|---|
Class | 객체object를 생성할 수 있는 틀 |
Methods | 클래스의 일부인 함수 |
Attributes | 클래스의 일부인 변수 |
Object | Class로 정의해 구현할 대상 - 다소 개념적인 용어 |
Instance | 변수메모리에 할당되어 구체화 된 실체 |
Inheritance | 다른 클래스로부터 method와 attribute등을 받아오는 것 |
Composition | 다른 클래스의 기능을 가져와 새로운 객체를 만드는 것 |
Class 구현
지금부터 파이썬에서 클래스의 요소들을 구현하는 코드를 정리한다.
Class 선언 - 기본
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Book: | |
def __init__self,title: | |
self.title = title | |
b1 = Book"bookname1" | |
b2 = Book"bookname2" |
- line 1 클래스는
class class_name:
을 시작으로 선언하게 되고 클래스 이름의 첫 글자만 대문자로 적는 것이 convention이다. - line 2
__init__(self, arg):
는 예약어로 클래스가 선언될 때 호출되는 함수다. 여기서 self는 선언된 class 자기 자신을 나타내는 변수를 넣는 자리로 class 내에서 method를 선언 할 때 항상 넣어주어야 한다.self
로 넣는 것이 convention이지만 원하는 이름을 넣어도 상관 없다. 보통 init method에서 초기화 할 때 받을 attribute를 선언한다. - line 5 ~6
b1
과b2
는 Book object가 구현된 instance이다. 각각의 instance에는 title이라는 attribute가 있는데 이에 접근하기 위해서는b1.title
,b2.title
과 같이instance_name.attribute_name
으로 접근할 수 있다.
Class 선언 - 거의 모든 것
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Book: | |
# class variable | |
order = 0 | |
# static method | |
@staticmethod | |
def decorate_namename: | |
return f'*{name}*' | |
# class method | |
@classmethod | |
def reset_ordercls: | |
cls.order = 0 | |
def __init__self,title,price: | |
self.title = title | |
self.price = price | |
Book.order += 1 # instance가 생성될 때마다 order를 증가시킴 | |
def get_priceself: | |
if hasattrself,"discount": # instance가 attribute를 갖고 있는지 | |
return self.price * 1−self.discount | |
else: | |
return self.price | |
def discount_rateself,amount: | |
self._discount = amount | |
b1 = Book"bookname1",10000 | |
b2 = Book"bookname2",12000 | |
Book.reset_order # class method | |
b3 = Book"bookname3",14000 | |
printb1.order | |
printb2.order | |
printb3.order | |
printb1.getprice() | |
b1.discount_rate0.1 ## ._discount attribute 생성 | |
printb1.getprice(, b1._discount) | |
printBook.decoratename(′BOOKNAME′) # static method | |
- line3 class variable은 method 밖에 정의된 변수로 instance가 생성될 때 전달되고, instance name 뿐만 아니라 class name으로도 접근 가능하다
Book.order
로 class variable에 접근 가능하다는 뜻__init__
메소드의 line18을 보면 인스턴스가 하나 생성될 때 마다 order가 하나씩 증가되는데 여기서 계산된 결과가 다음 instance에까지 영향을 준다. line35~37의 결과를 보면 확인 가능하다.
- line6 static method는
@staticmethod
라는 decorator를 메소드 앞에 선언해 정의할 수 있다. static method는 클래스 외부에서 접근해 사용할 수 있는 함수를 class 내부 정보를 활용해 사용하고자 할 때 사용할 수 있다.- line44에서 보는 것 과 같이 외부에서는 그냥 함수라고 생각해도 된다.
- line10 class method는
@classmethod
라는 decorator를 메소드 앞에 선언해 정의할 수 있다. class method는 class variable를 다루기 위해 사용하고, 함수의 첫 인자로 들어가는cls
는 instance가 아니라 class 자신을 칭한다.- line33을 실행하면 class variable인 order가 0으로 바뀌고 이후에 생성된
b3
에 반영된 것을 볼 수 있다.
- line33을 실행하면 class variable인 order가 0으로 바뀌고 이후에 생성된
- line21
hasattr
함수는 instance가 어떤 attribute를 가지고 있는지 확인하는 함수다.
'프로그래밍 언어 > python' 카테고리의 다른 글
[xlwings] 파이썬으로 excel 파일 다루기 2 여러 개의 파일과 시트 다루기 0 | 2022.10.04 |
---|---|
[xlwings] 파이썬으로 excel 파일 다루기 1 quick start 0 | 2022.09.28 |
numpy array broadcasting 0 | 2022.07.26 |
short-circuit evaluation 0 | 2022.07.26 |
jupyter module autoreload 0 | 2022.07.26 |