230913_스터디노트

Sihyun Kim·2023년 9월 13일

오늘 노트를 시작하기 전, 나에게도 온 시련에 대해서

OT 때 들었던 얘기가 문득 생각이 나서 다시 찾아보았다.
파이썬 중급 연습문제부터 시련이 찾아 올 것이라는 내용인데,
극복(?) 방법은 이렇다

  1. 빠르게 문제 읽기
  2. 문제에서 요구하는 것에 대해 생각해보기
  3. 문제 풀이 영상 2번 보기
  4. 강의를 끄고 문제 풀이와 똑같이 풀어보기
  5. 기억이 안나면 다시 영상을 틀어서 보기

[연습문제] 클래스(01)

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           #밸류: id, 키값: 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):
        del self.members[i]

    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)

mems.printMembers()

mems.loginMember('qqq', '789')

mems.removeMember('qqq', '789')

mems.printMembers()
  • 빙글빙글... 강의 들으면서 따라 적기 중

[연습문제] 클래스(02)

😅 클래스 상속 - 일단 혼자 짜본 코드

class NormalTv:

    def __init__(self, i, c, r, s, a):
        self.inch = i
        self.color = c
        self.resolution = r
        self.smartTv = s
        self.aiTv = a

    def turnOn(self):
        print('켜짐')

    def turnOff(self):
        print('꺼짐')

    def printTvInfo(self):
        print(self.inch, self.color, self.resolution, self.smartTv, self.aiTv)


class Tv4K(NormalTv):

    def setSmartTv(self):
        print('스마트 TV ON')

class Tv8K(NormalTv):

    def setSmartTv(self):
        print('스마트 TV ON')

    def setAiTv(self):
        print('AI TV ON')

👀 영상 본 다음 다시 복기

#TV.py
class NormalTv:

    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 ON')

    def turnOff(self):
        print('TV 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'AI TV: {self.aiTv}')

class Tv4K(NormalTv):

    def __init__(self, i, c, r='4k'):
        super().__init__(i,c,r)

    def setSmartTv(self, s):
        self.smartTv = s


class Tv8K(NormalTv):

    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 TV as t

my4KTv = t.Tv4K('60', 'silver', '4k')
my4KTv.turnOn()
my4KTv.setSmartTv('on')
my4KTv.printTvInfo()
my4KTv.turnOff()

friend8KTv = t.Tv8K('80', 'gold', '8k')
friend8KTv.turnOn()
friend8KTv.setSmartTv('on')
friend8KTv.setAiTv('on')
friend8KTv.printTvInfo()
friend8KTv.turnOff()

[연습문제] 클래스(03)

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 BookMod as bm

myLib = bm.BookRepository()

myLib.registBook(bm.Book('python', 20000, '1234567890'))
myLib.registBook(bm.Book('Java', 21000, '4561378935'))
myLib.registBook(bm.Book('C++', 25000, '1245798335'))

myLib.printBooksInfo()
print()
myLib.printBookInfo('1234567890')
myLib.removeBook('1234567890')
print()
myLib.printBooksInfo()
  • 딕셔너리에 Book 클래스에서 받은 정보를 어떻게 저장을 하는지? 키값은 어떻게 보이는지?
  • 전체 프린트 구문은 억지로 이해 하려고 해봐도 쓰려고 하면 안나옴 ㅎㅎ
  • 딕셔너리에 대한 개념을 먼저 알아야 할 것 같은데.. 왜 이걸 먼저 하고 있는걸까

[연습문제] 클래스(04)

  • 추상 클래스
from abc import ABCMeta
from abc import abstractmethod

class AbsDictionary(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(AbsDictionary):

    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]}')

class KorToJap(AbsDictionary):

    def __init__(self):
        super().__init__()

    def registWord(self, w1, w2):
        print(f'[KorToJap] registWord() : {w1} to {w2}')
        self.wordDic[w1] = w2

    def removeWord(self, w1):
        print(f'[KorToJap] removeWord() : {w1}')
        del self.wordDic[w1]

    def updateWord(self, w1, w2):
        print(f'[KorToJap] updateWord() : {w1} to {w2}')
        self.wordDic[w1] = w2

    def searchWord(self, w1):
        print(f'[KorToJap] searchWord() : {w1}')
        return self.wordDic[w1]

    def printWords(self):
        for k in self.wordDic.keys():
            print(f'{k} : {self.wordDic[k]}')
import ADictionary as dic

myDic = dic.KorToEng()
myDic.registWord('책','bok')
myDic.registWord('고양이','cat')
myDic.registWord('강아지','dog')
myDic.registWord('테니스','tennis')
myDic.registWord('시계','watch')

myDic.printWords()

myDic.updateWord('책','book')
myDic.removeWord('시계')
myDic.printWords()

print(f'테니스 : {myDic.searchWord("테니스")}')
  • 상속 받은 클래스에서 super().__init__() 쓰는거 잊지말기
  • 전체 프린트 할 때, for문 사용하는 방법 기억하기

