클래스, 상속
클래스와 객체
과자를 만드는 틀 -> 클래스
틀을 이용해 만든 과자 -> 객체
객체와 인스턴스의 차이
a = Cookie() 에서 a는 객체, a 객체는 Cookie의 인스턴스이다.
인스턴스 : 특정 객체가 어떤 클래스의 객체인지 관계 위주로 설명할 때 사용하는 말
사칙연산 클래스 만들기
class FourCal:
def setdata(self, first, second):
self.first = first # a.first = first, a 객체에 객체변수 first가 생성되고 값이 저장된다.
self.second = second # a.second = second, a 객체에 객체변수 second가 생성되고 값이 저장된다.
def add(self):
return self.first + self.second
def mul(self):
return self.first * self.second
def sub(self):
return self.first - self.second
def div(self):
return self.first / self.second
객체 생성
- a = FourCal()
메서드 호출
객체에 데이터 설정
a.setdata(4, 2) # first에 4를, second에 2를 set
self.first라는 객체변수 first에 argument로 받은 first의 value 를 대입
self.second도 동일
연산 메서드 호출
메서드가 객체 변수에 접근하고 있으므로 반드시 객체의 set 메서드를 통해 객체 변수를 생성한 후 메서드를 호출해야 함
a.add() # 6
a.mul() # 8
a.sub() # 2
a.div() # 2.0
메서드의 또 다른 호출 방법
클래스를 통해 메서드를 호출할 수 있다
a = FourCal() FourCal.setdata(a, 4, 2)
클래스이름.메서드 형태로 호출할 때는 객체를 첫 번째 매개변수에 꼭 전달 해줘야 한다!
객체.메서드 형태로 호출할 때는 self를 반드시 생략해서 호출해야 한다.
self란 무엇인가?
클래스의 메서드를 호출하면 메서드의 첫번째 매개변수 self에는 메서드를 호출한 객체가 자동으로 전달된다.
파이썬 메서드의 첫 번째 매개변수 이름은 관례적으로 self를 사용한다.(다른 이름을 사용해도 상관 없음)
생성자(Constructor)
객체가 생성될 때 자동으로 호출되는 메서드를 의미
메서드 이름으로 init를 사용하면 이 메서드는 생성자가 된다.
생성자를 사용함으로써 setdata 메서드를 호출하지 않아 오류가 발생할 수 있는 가능성 제거
class FourCal: def __init__(self, first, second): self.first = first self.second = second
이 상태에서 객체를 생성하기 위해 a = FourCal()을 수행하면 매개변수가 없어 오류가 발생한다.
Default Parameter를 사용해서 초기값을 설정할 수도 있다
def __init__(self, first = 1, second = 1)
주의 ! C++과 다르게 오버로딩을 통해 생성자를 여러개 만들 수 없다.
오버로딩 : 동일한 이름의 함수, 메서드를 매개변수에 따라 다른 기능으로 동작하도록 만드는 것
파이썬에서는 변수 타입이 정해져있지 않기 때문에 생성자 뿐만 아니라 함수, 메서드 모두 오버로딩이 불가능하다
클래스의 상속(inheritance)
어떤 클래스를 만들 때 다른 클래스의 기능을 물려받는 것
class 클래스 이름(상속할 클래스 이름):
상속을 하는 이유?
- 기존 클래스가 라이브러리 형태로 제공되거나 수정이 허용되지 않으면 상속해서 사용할 수 있음
example(위의 Fourcal 클래스에 이어서)
class MoreFourCal(Fourcal): def pow(self): return self.first ** self.second
인스턴스 attribute는 상속되지 않음(i.e 객체 변수)
클래스 attribute는 상속됨(i.e 메서드)
self.first = first와 같이 인스턴스 atrribute까지 상속하려면 어떻게 해야할까?
클래스의 super()
super() 함수는 부모 클래스인 super class의 임시 객체를 반환하여 부모 클래스의 메서드(생성자 포함)를 사용할 수 있게 해준다
자식 클래스의 생성자는 부모 클래스의 생성자를 실행하지 않으므로, super().init()를 통해 실행해 줄 수 있다.
class MoreFourCal(Fourcal): def __init__(self, first, second, third): # third라는 매개변수를 추가로 받는다고 가정 super().__init__(first, second) self.third = third
생성자 뿐만 아니라 부모클래스의 메서드 또한 super()를 통해 자식클래스에서 실행할 수 있다.
메서드 오버라이딩
부모 클래스에 있는 메서드를 동일한 이름으로 다시 작성(오버라이딩, 덮어쓰기) 하는 것
위의 Fourcal 예시에서 a = FourCal(4, 0) 실행후 a.div()를 실행하면 0으로 정수를 나누기 때문에 오류가 발생한다.
이를 해결하고자 FourCal 클래스를 상속하는 SafeFourCal 클래스를 만들자
class SafeFourCal(FourCal): def div(self): if self.second == 0 return 0 else: return self.first / self.second
클래스 변수
객체변수들은 다른 객체들에 영향을 받지 않고 독립적으로 그 값을 유지함
클래스 변수는 함수를 선언하는 것처럼 클래스 안에서 변수를 선언하여 생성한다.
어느 객체에서나 동일한 클래스 변수를 가진다.
클래스.클래스변수로 값을 변경하면 다른 객체에서의 값도 다 변경된다.(모든 객체에 공유된다.)
모든 객체에서 공유하고 있기 때문에 어느 인스턴스에서 접근하든 주소 또한 동일하다.
example
class Family: lastname = "김" # 클래스 변수 a = Family() b = Family() Family.lastname = "park" --> 클래스 변수값이 변경되어 a, b 객체에서도 lastname이 "park"로 변경된다
a.lastname 이나 b.lastname와 같이 객체.클래스변수이름 으로 접근하면 이는 클래스 변수가 아닌 객체 변수에 접근하는 것임을 주의하자.!!
a.lastname = "Lee" # 새로운 lastname이라는 객체변수를 a 객체에 생성 후 저장 print(b.lastname) # park
참조) Do it! 점프 투 파이썬 (박응용 지음), https://wikidocs.net (파이썬 계단밟기)
'Programming Language > Python' 카테고리의 다른 글
[Python] 18. 패키지(package) (0) | 2023.11.07 |
---|---|
[Python] 17. 모듈(module) (0) | 2023.11.07 |
[Python] 15. 파일 입출력(FILE Input/Output) (0) | 2023.11.06 |
[Python] 14. 사용자 입력 (0) | 2023.11.05 |
[Python] 13. 함수(function) (0) | 2023.11.05 |