회원가입 클래스와 회원정보를 관리하는 클래스를 만들고 회원가입 로그인 기능을 구현해 보자.
class Member:
def __init__(self, i, p):
self.id = i
self.pw = p
class MemberRepository:
def __init__(self):
self.members = {}
def addMember(self, m):
self.members[m.id] = m.pw
def loginMember(self, i, p):
isMember = i in self.members
if isMember and self.members[i] == p:
print(f'{i}: log-in success!!')
else:
print(f'{i}: log-in fail!!')
def removeMember(self, i, p):
if i in self.members:
if self.members[i] == p:
del self.members[i]
print('remove success!!')
else:
print('remove fail!!')
def printMembers(self):
for mk in self.members.keys():
print(f'ID: {mk}')
print(f'PW: {self.members[mk]}')
import member as mb
mems = mb.MemberRepository() # 객체 생성
for i in range(3):
mId = input('아이디 입력: ')
mPw = input('비밀번호 입력: ')
mem = mb.Member(mId, mPw)
mems.addMember(mem)
# ID, PW 모두 출력
mems.printMembers()
# 로그인
mems.loginMember('abcd@gmail.com', '1234')
mems.loginMember('egd@gmail.com', '1644')
mems.loginMember('cdef@gmail.com', '3456')
# 제거
mems.removeMember('abcd@gmail.com', '1234')
mems.removeMember('cdef@gmail.com', '1434')
mems.printMembers()
TV클래스를 다음과 같은 상속 구조로 만들고 객체를 생성해 보자.
class NomalTv:
def __init__(self, i=32, c='black', r='full-HD'):
self.inch = i
self.color = c
self.resolution = r
self.smartTv = 'off'
self.aiTv = 'off'
def turnOn(self):
print('TV power on!!')
def turnOff(self):
print('TV power off!!')
def printTvInfo(self):
print(f'inch: {self.inch}inch')
print(f'color: {self.color}')
print(f'resolution: {self.resolution}')
print(f'smartTv: {self.smartTv}')
print(f'aiTv: {self.aiTv}')
class Tv4K(NomalTv):
def __init__(self, i, c, r='4k'):
super().__init__(i, c, r)
def setSmartTv(self, s):
self.smartTv = s
class Tv8K(NomalTv):
def __init__(self, i, c, r='8k'):
super().__init__(i, c, r)
def setSmartTv(self, s):
self.smartTv = s
def setAiTv(self, a):
self.aiTv = a
import smartTv as st
print('my4kTv---------------------')
my4kTv = st.Tv4K('65', 'silver', '4k')
my4kTv.setSmartTv('on')
my4kTv.turnOn()
my4kTv.printTvInfo()
my4kTv.turnOff()
print('friend4kTv-----------------')
friend4kTv = st.Tv4K('55', 'white', '4k')
friend4kTv.setSmartTv('off')
friend4kTv.turnOn()
friend4kTv.printTvInfo()
friend4kTv.turnOff()
print('my8kTv---------------------')
my8kTv = st.Tv8K('75', 'black', '8k')
my8kTv.setSmartTv('on')
my8kTv.setAiTv('on')
my8kTv.turnOn()
my8kTv.printTvInfo()
my8kTv.turnOff()
print('friend8kTv-----------------')
friend8kTv = st.Tv8K('86', 'red', '8k')
friend8kTv.setSmartTv('on')
my8kTv.setAiTv('off')
friend8kTv.turnOn()
friend8kTv.printTvInfo()
friend8kTv.turnOff()
다음 명세서를 참고해서 도서 관리 프로그램을 만들어보자.
class Book:
def __init__(self, name, price, isbn):
self.bName = name
self.bPrice = price
self.bIsbn = isbn
class BookRepository:
def __init__(self):
self.bDic = {} # 책 정보 저장
def registBook(self, b): # 책 등록
self.bDic[b.bIsbn] = b
def removeBook(self, isbn):
del self.bDic[isbn]
def printBooksInfo(self):
for isbn in self.bDic.keys():
b = self.bDic[isbn]
print(f'{b.bName}, {b.bPrice}, {b.bIsbn}')
def printBookInfo(self, isbn):
if isbn in self.bDic:
b = self.bDic[isbn]
print(f'{b.bName}, {b.bPrice}, {b.bIsbn}')
else:
print('Lookup result does not exist')
import book as bk
myBRepository = bk.BookRepository()
myBRepository.registBook(bk.Book('python', 20000, '1234567890'))
myBRepository.registBook(bk.Book('java', 20500, '1234325088'))
myBRepository.registBook(bk.Book('c/c++', 27000, '5901839503'))
myBRepository.printBooksInfo()
myBRepository.printBookInfo('1234325088')
myBRepository.printBookInfo('1234567890')
myBRepository.removeBook('1234567890')
print()
friendBRepository = bk.BookRepository()
friendBRepository.registBook(bk.Book('c#', 26000, '1381948293'))
friendBRepository.registBook(bk.Book('python', 18000, '2346258045'))
myBRepository.printBooksInfo()
friendBRepository.printBookInfo('1381948293')
friendBRepository.printBookInfo('2132547676')
friendBRepository.printBooksInfo()
Book 문제에서 아래 세 가지가 궁금했다.
첫 번째. 어떻게 Book의 클래스 변수에 접근하는가?
두 번째. 매개변수로 어떤 걸 넘기는가?
세 번째. 딕셔너리에 어떠한 형태로 저장이 되는가?
위 세가지 헷갈리는 부분은 하나의 답으로 해결되었다. 바로 객체
예를 들어 myBRepository.registBook(bk.Book('python', 20000, '1234567890'))
문장으로 진행해 보자.
bk.Book('python', 20000, '1234567890')
코드로 Book 객체가 생성되었고 그 객체가 바로 registBook() 매개변수이다. 따라서 객체의 변수에 접근 가능하다.
registBook(b)이기 때문에 위에 설명과 같이 b는 Book 객체이고 self.bDic[b.bIsbn] = b
딕셔너리 안에 book.Book 객체 형태로 저장되고 있다.
추상 클래스를 이용해서 한/영, 한/일 사전 클래스를 만들어보자.
import ADictionary as adic
kTe = adic.KorToEng()
kTe.registWord('책', 'bok')
kTe.registWord('나비', 'butterfly')
kTe.registWord('연필', 'pencil')
kTe.registWord('학생', 'student')
kTe.registWord('선생님', 'teacher')
kTe.printWords()
kTe.updateWord('책', 'book')
kTe.removeWord('연필')
kTe.printWords()
print(f'학생: {kTe.searchWord("학생")}')
from abc import ABCMeta
from abc import abstractmethod
class AbcDictionary(metaclass=ABCMeta):
def __init__(self):
self.wordDic = {}
@abstractmethod # 추상메소드
def registWord(self, w1, w2):
pass
@abstractmethod
def removeWord(self, w1):
pass
@abstractmethod
def updateWord(self, w1, w2):
pass
@abstractmethod
def searchWord(self, w1):
pass
class KorToEng(AbcDictionary): # 상속
def __init__(self):
super().__init__()
def registWord(self, w1, w2):
print(f'[KorToEng] registWord(): {w1} to {w2}')
self.wordDic[w1] = w2
def removeWord(self, w1):
print(f'[KorToEng] removeWord(): {w1}')
del self.wordDic[w1]
def updateWord(self, w1, w2):
print(f'[KorToEng] updateWord(): {w1} to {w2}')
self.wordDic[w1] = w2
def searchWord(self, w1):
print(f'[KorToEng] searchWord(): {w1}')
return self.wordDic[w1]
def printWords(self):
for k in self.wordDic.keys():
print(f'{k}: {self.wordDic[k]}')
주사위 게임 클래스를 만들고 컴퓨터와 사용자의 게임 결과를 출력해 보자.
import dice
dc = dice.Dice()
dc.startGame()
dc.printResult()
import random as rd
class Dice:
def __init__(self):
self.cNum = 0
self.uNum = 0
def setCnum(self):
print('[Dice] setCnum()')
self.cNum = rd.randint(1,6)
def setUnum(self):
print('[Dice] setUnum()')
self.uNum = rd.randint(1,6)
def startGame(self):
print('[Dice] startGame()')
self.setCnum()
self.setUnum()
def printResult(self):
print('[Dice] startGame()')
if self.cNum == 0 or self.uNum == 0:
print('주사위 숫자 설정 전 입니다.')
else:
if self.cNum > self.uNum:
print(f'컴퓨터 vs 유저: {self.cNum} vs{self.uNum} >> 컴퓨터 승!!')
elif self.cNum < self.uNum:
print(f'컴퓨터 vs 유저: {self.cNum} vs{self.uNum} >> 유저 승!!')
else:
print(f'컴퓨터 vs 유저: {self.cNum} vs{self.uNum} >> 무승부!!')
자동차 경주 게임 클래스를 만들어 보자. 자동차는 랜덤하게 이동하며, 편의상 10초 동안 주행한다고 할 때 가장 멀리 이동한 자동차가 우승하는 게임이다.
import random
class Car:
def __init__(self, n='fire car', c='red', s=200):
self.name = n
self.color = c
self.max_speed = s
self.distance = 0
def printCarInfo(self):
print(f'name: {self.name}, color: {self.color}, max_speed: {self.max_speed}')
def controlSpeed(self):
return random.randint(0, self.max_speed)
def getDistanceForHour(self):
return self.controlSpeed() * 1
from time import sleep # 프로그램을 잠시 쉬었다가 진행
class CarRacing:
def __init__(self):
self.cars = []
self.rankings = []
def startRacing(self):
for i in range(10):
print(f'Racing: {i+1}바퀴')
for car in self.cars:
car.distance += car.getDistanceForHour()
sleep(1) # 1초 쉬기
self.printCurrentCarDistance()
def printCurrentCarDistance(self):
for car in self.cars:
print(f'{car.name}: {car.distance}\t\t', end='')
print()
def addCar(self, c):
self.cars.append(c)
from car_game import racing as rc
from car_game import car
myCarGame = rc.CarRacing()
Car01 = car.Car('Car01', 'white', 250)
Car02 = car.Car('Car02', 'black', 200)
Car03 = car.Car('Car03', 'yellow', 220)
Car04 = car.Car('Car04', 'red', 280)
Car05 = car.Car('Car05', 'blue', 150)
myCarGame.addCar(Car01)
myCarGame.addCar(Car02)
myCarGame.addCar(Car03)
myCarGame.addCar(Car04)
myCarGame.addCar(Car05)
myCarGame.startRacing()
mp3 플레이어 클래스를 만들고 노래 등록 후 재생해보자.
import random
from time import sleep
class Song:
def __init__(self, t, s, pt):
self.title = t
self.singer = s
self.play_time = pt
def printSongInfo(self):
print(f'Title: {self.title}, Singer: {self.singer}, Play time: {self.play_time}')
class Player:
def __init__(self):
self.songList = []
self.isLoop = False # 반복 재생 할 것인가?
def addSong(self, s):
self.songList.append(s)
def play(self):
if self.isLoop: # 구간 반복 True
while self.isLoop:
for s in self.songList:
print(f'Title: {s.title}, Singer: {s.singer}, Play time: {s.play_time}sec')
sleep(s.play_time)
else: # 구간 반복 False
for s in self.songList:
print(f'Title: {s.title}, Singer: {s.singer}, Play time: {s.play_time}sec')
sleep(s.play_time)
def suffle(self):
random.shuffle(self.songList) # shuffle: 리스트에서 랜덤으로 골라줌
def setIsLoop(self, flag):
self.isLoop = flag
import player as mp3
s1 = mp3.Song('신호등', '이무진', 3)
s2 = mp3.Song('Permission', '방탄소년단', 4)
s3 = mp3.Song('Butter', '방탄소년단', 2)
s4 = mp3.Song('Weekend', '태연', 5)
s5 = mp3.Song('좋아좋아', '조정석', 4)
player = mp3.Player()
player.addSong(s1)
player.addSong(s2)
player.addSong(s3)
player.addSong(s4)
player.addSong(s5)
player.setIsLoop(False)
player.suffle()
player.play()
player.setIsLoop(False)
인 경우 출력player.setIsLoop(True)
인 경우 출력 (중지 할 때까지 무한 루프)아직 생성자, 상속, 추상클래스 사용에 익숙하지 않으니 좀 더 복습해서 익숙해져야겠다. 오늘 이후로 팀스터디 시작이라 더 바빠질 것 같은데 잘 따라갈 수 있겠지!!?
"이 글은 제로베이스 데이터 취업 스쿨 강의 자료 일부를 발췌한 내용이 포함되어 있습니다."