[연습문제] 클래스(05)

#dice.py

import random as rd

class Dice:

    def __init__(self):
        self.cNum = 0
        self.uNum = 0

    def setCnum(self):
        print(f'[Dice] setCnum()')
        self.cNum = rd.randint(1,6)
        return self.cNum

    def setUnum(self):
        print(f'[Dice] setUnum()')
        self.uNum = rd.randint(1, 6)
        return self.uNum

    def startGame(self):
        print(f'[Dice] startGame()')

        self.setCnum()
        self.setUnum()			#혼자 풀 때 이걸 빼먹어서 action.py에서 setter를 따로 불러왔음

    def printResult(self):
        print(f'[Dice] printResult()')

        if self.cNum == 0 or self.uNum == 0:
            print('게임을 시작해주세요')

        elif 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} >> 유저 승!!')

        elif self.cNum == self.uNum:
            print(f'컴퓨터 vs 유저 : {self.cNum} vs {self.uNum} >> 무승부!!')
#action.py

import dice as d

myGame = d.Dice()
myGame.startGame()
myGame.printResult()
  • 풀이 영상 한번 보고 90% 이상 구현 완료!

😀 번외 (괜히 자신감 생겨서 사용자 입력 받은 주사위 숫자랑 랜덤 주사위랑 비교하기)

import random as rd

class Dice:

    def __init__(self):
        self.cNum = 0
        self.uNum = 0

    def setCnum(self):
        print(f'[Dice] setCnum()')
        self.cNum = rd.randint(1,6)
        return self.cNum

    def setUnum(self, num1):
        print(f'[Dice] setUnum()')
        self.uNum = num1
        return self.uNum

    def startGame(self):
        print(f'[Dice] startGame()')
        self.setCnum()

    def printResult(self):
        print(f'[Dice] printResult()')

        if self.cNum == 0 or self.uNum == 0:
            print('게임을 시작해주세요')

        elif 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} >> 유저 승!!')

        elif self.cNum == self.uNum:
            print(f'컴퓨터 vs 유저 : {self.cNum} vs {self.uNum} >> 무승부!!')
import dice as d

myGame = d.Dice()
userNum = int(input('숫자 입력: '))
myGame.setUnum(userNum)
myGame.startGame()
myGame.printResult()

[연습문제] 클래스(06)

  • car 모듈은 혼자서 잘 만들었고, racing 모듈은 어려워서 따라쓰기
  • 실행 파일을 모듈 파일 안에 같이 넣어놔서 실행이 안됐음! 주의!
#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 = []

    def startRacing(self):
        for i in range(10):
            print(f'{i+1}바퀴')
            for car in self.cars:
                car.distance += car.getDistanceForHour()

            sleep(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', 'Black', 250)
car02 = car.Car('Car02', 'White', 300)
car03 = car.Car('Car03', 'Red', 220)
car04 = car.Car('Car04', 'Blue', 270)
car05 = car.Car('Car05', 'Yellow', 200)

myCarGame.addCar(car01)
myCarGame.addCar(car02)
myCarGame.addCar(car03)
myCarGame.addCar(car04)
myCarGame.addCar(car05)

myCarGame.startRacing()
  • 혼자 제일 풀기 어려웠던 부분은 racing.py에서
    startRacing >> Car 클래스에 있는 self.distance와 self.getDistanceForHour 가져다쓰는 부분, 그리고 printCurrentCarDistance()를 먼저 써놓고 아래에 정의해주는 거 (🤦‍♀️)

[연습문제] 클래스(07)

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:
            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:
            for s in self.songList:
                print(f'title: {s.title}, singer: {s.singer}, play_time: {s.play_time}sec')
                sleep(s.play_time)

    def shuffle(self):
        random.shuffle(self.songList)


    def setIsLoop(self, flag):
        self.isLoop = flag
import mp3

s1 = mp3.Song('NOW', '핑클', 3)
s2 = mp3.Song('10 minute', '이효리', 4)
s3 = mp3.Song('난', '옥주현', 3)
s4 = mp3.Song('다시 여기 바닷가', '싹쓰리', 5)
s5 = mp3.Song("Don't Touch Me", '환불원정대', 2)

myPlayer = mp3.Player()
myPlayer.addSong(s1)
myPlayer.addSong(s2)
myPlayer.addSong(s3)
myPlayer.addSong(s4)
myPlayer.addSong(s5)

myPlayer.setIsLoop(False)
myPlayer.shuffle()
myPlayer.play()
  • 집중력 흐려져서인지 실행 파일에서 mp3.player() < 이 괄호 안넣어서 계속 오류나고,
    play 할 때 {s.title}이 아니라 {self.title}로 써서 또 오류나고 .. 아이고 두야
profile
문과이과예체능통합형인재

1개의 댓글

comment-user-thumbnail
2023년 9월 13일

오늘은 정말.. 이거맞아? 라는 마음의 소리가 27번 정도 들림

답글 달기