Python_class;클래스_문제풀이

jaam._.mini·2023년 11월 10일
0

📒Python 기초 수학

목록 보기
10/46

class의 개념을 다시 짚고 넘어가 보자

class 000:
	def __init___(self, ▲▲,●):
    	self.▲▲ = ▲▲
        self.● = ●

📌class ( ):

잘 정리된 내용이 있어 가져와 봤다.

출처 : https://blog.naver.com/chanlan_v/222771943280

기본 class 문장이다.
색깔로 다섯 가지 개념을 구분해 표시했다

  • 맨 위에 있는 class 구문은 클래스를 선언하는 문장이다.
  • 바로 아래에 있는 하늘색 변수 선언은 클래스 변수를 의미한다.
  • 붉게 표시한 init 함수는 매직 메서드 중, 객체를 만들 때 마다 초기값으로 설정하기 위해 만든 메서드이다. 여기서 지정한 인수/파라미터 갯수와 타입은 클래스를 활용해 새로운 객체를 만들때 꼭 맞추어야 한다.

아래 예시를 보면, dog1라는 객체를 클래스를 활용해 만들고, 초기화 함수에서 지정한 대로 이름과 크기 두 개를 넣어주었다. dog1을 생성하고, 클래스 안에 있는 callName 함수를 불러서 이름을 프린트 했다.

dog1=Animal('mummu','small')
dog1.callName()

--> mummu

상속 + super() 문장이다.

  • 아래 부분이 상위 클래스에서 쓴 두 인스턴스 변수를 그대로 상속해서 받아온 하위 클래스를 정의한 코드이다.
  • 하위 클래스를 정의할 때, 클래스 이름 뒤에 소괄호로 상위 클래스(base class) 이름을 넣어주면 된다.
  • super(). 방식을 사용해서 상위 클래스에서 정의한 init 메서드를 그대로 가져왔다.
  • Dog 클래스에서 새롭게 정의한 breed 변수만 self.bread=bread 구문을 써서 새롭게 정의했다.

다중상속 class 문장이다.

  • Animal 클래스에 있는 모든 메서드와 name,size 인스턴스 변수를 그대로 사용
  • Pet 클래스에 있는 nickname 변수와 모든 메서드를 쓸 수 있다.
  • 모든걸 상속받은 Dog 하위 클래스는 breed 변수 하나를 추가해서 새롭게 정의해 사용하게 된다.

📌key값_value값

딕셔너리는 키와 밸류로 구성
myDictionary = {'key1' : 'value1'}

리스트는 그 안의 값의 순차가 중요
딕셔너리는 키 자체가 중요


Ex. 게임 이름
myGame = {-witcher3' : '100', 'zelda' : '90'}


Ex.인덱스 하는 방법
(딕셔너리 안에서 특정 키 값의 밸류를 불러오는 방법)

print(myGame['witcher3'])
--> 100 #출력

Ex. 항목 추가 방법

myGame['하스스톤'] = '70'
print(myGame)

Ex.딕셔너리 초기화

myGame = {}

Ex.딕셔너리 반복문

for game in myGame:
	print(game)
-->witcher3
-->zelda
for game in myGame:
	print(myGame[game])
-->100
-->90

모듈 예제(1)

Q.객체를 이용한 프로그래밍

출처 : 제로베이스

📝문제풀이

[member.py]

class Member:
    def __init__(self, i, p): #아이디, 패스워드
        self.id = i
        self.pw = p

class MemberRepository: #여러명의 회원이 모여있는 class

    def __init__(self):
        self.members = {} #딕셔너리 생성 (아이디 : 키, 정보 : 밸류)

    def addMember(self, m): # 회원 추가 (m은 멤버 객체)
        self.members[m.id] = m.pw #[m.id]:키, m.pw:밸류

    def loginMember(self, i, p): # 로그인 할때
        isMember = i in self.members #아이디가 있으면, isMember(멤버이다)

        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]}') #밸류값
[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) # mems에 회원을 추가하는 기능

mems.printMembers()

mems.loginMember('abc@gmail.com, 1234')

mems.printMembers()

모듈 예제(2) _ 상속⭐

Q. 티비 모델 출력

📝문제 풀이

