안녕하세요 펭귄 교수입니다.
잊혀져 있던 파이썬 코딩 강의를 이어 해보고자 합니다.
이번에야 말로 끝까지 다 써보도록 하겠습니다.
이 커리큘럼을 마친 후에는 심화버전으로 찾아오겠습니다.
클래스란?
클래스를 이해하기 전에 객체 지향 언어, 객체 지향 프로그래밍 (OOP, Object Orient Programming) 에 대한 이해가 우선되어야 합니다.
객체 지향 프로그래밍 이전에 절차 지향 프로그래밍이 있었습니다.
이는 C언어의 개발 양식으로, 함수형 프로그래밍을 말합니다.
void a() {
// ...
}
void b() {
// ...
}
int main(char* args) {
// ...
a();
b();
return 0;
}
위와 같은 식으로 기능별로 함수를 구현하고, 함수가 선언된 위치에 따라 호출 여부도 정해지는 식이었습니다.
그렇다 보니 코드에 대한 직관도도 떨어질 뿐만 아니라, 코드의 길이도 길어지게 되면서 코드 분리가 어려워지는 문제가 있었습니다.
이를 해결한 방법이 객체 지향 프로그래밍입니다.
정보 처리 기사, 혹은 전공 공부에서 SOLID 원칙에 대해 공부할 수 있는데, 이는 객체 지향 프로그래밍의 다섯 가지 원칙입니다.
- SRP(단일 책임 원칙)
- OCP(개방-폐쇄 원칙)
- LSP(리스코프 치환 원칙)
- DIP(의존 역전 원칙)
- ISP(인터페이스 분리 원칙)
로 다음 장, 객체 지향 언어에서 이를 자세히 다뤄보겠습니다.
결과적으로 말하면, 객체 지향 프로그래밍의 시대가 오면서, 코드들은 재사용성이 높아지고 캡슐화가 되면서 코드를 잘 숨길 수 있게 되었습니다.
이를 구현한 방식 중 하나가 바로 Class, 클래스 입니다.
많은 서적, 강의에서 클래스와 객체를 이런 식으로 표현합니다.
와플 기계와 와플.
클래스는 와플 기계이며, 이렇게 만들어진 것이 객체 라는 것입니다.
파이썬 클래스
그러면 이제 파이썬에서 클래스를 어떻게 작성하는 지에 대해 알아보겠습니다.
class AClass:
def __init__(self):
pass
def method_1(self):
pass
aClass = AClass()
위와 같이 파이썬에서 클래스를 사용할 때, class 라는 키워드를 사용하고, 그 안의 함수들을 작성합니다.
클래스 안에 있는 함수들은 메서드 라고 부르고, 변수들은 필드 라는 용어를 사용합니다.
기본적으로 클래스의 이름은 대문자로 시작하는 것이 원칙이며,
객체 (인스턴스)는 소문자로 시작하여 카멜 표기법으로 변수 이름을 작성하는 것이 관례입니다.
클래스를 통해 객체를 만드는 방법은 간단하게 클래스이름()으로 생성이 가능합니다.
또한 클래스의 필드를 선언하기 위해서는 기존 방식과는 다릅니다.
그것은 self 라는 키워드를 사용해서 접근, 할당해야 한다는 것입니다.
Self
파이썬 이외의 프로그래밍 언어를 공부할 때도 같은 개념이지만 다른 키워드가 존재합니다.
그것은 this 입니다.
this와 동일하게 self는 자기 자신의 객체를 가르키는 키워드입니다.
그렇기 때문에 self.변수명을 할 때 자신의 객체 필드에 접근하는 방식입니다.
이러한 방식은 택하는 이유는 객체 내에서 각기 다른 메서드에서 객체의 필드에 접근하기 위함입니다.
만일 self 가 붙지 않은 변수는 해당 함수 내에서만 사용이 가능하고, 다른 메서드에서는 사용이 불가합니다.
그렇기 때문에 클래스 내 모든 메서드들은 첫 매개변수로 self를 받습니다.
다른 매개변수를 추가로 받고자 할 때는 첫 번째로 self를 작성하고 그 후에 넣어줘야 합니다.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def say(self, message):
print("{} {} : {}".format(name, age, message))
def changeAge(self, age):
self.age = age
p1 = Person('홍길동', 15)
p1.say("안녕하세요") # 홍길동 15 : 안녕하세요
p1.changeAge(17)
p1.say("안녕하세요") # 홍길동 17 : 안녕하세요
다음으로 파이썬 클래스 내에서 " __ " 로 시작하는 던더 메서드 (Double Underscore) 에 대해 소개드리겠습니다.
던더 메서드 (매직 메서드)
1. __init__(self)
이 메서드는 생성자 라고 불리며, 객체가 처음 생성될 때 실행되는 메서드입니다.
대체로 필드들을 선언할 때 많이 사용되며, 특히 GUI 프로그램을 만들 때 UI 설정에 쓰입니다.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
2. __str__(self)
이 메서드는 인스턴스 (객체의 다른 말)를 문자열로 표현했을 때 출력 결과를 보여줍니다.
class Test:
def __str__(self):
return "이것은 테스트 객체입니다."
test = Test()
print(test) # 이것은 테스트 객체입니다.
# print(str(test)) # 이것은 테스트 객체입니다.
3. __add__(self)
이 메서드는 덧셈 연산 시 해당 연산을 어떻게 처리할 지를 정할 수 있게 해줍니다.
class Test:
def __init__(self, num):
self.num = num
def __add__(self, other):
return self.num + other.num
a = Test(10)
b = Test(20)
print(a + b) # 30
4. __del__(self)
init 메서드와 반대로, 객체가 소멸될 때 호출되는 소멸자 메서드입니다. 파일이나 DB 연결 후 연결 해제가 필요할 때 해당 메서드를 사용하면 되겠습니다.
class Test:
def __init__(self):
file = open('file.txt', 'a')
def __del__(self):
file.close()
5. 자료형으로 부터 상속받아 오버라이딩 메서드, __setitem__, __getitem 등
class MyList(list): # 상속에 관한 내용은 다음 편인 객체 지향 편에서 다루도록 하겠습니다.
def __init__(self, li):
self.li = li
def __setitem__(self, idx, value):
self.li[idx] = value
def __getitem__(self, idx):
return self.li[idx]
myList = MyList([1, 2, 3, 4])
myList[2] = 30
print(myList[2]) # 30
말고도 상당히 많은 던더메서드를 지원하고 있습니다.
참조 : https://docs.python.org/ko/3.7/reference/datamodel.html#special-method-names
정적 메서드
각 객체 내에 별개 메서드가 따로 존재하는 것이 아닌, 모든 객체들 위에 컨트롤하기 위해 존재하는 메서드가 있습니다.
이는 정적 메서드 (Static Method)라고 불립니다.
C언어, C++를 배우다보면 나오는 static과 동일합니다.
예를 들어, 특정 프로그램을 실행하기 위해서 외부에서 실행을 할 수 있게 노출시키는 static main 함수 같은 것이 있습니다.
또한 객체가 총 몇 개가 만들어졌는 지를 파악하기 위해 Count를 계산하는 정적 메서드도 존재할 수 있습니다.
class Person:
count = 0 # 현재 생성된 객체 수
def __init__(self, name, age):
Person.count += 1
@classmethod
def print_info(cls):
print('{}명 생성되었습니다.'.format(cls.count)) # cls로 클래스 속성에 접근
p1 = Person('홍길동', 15)
p2 = Person('김영희', 17)
Person.print_info() # 2명 생성되었습니다.
이러한 방식으로 클래스 내에서 새로운 인스턴스를 생성할 수도 있습니다.
@classmethod
def create(cls):
new_object = cls()
return new_object
참조 : https://dojang.io/mod/page/view.php?id=2380
마무리
이렇게 파이썬 클래스와 메서드에 관해 알아보았습니다.
클래스 사용이 익숙해지면부터 코딩의 난이도가 올라가면서 더 많은 기능을 구현할 수 있게 되는 것 같습니다.
다음 강의에서는 이러한 클래스, 객체를 이용한 개념들,
상속, 오버라이딩 등 객체 지향에 있어서 필수적으로 알아야 하는 개념에 대해 이야기할 예정입니다.
'프로그래밍 > Python' 카테고리의 다른 글
[파이썬 코딩 강의] 웹과 파이썬 (requests 편) (0) | 2024.09.28 |
---|---|
[파이썬 코딩 강의] 객체 지향 언어 (1) | 2024.09.26 |
[파이썬 코딩 강의] 함수, 모듈화 (0) | 2021.03.09 |
[파이썬 프로그램] 프로그램 다운로드 (0) | 2021.03.01 |
[파이썬 코딩 강의] 파일 읽고 쓰기 (3) | 2021.02.28 |