[Python] 중급 문제 풀이 - 클래스

박미영·2023년 3월 13일
0

📌클래스 연습 문제


📍문제 1 - 회원가입

회원가입 클래스와 회원정보를 관리하는 클래스를 만들고 회원가입 로그인 기능을 구현해 보자.

  • member.py
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]}')
  • ex.py
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()
  • 출력결과



📍문제 2(상속) - TV

TV클래스를 다음과 같은 상속 구조로 만들고 객체를 생성해 보자.


  • smartTv.py
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

  • ex.py
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()

  • 출력결과




📍문제 3 - 도서 관리 프로그램

다음 명세서를 참고해서 도서 관리 프로그램을 만들어보자.


  • smartTv.py
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')
  • ex.py
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 객체 형태로 저장되고 있다.

  • print(b) 출력



📍문제 4 - 추상클래스(한/영 사전)

추상 클래스를 이용해서 한/영, 한/일 사전 클래스를 만들어보자.

  • ex.py
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("학생")}')
  • ADictionary.py
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]}')
  • 출력결과



📍문제 5 - 주사위 게임

주사위 게임 클래스를 만들고 컴퓨터와 사용자의 게임 결과를 출력해 보자.

  • ex.py
import dice

dc = dice.Dice()
dc.startGame()
dc.printResult()
  • dice.py
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} >> 무승부!!')
  • 출력결과




📍문제 6 - 자동차 경주 게임

자동차 경주 게임 클래스를 만들어 보자. 자동차는 랜덤하게 이동하며, 편의상 10초 동안 주행한다고 할 때 가장 멀리 이동한 자동차가 우승하는 게임이다.

  • car.py
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
  • racing.py
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)
  • ex.py
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()
  • 출력결과



📍문제 7 - mp3 플레이어

mp3 플레이어 클래스를 만들고 노래 등록 후 재생해보자.

  • player.py
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
  • ex.py
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) 인 경우 출력 (중지 할 때까지 무한 루프)


느낀 점😊

아직 생성자, 상속, 추상클래스 사용에 익숙하지 않으니 좀 더 복습해서 익숙해져야겠다. 오늘 이후로 팀스터디 시작이라 더 바빠질 것 같은데 잘 따라갈 수 있겠지!!?


"이 글은 제로베이스 데이터 취업 스쿨 강의 자료 일부를 발췌한 내용이 포함되어 있습니다."

0개의 댓글