[smart.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' # 기본tv니까 기능off
        self.aiTv = 'off' # 기본tv니까 기능off

    def turnOn(self): # 기본 기능 부여
        print('TV power on!!')

    def turnOff(self): # 기본 기능 부여
        print('TV power off!!')

    def printTvInfo(self): # tv 스펙 나열
        print(f'inch: {self.inch}inch') #인치
        print(f'color: {self.color}') #색상
        print(f'resolution: {self.resolution}') # 해상도
        print(f'smartTv: {self.smartTv}') # 스마트 tv
        print(f'aiTv: {self.aiTv}') # ai티비

## 상속을 받아보자! ▼
class Tv4k(NormalTv): # nomal tv의 모든 기능 이제 이용 가능

    def __init__(self, i, c, r='4k'):
        super().__init__(i, c, r) # 이런 정보를 상위로 올려줘야 함 + 객체 초기화

    def setSmartTv(self, s): # 스마트 tv가 지원이 되게 설정
        self.smartTv = s

# 4K 처럼 8k도 만듬
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


if __name__ == '__main__':
    my4KTv = Tv4k('65', 'silver', '4K')
    my4KTv.setSmartTv('on')
    my4KTv.turnOn()
    my4KTv.printTvInfo()
    my4KTv.turnOff()

    my8KTv = Tv8k('75', 'black', '8K')
    my8KTv.setSmartTv('on')
    my8KTv.setAiTv('on')
    my8KTv.turnOn()
    my8KTv.printTvInfo()
    my8KTv.turnOff()
[ex.py]

import smart as st

my4KTv = st.Tv4k('65', 'silver', '4K')
my4KTv.setSmartTv('on')
my4KTv.turnOn()
my4KTv.printTvInfo()
my4KTv.turnOff()


friend4KTv = st.Tv4k('55', 'white', '4K')
friend4KTv.setSmartTv('off')
friend4KTv.turnOn()
friend4KTv.printTvInfo()
friend4KTv.turnOff()



my8KTv = st.Tv8k('75', 'black', '8K')
my8KTv.setSmartTv('on')
my8KTv.setAiTv('on')
my8KTv.turnOn()
my8KTv.printTvInfo()
my8KTv.turnOff()


friend8KTv = st.Tv8k('86', 'red', '8K')
friend8KTv.setSmartTv('on')
friend8KTv.setAiTv('off')
friend8KTv.turnOn()
friend8KTv.printTvInfo()
friend8KTv.turnOff()

모듈 예제(3)

Q. 도서 관리 프로그램 제작

📝문제 풀이

[book.py]

class Book:

    #이름, 가격, isbn 3가지 속성 만들기
    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 #isbn에 책(b)를 저장한다.

    # isbn을 이용해서 삭제 한다 (삭제 : del 키워드 사용)
    def removeBook(self, isbn):
        del self.bDic[isbn]

    # 전체 도서 출력
    def printBooksinfo(self):
        for isbn in self.bDic.keys(): # 키 값을 전부 사용
            b = self.bDic[isbn] # isbn 값을 가져오겠다
            print(f'{b.bName}, {b.bPrice}, {b.bIsbn}') # 책 정보 출력

    #한권의 특정 정보를 출력하겠다
    def printBookInfo(self, isbn):
         if isbn in self.bDic: # isbn이 딕셔너리에 있다면
            b = self.bDic[isbn] # 딕셔너리에서 isbn을 가져오겠다
            print(f'{b.bName}, {b.bPrice}, {b.bIsbn}') #출력해달라

        else: #반면에 없으면 (=찾는 책이 없다)
            print('Lookup result does not exist')
[ex.py]

import book as bk

# 책 저장소를 가져옴
myBReposit = bk.BookRepository()

# bk에 있는 책 정보 하나씩 생성을 해줘야 함
myBReposit.registBook(bk.Book('python', 20000, '1234567890'))
myBReposit.registBook(bk.Book('java', 25000, '852147963'))
myBReposit.registBook(bk.Book('c/c++', 27000, '951378624'))
myBReposit.registBook(bk.Book('javascript', 15000, '9874563254'))


myBReposit.printBooksInfo() # 모든 책의 정보 출력
myBReposit.printBookInfo('1234567890') # 특정 책의 정보 출력
myBReposit.removeBook('1234567890') # 특정 책 삭제
myBReposit.printBooksInfo()


# 또 다른 객체 생성도 가능 (class는 이미 만들어놨기 때문에 활용이 가능)
friendBReposit = bk.BookRepository()

friendBReposit.registBook(bk.Book('python', 10000, '1234567890'))
friendBReposit.registBook(bk.Book('java', 15000, '852147963'))
friendBReposit.registBook(bk.Book('c/c++', 17000, '951378624'))
friendBReposit.registBook(bk.Book('javascript', 5000, '9874563254'))

friendBReposit.printBooksInfo()
friendBReposit.printBookInfo('1234567890')
friendBReposit.removeBook('1234567890')
friendBReposit.printBooksInfo()

모듈 예제(4)

📌추상 class

  1. 추상클래스란?
  • 구현해야 할 함수 목록에 맞춰 함수를 미리 등록해 두는 것
  • 반드시 구현해야 할 함수 목록을 작성한 후
  • 작성한 함수 목록의 개수대로 다시 함수를 정의해야 함
  • 정의한 함수 목록에서 하나라도 함수의 정의(실행코드)가 빠지면 에러
  1. 추상클래스를 사용하는 이유
  • 제한 조건을 만족할 때만 함수가 실행되게 함
  • 코드가 꼬이지 않게 하기 위함
  1. 사용 방법
#추상 클래스 호출
from abc import 불러올메타 이름

#추상클래스명에서 불러올 메타를 metaclass로 지정
class 추상클래스명 (metaclass=불러올 메타 이름)

#추상 클래스에 등록할 1번째 함수 등록
	@abstractmethod
	def 함수명1 (self):
		pass

#추상 클래스에 등록할 2번째 함수 등록
	@abstractmethod
	def 함수명2 (self):
		pass

.
.
.
#추상 클래스에 등록항 함수의 개수만큼 함수를 지정
class 클래스명2(추상클래스명):
	def 함수명1(self):
		print( )
	def 함수명2(self):
		print( )
  1. 함수 목록 등록
from abc import*

class Class (metaclass = ABCMeta):

	@abstractmethod
	def courese(self):
		pass

	@abstractmethod
	def lecture(self):
		pass

	@abstractmethod
	def student(self):
		pass
  1. 등록한 함수 목록에 맞춰 함수 정의
#AI클래스는 (Class클래스를 참조):
class AI(Class):
	
#course(self)는 000입니다. 출력
	def course(self):
		print('')

	def lecture(self):
		print('')

	def student(self):
		print('')

c = AI()  #c는 AI()클래스를 불러옴
c.course() #c.course를 실행해라
c.lecture()
c.student()

Q. 클래스를 이용한 사전 만들기

📝문제 풀이

from abc import ABCMeta
from abc import abstractmethod

##추상 클래스를 이용한 한영사전 제작
class AbsDictionary(metaclass=ABCMeta):

#생성자 init method 만들기
# wordDic에 저장할 예정
    def __init__(self):
        self.wordDic = {}

#추상 메쏘드 @abstractmethod
#단어를 등록할때 한글(w1)과 영어(w2)
    @abstractmethod
    def registWord(self, w1, w2):
        pass

# 삭제는 키값으로만 사용할 1개만 있으면 됢
    @abstractmethod
    def removeWord(self, w1):
        pass


#업데이트는 1을 2로 바꿔야 하니까 2개
    @abstractmethod
    def updateWord(self, w1, w2):
        pass

    @abstractmethod
    def searchWord(self, w1):
        pass

#한영사전 : KorToEng, AbsDictionary 상속받기 위해 명시
class KorToEng(AbsDictionary):

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

    def registWord(self, w1, w2):
        # print([클래스명] registWord 호출 : 1을 2로 번역)
        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:
            print(f'{k} : {self.wordDic[k]}')


class KorToJpa(AbsDictionary):

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

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

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

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

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

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

kTe = dic.KorToEng()

# 단어 등록
kTe.registWord('책', 'bok')
kTe.registWord('나비', 'butterfly')
kTe.registWord('연필', 'pencil')
kTe.registWord('학생', 'studen')
kTe.registWord('선생님', 'teacher')

# 단어 수정
kTe.updateWord('책', 'book')
kTe.updateWord('학생', 'student')

# 단어 검색
print(f'책 : {kTe.searchWord("책")}')
print(f'나비 : {kTe.searchWord("나비")}')
print(f'연필 : {kTe.searchWord("연필")}')
print(f'학생 : {kTe.searchWord("학생")}')
print(f'선생님 : {kTe.searchWord("선생님")}')

# 단어 삭제
kTe.removeWord('책')

# 사전 출력
kTe.printWords()


kTj = dic.KorToJpa()

# 단어 등록
kTj.registWord('책', '本')
kTj.registWord('나비', '蝶')
kTj.registWord('연필', '鉛筆')
kTj.registWord('학생', '学生')
kTj.registWord('선생님', '先生')

# 단어 수정
kTj.updateWord('책', '蝶')
kTj.updateWord('학생', '学生')

# 단어 검색
print(f'책 : {kTj.searchWord("책")}')
print(f'나비 : {kTj.searchWord("나비")}')
print(f'연필 : {kTj.searchWord("연필")}')
print(f'학생 : {kTj.searchWord("학생")}')
print(f'선생님 : {kTj.searchWord("선생님")}')

# 단어 삭제
kTj.removeWord('책')

# 사전 출력
kTj.printWords()

예제(05)

Q. 객체를 이용한 프로그래밍
주사위 게임 클래스를 만들고 컴퓨터와 사용자의 게임 결과를 출력해보자

📌randint()

일정한 범위의 정수 중 난수를 만들어줌
random.randint(시작, 끝)

random.randint(1, 6)
   --> 1부터 6까지의 정수 중 하나를 뽑는 것

★ range와 다르게 [끝]숫자 까지 포함한다

  • random() 정리표

출처/참고 : 제로베이스 데이터 취업스쿨스터디노트
profile
비전공자의 데이터 공부법

0개의 댓글