1. Class
object(객체)는 state(상태)와 behavior(동작, 기능)으로 구성된다. 이를 코드 상에서 구현하기 위한 방법은 크게 두 가지인데, 전자는 field의 형태로, 후자는 method function의 형태로 구현된다.
우리는 개별의 object를 다루기 위해 Class라는 개념을 도입한다. Class는 동일한 자료구조를 공유하는 특정 object type을 나타낸다. 가령 와플이라는 object가 존재할 때, 그 외형과 기능은 동일한 구조를 공유하나 개별 재료는 다르다. Class는 와플기계처럼 다른 개별 재료(input)을 효율적으로 다룰 수 있도록 도와주는 장치로 생각하면 쉽다. 이 때 Class를 통해 생성된 object는 instance라 부른다.
class Counter:
def __init__(self):
self.count = 0
def reset(self):
self.count = 0
def increment(self):
sel.count += 1
def get(self):
return self.count
간단한 예시로 기계식 계수기를 Class로 구현하는 경우를 살펴보자.
기계식 계수기는 최초의 reset, 1명씩 증가할때마다 실행되는 increment, 그리고 마지막 인원이 입장할때 최종 인원을 얻기 위한 get method로 구성된다.
여기서 __init__ method가 상당히 중요한 역할을 한다. Class 내부의 Method는 수동적으로 호출되어야 하지만 init의 경우 instance를 할당할 시에 자동적으로 실행된다. 그 이름대로 이는 input varaiable(field)의 값을 초기화해주는 역할을 한다.
BTS = Counter()
BTS.reset()
for i in range(1, 80000):
BTS.increment()
print("BTS 공연 입장객 수는", BTS.get())
위와 같이 Counter Class를 생성했다면 이를 활용하여 각 공연 입장객 수를 얻을 수 있다. BTS 공연에 입장한 관객수를 얻고 싶다면, Counter Class에 해당하는 instance로서의 BTS를 선언한다. 그리고 Class 내부의 Method 변수를 BTS라는 instance를 통해 접근 및 사용할 수 있는 것이다. 우선 이전 기록을 reset()해주고, 공연 관객수를 increment()로 측정한다. 이후 get()으로 최종 인원수를 얻는다.
만약 BTS 공연만 센다면 def로 충분히 해결할 수 있지만, aespa, blackpink 등 타 공연이 instance로 존재한다면 Class를 활용하는 것이 훨씬 효율적이다.
2. Methods
class Television:
def __init__(self, channel, volume, on):
self.channel = channel
self.volume = volume
self.on = on
def show(self):
print(self.channel,self.volumne, self.on)
def setChannel(self, channel):
self.channel = channel
def getChannel(self):
return self.channel
t = Television(9, 10, True)
t.show()
t.setChannel(11)
t.show()
앞서 언급했듯이 Television Class에 대한 instance t가 생성되는 순간 __init__이 실행된다. __init__은 input variable을 생성하는 역할을 맡는데, 이 경우 __init__의 input variable은 self를 제외하고, channel, volume, on 순이다. t는 각 9, 10, true를 입력받았다.
이후 t.show()를 실행할 경우 input 변수들이 그대로 출력된다. 그런데 setChannel(11)을 통해 Channel variable을 변경했고, 다시 show()를 실행하면 (11, 10, True)와 같이 변경된 variable이 출력된다.
이들 Method들은 어떤 Class를 정의하든지 간에 기초적으로 사용된다.
__init__은 input variable을 self 내부에 할당해주는 역할을, show는 input값이 제대로 입력되었는지 확인해주는 역할을, SetChannel은 특정 input값을 변경하는 역할을, getChannel은 특정 input값만 반환받는 역할을 담당한다.
class Student:
def __init__(self, name=None, age=0):
self.__name = name
self.__age = age
def getAge(self):
return self.__age
def getName(self):
return self.__name
def setAge(self, age):
self.__age = age
def setName(self, name):
self.__name = name
obj = Student("Hong", 20)
obj.getName()
앞서 살펴봤듯이 Methods에는 Getter와 Setter가 존재한다. 이는 각각 Class 내부에 저장된 data를 get해주는 역할을 도맡거나 혹은 같은 객체의 data를 set(변경)해주기 위한 함수다.
아래는 여기까지 소개한 개념들을 활용한 간단한 예시들이다.
import math
class Circle:
def __init__(self, r):
self.__r = r
def get_area(self):
self.__area = math.pi * self.__r**2
return self.__area
def get_circum(self):
self.__circum = math.pi * self.__r * 2
return self.__circum
c1 = Circle(10)
print("원의 넓이 :", c1.get_area())
print("원의 둘레 :", c1.get_circum())
class Account:
def __init__(self):
self.__balance = 0
def withdraw(self, amount):
self.__balance -= amount
print("통장에서", amount, "가 출금되었음")
return self.__balance
def deposit(self):
self.__balance += amount
print("통장에서", amount, "가 입금되었음")
return self.__balance
ESR = Account()
ESR.deposit(100)
ESR.withdraw(50)
class Cat():
def __init__(self, name, age):
self.__name = name
self.__age = age
def get_name(self):
return self.__name
def set_name(self, name):
self.__name = name
def get_age(self):
return self.__age
def set_age(self, age):
self.__age = age
daechu = Cat('daechu', 3)
nyang = Cat('nyang', 10)
print(daechu.get_name(), daechu.get_age())
class Rec:
def __init__(self, side):
self.side = side
def getArea(self):
return self.sdie*self.side
def printAreas(r,n):
while n >= 1:
print(r.side, "\t", r.getArea())
r.side = r.side + 1
n = n - 1
printAreas(Rec(5),5)
#변길이가 5인 사각형부터 10인 사각형까지 순차적으로 면적값을 출력
#class Rec에 해당하는 obj Rec(5)를 printAreas 함수의 input variable로 활용
3. Class Member & Special Method
instance와 달리 단일 class에 해당하는 모든 객체를 통틀어 하나만 생성되어 공유되는 정적 변수다.
class Television:
serialNumber = 0
def __init__(self):
Television .serialNumber += 1
delf.number = Television.serialNumber
class Circle:
def __eq__(self, other):
return self.r == other.r
c1 = Circle(10)
c2 = Circle(10)
if c1 == c2:
print("equal radius for both of circle")
특수 method를 사용할 경우 객체간의 연산을 사용할 수 있다. 위 예시의 경우 __eq__를 활용해 c1과 c2간의 비교를 진행한 것이다. 겉으로 보기엔 c1 == c2가 그저 변수간 비교로 인식될 수 있으나, 이들은 obj이기 때문에 특수 method를 통해서만 비교가 가능하다. 따라서 c1 == c2를 입력시 class 내부의 __eq__가 실행되고 Boolean 값을 반환하게 된다.
<참조문헌>
- YouTube
www.youtube.com
'프로그래밍언어 > python' 카테고리의 다른 글
[파이썬문법] 12. Threading(1) (0) | 2022.01.21 |
---|---|
[파이썬문법] 11. Class(2) (0) | 2022.01.16 |
[파이썬문법] 9. 반복문 (0) | 2021.12.15 |
[파이썬문법] 8. iterable variables (0) | 2021.12.15 |
[파이썬문법] 10. function (0) | 2021.12.10 |