class
의 개념을 다시 짚고 넘어가 보자class 000: def __init___(self, ▲▲,●): self.▲▲ = ▲▲ self.● = ●
잘 정리된 내용이 있어 가져와 봤다.
기본 class 문장이다.
색깔로 다섯 가지 개념을 구분해 표시했다
아래 예시를 보면, dog1라는 객체를 클래스를 활용해 만들고, 초기화 함수에서 지정한 대로 이름과 크기 두 개를 넣어주었다. dog1을 생성하고, 클래스 안에 있는 callName 함수를 불러서 이름을 프린트 했다.
dog1=Animal('mummu','small')
dog1.callName()
--> mummu
상속 + super() 문장이다.
다중상속 class 문장이다.
딕셔너리
는 키와 밸류로 구성
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
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()
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()
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()
- 추상클래스란?
- 추상클래스를 사용하는 이유
- 사용 방법
#추상 클래스 호출
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( )
- 함수 목록 등록
from abc import*
class Class (metaclass = ABCMeta):
@abstractmethod
def courese(self):
pass
@abstractmethod
def lecture(self):
pass
@abstractmethod
def student(self):
pass
- 등록한 함수 목록에 맞춰 함수 정의
#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()
Q. 객체를 이용한 프로그래밍
주사위 게임 클래스를 만들고 컴퓨터와 사용자의 게임 결과를 출력해보자
일정한 범위의 정수 중 난수를 만들어줌
random.randint(시작, 끝)
random.randint(1, 6)
--> 1부터 6까지의 정수 중 하나를 뽑는 것
★ range와 다르게 [끝]숫자 까지 포함한다