Programming 기초/Python
[Python 기초 #7] 클래스, 객체와 인스턴스 차이, 생성자, 상속, 오버라이딩
코딩상륙작전
2023. 4. 21. 18:27
* 클래스(class)
- 클래스는 거푸집과 같다. 같은 기능을 하는 함수를 필요할 때마다 찍어내는 '함수 틀'이다. 클래스로 생성된 함수들을 객체(object)라고 부른다.
- c언어에는 클래스가 없다. c언어에서는 같은 기능을 하는 함수라도 매번 이름을 약간씩 바꿔가면서 새롭게 정의해야한다.
- 클래스 이름을 지을 때, 관례적으로 첫 글자를 대문자를 사용한다.
- 클래스 안에 구현된 함수는 메서드(Method)라고 부른다.
- 파이썬 메서드의 첫 번째 매개변수 이름은 관례적으로 self를 사용한다. 객체를 호출할 때 호출한 객체 자신이 전달되기 때문에 self를 사용한 것이다.
객체와 인스턴스(instance)의 차이
클래스로 만든 객체를 인스턴스라고도 한다.
a =Cookie() 이렇게 만든 a는 객체이다. 그리고 a 객체는 Cookie의 인스턴스이다. 즉 인스턴스라는 말은 특정 객체(a)가 어떤 클래스(Cookie)의 객체인지를 관계 위주로 설명할 때 사용한다. 'a는 인스턴스'보다는 'a는 객체'라는 표현이 어울리고, 'a'는 Cookie의 인스턴스'라는 표현이 훨씬 잘 어울린다.
* 생성자(constructor)
객체에 초깃값을 설정할 때, setdata 메서드를 호출하여 초깃값을 설정하기보다는 생성자를 구현하는 것이 안전하다.
class FourCal:
def __init__(self, first, second): # 생성자 메서드의 이름에 '_'는 각 양쪽에 두 개씩 붙는다.
self.first = first
self.second = second
def setdata(self, first, second):
self.first = first
self.second = second
def add(self):
result = self.first + self.second
return result
def sub(self):
result = self.first - self.second
return result
def mul(self):
result = self.first * self.second
return result
def div(self):
result = self.first / self.second
return result
a = FourCal(4, 2)
b = FourCal(3, 8)
print(a.add())
print(b.add())
print(a.div())
print(b.div())
-------------------------------------------------
6
11
2.0
0.375
* 클래스의 상속(Inheritance)
어떤 클래스를 만들 때 다른 클래스의 기능을 물려받는 것. 기존 클래스를 변경하지 않고 기능을 추가하거나 기존 기능을 변경하려고 할 때 사용한다.
class 클래스 이름(상속할 클래스 이름)
class MoreFourCal(FourCal): #기존 사칙연산 클래스에 지수계산 메서드를 추가했다.
def pow(self):
result = self.first ** self.second
return result
c = MoreFourCal(4, 3)
print(c.pow())
--------------------------------------
64
* 메서드 오버라이딩(Overriding, 덮어쓰기)
부모 클래스(상속한 클래스)에 있는 메서드를 동일한 이름으로 다시 만드는 것을 메서드 오버라이딩이라고 한다.
class FailFourCal(FourCal): # 곱하는 값이 0일 경우 'Fail' 문자열을 출력하는 클래스
def mul(self):
if self.second == 0:
return 'Fail'
else:
return self.first * self.second
d = FailFourCal(5, 0)
print(d.mul())
-------------------------------------
Fail
* 클래스 변수
- 객체변수는 다른 객체들에 영향받지 않고 독립적으로 그 값을 유지한다.
- 클래스 변수는 클래스로 만든 모든 객체에 공유된다(클래스 변수 값을 변경하면 클래스로 만든 모든 객체의 해당 변수값이 모두 변경된다).
class Family:
lastname = "김" # 클래스 변수 lastname을 "김" 문자열로 초기화시킴
print(Family.lastname)
a = Family()
b = Family()
print(a.lastname)
print(b.lastname)
Family.lastname = "박"
print(a.lastname)
print(b.lastname)
-------------------------------------
김
김
김
박
박
id값을 확인하면 Fanily.lastname, a.lastname, b.lastname은 모두 같은 메모리를 가리키고 있다.
print(id(Family.lastname))
print(id(a.lastname))
print(id(b.lastname))
-------------------------------
2002133181472
2002133181472
2002133181472