Week2-3. class(클래스)
class(클래스): class는 객체지향 프로그래밍(Object Oriented programming)의 표준기능으로, 속성과 기능을 가진 객체를 여러개 만들어 낼 수 있는 blueprint이다.
object(객체): class의 instance(실제로 메모리상에 할당되는 것), 속성(attribute), 기능(function)을 수행할 수 있다.
#예제: 피트니스센터의 회원 class와 회원을 관리하는 class를 선언하고 객체를 생성하는 코드
----------------------------------------------------------------------
fitnesscenter.py
class Member: #class name은 대문자로 시작
def __init__(self,id,pw): #id,pw를 속성을 갖는 객체 생성 가능
self.id = id
self.pw = pw
class MemberRepository:
def __init__(self):
self.members = {} #dictionary를 속성으로 갖는 객체 생성 가능
def addMember(self,member): #id,pw를 속성으로 갖는 member객체를 parameter로 갖는다.
self.members[member.id] = member.pw
def login(self,id,pw):
result = id in self.members #True or False
if result and self.members[id] == pw:
print('Login success')
else:
print('Losin fail')
def remove(self,id,pw):
result = id in self.members
if result and self.members[id] == pw:
del self.members[id]
else:
print('Wrong access')
def printMembers(self):
for key, value in self.members.items():
print('ID : {} - PW : {}'.format(key,value))
----------------------------------------------------------------------
import fitnesscenter
members = fitnesscenter.MemberRepository() #dictionary를 속성으로 갖는 객체
for i in range(3): #회원가입 3번 반복
id = input('ID : ')
pw = input('PW : ')
member = fitnesscenter.Member(id,pw) #id,pw를 속성을 갖는 객체
members.addMember(member)
members.printMembers()
members.login('abc','123')
members.login('def','455')
members.login('ghi','789')
members.remove('abc','123')
members.printMembers()
shallow copy(얕은 복사): 객체 주소를 복사하는 것으로 객체 자체가 복사되지 않는다.(객체1개, 변수2개)
deep copy(깊은 복사): 객체 자체를 복사하는 것으로 또 하나의 객체가 생성된다.(객체2개, 변수2개)
#예제: robot class를 생성하고 robot 객체를 선언하여, shallow copy와 deep copy를 실행하는 코드
----------------------------------------------------------------------
robot.py
class Robot:
def __init__(self,name, color, height, weight): #name,color,height,weight 속성을 가지는 객체생성 가능
self.name = name
self.color = color
self.height = height
self.weight = weight
def printRobotInfo(self):
print('Color : {}'.format(self.color))
print('Height : {}'.format(self.height))
print('Weight : {}'.format(self.weight))
----------------------------------------------------------------------
import robot
#shallow copy
rb1 = robot.Robot('rb1', 'white', '70cm', '1kg')
rb2 = rb1 #shallow copy, 객체 1개에 rb1,rb2 변수 2개가 할당되었다.
print(rb1)
print(rb2) #같은 객체 주소를 가지고 있다. 즉, 객체 주소만 복사되었다.
#deep copy
import copy #copy_module
rb1 = robot.Robot('rb1', 'white', '70cm', '1kg')
rb2 = copy.copy(rb1)
print(rb1)
print(rb2) #각자 다른 객체 주소를 가지고 있다.
#예제: NormalTV class를 상속받는 TV4K,TV8K class를 선언하고, 객체를 생성하는 코드
----------------------------------------------------------------------
tv.py
class NormalTV:
def __init__(self,inch = 52, color='black', resolution='full-HD'): #기본 setting
self.inch = inch
self.color = color
self.resolution = resolution
self.smartTV = 'off'
self.aiTV = 'off'
def turnOn(self):
print('Turn on TV')
def turnOff(self):
print('Turn off TV')
def printTVInfo(self):
print('Inch : {}inch'.format(self.inch))
print('Color : {}'.format(self.color))
print('Resolution : {}'.format(self.resolution))
print('SmartTV : {}'.format(self.smartTV))
print('AITV : {}'.format(self.aiTV))
class TV4K(NormalTV):
def __init__(self,inch,color,resolution = '4k'):
super().__init__(inch,color,resolution)
def setSmartTV(self,s):
self.smartTV = s
class TV8K(NormalTV):
def __init__(self, inch, color, resolution='8k'):
super().__init__(inch,color,resolution)
def serAiTV(self,a):
self.aiTV = a
----------------------------------------------------------------------
import tv
my4kTV = tv.TV4K(65,'silver','4k')
my4kTV.setSmartTV('on')
my4kTV.turnOn()
my4kTV.turnOff()
my4kTV.printTVInfo()
friend8kTV = tv.TV8K(75,'black','8k')
friend8kTV.serAiTV('on')
friend8kTV.turnOn()
friend8kTV.turnOff()
friend8kTV.printTVInfo()
#예제: 추상클래스를 이용해서 한영, 한일 사전 class를 선언하고 객체를 생성하는 코드
----------------------------------------------------------------------
dic.py
from abc import * #abc(abstract base class) package를 import 해야한다.
class AbsDictionary(metaclass=ABCMeta):
def __init__(self):
self.words = {} #dictionary 속성을 갖는 객체 생성 가능
@abstractmethod
def register(self,w1,w2):
pass
@abstractmethod
def remove(self,w1):
pass
@abstractmethod
def update(self,w1,w2):
pass
@abstractmethod
def search(self,w1):
pass
class KorToEng(AbsDictionary):
def __init__(self):
super().__init__()
def register(self,k,e):
print('Register: {} - {}'.format(k,e))
self.words[k] = e
def remove(self,k):
result = k in self.words
if result:
del self.words[k]
print('Remove: {}'.format(k))
else:
print('Wrong access')
def update(self, k,e):
print('Update: {} - {}'.format(k, e))
self.words[k] = e
def search(self,k):
print('{} - {}'.format(k,self.words[k]))
def printWords(self):
for k,e in self.words.items():
print('{} - {}'.format(k,e))
class KorToJpa(AbsDictionary):
def __init__(self):
super().__init__()
def register(self, k, j):
print('Register: {} - {}'.format(k, j))
self.words[k] = j
def remove(self, k):
result = k in self.words
if result:
del self.words[k]
else:
print('Wrong access')
print('Remove: {}'.format(k))
def update(self, k, j):
print('Update: {} - {}'.format(k, j))
self.words[k] = j
def search(self, k):
print('{} - {}'.format(k, self.words[k]))
def printWords(self):
for k,j in self.words.items():
print('{} - {}'.format(k,j))
----------------------------------------------------------------------
import dic
kTe = dic.KorToEng()
kTe.register('나비', 'butterfly')
kTe.register('친구', 'friend')
kTe.register('사랑', 'love')
kTe.register('가족', 'family')
print('-'*10)
kTe.search('나비')
print('-'*10)
kTe.printWords()