* Class 필요한 이유
C 언어에는 클래스가 없다. 즉, 클래스가 없어도 함수만으로 프로그램을 충분히 만들 수 있다.
하지만 클래스를 사용해서 얻을 수 있는 이익이 상당하다.
계산기를 만드는 예시를 상상해보자.
- 함수로 구현
result = 0
def add(num):
global result
result += num
return result
print(add(3))
print(add(4)
결과
3
7
두 개의 계산기를 사용하고 싶은 경우, 각 계산기는 각각의 결과값을 유지해야 하기 때문에 위와 같이 add 함수 하나만으로는 결과값을 따로 유지할 수 없다.
이 상황을 해결하려면 함수를 각각 따로 만들어야 한다.
result1 = 0
result2 = 0
def add1(num):
global result1
result1 += num
return result1
def add2(num):
global result2
result2 += num
return result2
print(add1(3))
print(add1(4))
print(add2(3))
print(add2(7))
결과
3
7
3
10
- 클래스로 구현
class Calculator:
def __init__(self):
self.result = 0
def add(self, num):
self.result += num
return self.result
cal1 = Calculator()
cal2 = Calculator()
print(cal1.add(3))
print(cal1.add(4))
print(cal2.add(3))
print(cal2.add(7))
결과
3
7
3
10
Calculator 클래스를 만들고, 별개의 계산기 cal1, cal2를 만든다. 이 cal1, cal2는 Calculator 클래스의 객체이다.
클래스를 한 번 만들고, 객체들을 생성해주면 각 결과값들이 독립적인 값을 유지한다.
즉, 객체들 간 값들이 독립적으로 유지된다.
만약 계산기가 100대가 된다면, 함수를 사용할 시 함수를 100번 선언해야 되겠지만, class를 사용하면 객체만 계속 생성해주면 되기 때문에 함수를 사용하는 경우에 비해 매우 간단하다.
* 클래스와 객체
과자 틀 -> 클래스(class)
과자 틀에 의해 만들어진 과자 -> 객체(object)
클래스는 똑같은 무엇인가 계속해서 만들어 낼 수 있는 틀이고,
객체는 클래스로 만든 과자들이라고 할 수 있다.
그리고 여기서 클래스로 만든 객체는 객체마다 고유한 성격을 가진다. 과자 한개만 조금 베어 먹더라도 다른 과자에는 영향을 주지 않고, 베어먹은 과자는 그 자체로 성격을 띤다.
* method(메서드)
class 안에 선언된 함수들을 Method라고 부른다.
* 생성자(Constructor)
객체에 초기값을 설정해야 할 필요가 있을때 생성자를 구현하면 좋다. 생성자란 객체가 생성될 때 자동으로 호출되는 메서드를 말한다.
__init__를 사용하면 메서드는 생성자가 된다.
class Cal:
def __init__(self, first, second):
self.first = first
self.second = second
def add(self):
result = self.first + self.second
return result
* self
위의 Cal class 코드를 이어서 생각해보자.
a = Cal(4, 2) # Class 객체 생성
a.add()
self는 객체를 호출할 때 호출한 객체 자신이 전달되기 때문에 self를 사용한다. self 말고 다른 이름을 사용해도 상관 없지만, self를 관례적으로 사용한다.
* 클래스 상속(inheritance)
상속이란, 물려받다라는 듯으로 다른 클래스의 기능을 물려받을 수 있게 만드는 것이다.
새로 만든 클래스에서 상속 받은 클래스의 모든 기능을 사용할 수 있다. (현재는)
상속받을 때는 클래스 옆의 괄호 안에 상속받고자 하는 클래스를 넣어준다.
class MoreCal(Cal):
# code
* 메서드 오버라이딩
새로 만든 자식클래스에서 부모 클래스(상속한 클래스)에 있는 메서드를 동일한 이름으로 다시 만드는 것을 메서드 오버라이딩(overriding)이라고 한다.
* 클래스 변수
클래스 안에서 선언한 변수를 클래스변수라고 한다.
class Family:
lastname = "Kim"
Family 클래스에 선언한 lastname이 바로 클래스 변수이다. 클래스 변수는 클래스 안에 함수를 선언하는 것과 마찬가지로 클래스 안에 변수를 선언하여 생성한다.
>>> pirnt(Family.lastname)
김
위와 같이 클래스이름.클래스변수로 사용할 수 있다.
'Programming Language > Python' 카테고리의 다른 글
Python matplotlib.pyplot - imshow(), show() (0) | 2019.12.19 |
---|---|
opencv erode & dilate - Morphological Transformations (0) | 2019.12.17 |
Python - for문에서의 range, enumerate (0) | 2019.12.16 |
Python Class - object class 상속 (0) | 2019.12.09 |
Python generator (0) | 2019.12.06 |