
클래스(class)! 우선 개념이 쉽지 않으니 당장은 이해가 안 되더라도 좌절하지 마세요~! 제가 이해한 바를 설명하기도 쉽지 않습니다. 아직 많이 부족하다 보니... (아마 시간이 지나면 자연스레 알게 될 내용들입니다.)
함수의 개념 설명에서 자동판매기 예를 들었습니다. 여러 대의 자동판매기를 만들 때 함수를 사용하면 편리하다고 설명했습니다. 그럼 클래스는 여러 대의 자동판매기 묶음(커피, 과자, 음료수 등등)을 다른 동네에 설치할 때 사용한다는 비유가 적절할 것 같습니다. 다른 동네에 설치한 자동판매기 묶음은 기존 자동판매기 묶음에 전혀 영향을 끼치지 않게 독립적으로 변형 가능하며, 다른 동네에 설치할 때 커피를 빼고 생필품 자판기를 바꿔 설치할 수도 있고 묶음에 없는 자동판매기를 추가할 수도 있습니다.
이 같은 개념을 클래스 내 함수(클래스 내 함수는 메서드(Method)라 명명합니다.)의 오버라이딩(Overriding, 덮어쓰기)과 상속(Inheritance, 물려받기)이라 합니다. 잘 알려진 프로그래밍 언어 C에는 없고, C++, Java에는 있는 것! 클래스입니다. 파이썬에도 있군요^^;
다소 힘들 긋지만 거두절미! 단도직입! 클래스에 대해 알아봅니다.

Test 클래스 객체를 만들고, 메서드(=클래스 내 함수)를 설정합니다. setdata(self, first, second)에서 self는 뒷줄에 나올 a1, a2를 가리키며 first는 self.a에 second는 self.b에 입력하게 됩니다. add(self) 메서드는 기존과 같이 함수를 만드는 방법과 동일하지만 self는 나중 a1, a2를 가리키는 변수이기에 필히 넣어줘야 합니다.

Test 클래스에 빼기(subtract) 기능을 넣어보겠습니다.

클래스 객체에 빼기 기능을 추가 후 a2.sub()에서 빼기가 실행되는 것을 확인할 수 있습니다. a3, a4,a5등 같은 기능을 가진 클래스를 복사하듯 간단하게 찍어 낼 수 있습니다.
a1.setdata(1,2)를 통해 인수를 매개변수로 넣을 수 있지만 생성자(Constructor)를 통해 구현할 수 있습니다. __init__를 사용하면 이 메서드는 생성자가 됩니다. setdata() 없이 클래스를 호출할 때 인수를 매개변수로 입력했습니다.

__init__는 setdata()와 형식이 동일하지만 __init__는 파이썬의 예약어로 객체가 생성되면 자동으로 호출되는 차이가 있습니다.
다음은 클래스 상속의 특성을 이용하여 Test 클래스에 곱하기, 나누기 기능을 추가해 봅니다.
class 상속받을 클래스 이름 (상속할 클래스)

More_Test 클래스가 Test 클래스를 상속받아 a3.mul()과 a4.div()가 문제없이 실행되는 것을 확인할 수 있습니다. 기존 클래스를 수정하지 않고 상속으로 처리하는 이유는 기존 클래스가 수정할 수 없는 라이브러리 형태로 제공되거나, 수정이 허용되지 않을 경우가 발생하기 때문입니다. 상속받은 클래스의 메서드를 동일한 이름으로 다시 만드는 것을 메서드 오버라이딩(overriding)이라 합니다. More_Test에서 상속받은 div() 메서드를 동일한 이름을 사용하여 오버라이딩 해 봅니다.
(기존 div는 0으로 나눌 때 "ZeroDivisionError: division by zero" 에러가 발생하는 데 이를 방지하는 div메서드로 오버라이딩 합니다.)

이미 Test 클래스로부터 상속받은 More_Test로 다시 한번 상속하여 div() 메서드를 오버라이딩 하였습니다. 에러 없이 0(zero)를 출력합니다.
객체 변수는 서로 간에 영향을 끼치지 않고 자유롭게 사용 가능한 반면, 클래스 변수는 아래와 같이 객체가 많더라도 같은 주소를 가리키기 때문에 같은 값을 가지게 됩니다.

몇 번을 보고 또 봐야 할 내용입니다. 저 또한 오롯이 이해했다고 할 수 없습니다. 좀 더 봐야겠습니다. 이해되지 않더라도 상처받지 마세요~ 시간을 두고 계속 코딩하다 보면 깨우치는 날이 오긋죠?!
'코딩 이야기 > 파이썬(Python)' 카테고리의 다른 글
단도직입 파이썬(Python) – 패키지(Package) (0) | 2021.12.16 |
---|---|
단도직입 파이썬(Python) – 모듈(Module) (0) | 2021.12.16 |
단도직입 파이썬(Python) – 입출력(input, print) (0) | 2021.12.16 |
단도직입 파이썬(Python) – 함수 function (0) | 2021.12.15 |
단도직입 파이썬(Python) – 반복문 (while, for) (0) | 2021.12.15 |
댓글