본문 바로가기

Personal Study

멘토씨리즈 Python 예제풀이 / Ch8. 파이썬의 클래스

 

 

Chapter 8. 파이썬의 클래스

 

section15. 클래스와 객체 1

 

기본예제1 

CPU, RAM, VGA, SSD를 구성요소로 갖고있는 Computer 클래스를 이용해서 인스턴스를 생성하는

프로그램입니다. Computer 클래스는 각 구성요소의 값을 저장할 수 잇는 set_spec() 메소드와

구성요소의 값을 출력할 수 있는 hardware_info() 메소드로 구성되어있습니다.
<실행 예>

CPU = i7

RAM = 16GB

VGA = GTX1060

SSD = 512GB

CPU = i5

RAM = 8GB

VGA = MX300

SSD = 256GB


class Computer:
    def set_spec(self, cpu, ram, vga, ssd):
        self.cpu = cpu
        self.ram = ram
        self.vga = vga
        self.ssd = ssd
    def hardware_info(self):
        print('CPU={}'.format(self.cpu))
        print('RAM={}'.format(self.ram))
        print('VGA={}'.format(self.vga))
        print('SSD={}'.format(self.ssd))
desktop = Computer()
desktop.set_spec('i7', '16GB', 'GTX1060', '512GB')
desktop.hardware_info()
notebook = Computer()
notebook.set_spec('i5', '8GB', 'MX300', '256GB')
notebook.hardware_info()



기본예제2

사용자로부터 온전한 수식을 입력받은 뒤 입력된 수식의 결과를 출력하는 Calculator 클래스입니다. input_expr() 메소드로 수식을 입력받을 수 있고, calculate() 메소드로 연산을 수행합니다.
<실행 예>

수식을 입력하세요 >> 1+2

수식 결과는 3입니다.


class Calculator:
    def input_expr(self):
        expr = input('수식을 입력하세요')
        self.expr = expr
    def calculate(self):
        return eval(self.expr)
calc = Calculator()
calc.input_expr()
print('수식결과는 {}입니다.'.format(calc.calculate()))

 

응용예제1

다음 지시사항을 읽고 책 제목과 저자정보를 저장할 수 있는 Book 클래스를 생성하세요.
  책 제목과 책 저자정보를 출력하는 print_info() 메소드를 구현하세요
  book1, book2 인스턴스를 생성하세요.
  생성된 인스턴스 book1, book2를 리스트 book_list에 저장하세요
<실행 예>

책 제목: 파이썬

책 저자: 민경태

책 제목: 어린왕자

책 저자: 생텍쥐페리


book_list=[]
class Book:
    def set_info(self, title, author):
        self.title = title
        self.author = author
    def print_info(self):
        print('제목:{}'.format(self.title))
        print('저자:{}'.format(self.author))
book1=Book()
book2=Book()
book1.set_info('파이썬', '민경태')
book2.set_info('어린왕자', '생택쥐페리')
book_list.append(book1.print_info())
book_list.append(book2.print_info())



응용예제2

다음 지시사항을 읽고 시, 분, 초로 구성된 Watch 클래스를 생성하세요.
  사용자로부터 'HH:mm:ss' 형식의 시간을 입력받아서 이를 Watch 클래스의 hour, minute, second 

  인스턴스 변수에 저장하세요.
  add_hour() 메소드를 이용해서 지정된 시간이 지난 시간을 계산하세요.
  add_minute() 메소드를 이용해서 지정된 분이 지난 시간을 계산하세요.
  add_second() 메소드를 이용해서 지정된 초가 지난 시간을 계산하세요.
  hour는 0~23, minute은 0~59, second는 0~59 사이의 값만 가질 수 있습니다.
<실행 예>

시간을 입력하세요 >>> 12:00:00

계산할 시간을 입력하세요 >>> 3

계산할 분을 입력하세요 >>> 90

계산할 초를 입력하세요 >>> 3690

계산된 시간은 17시 31분 30초입니다.


class Watch:
    def __init__(self, hour, minute, second):
        self.hour = hour
        self.minute = minute
        self.second = second
    def add_hour(self, hours):
        self.hour = (self.hour + hours) % 24
    def add_minute(self, minutes):
        total_minutes = self.hour * 60 + self.minute + minutes
        self.hour = (total_minutes // 60) % 24
        self.minute = total_minutes % 60
    def add_second(self, seconds):
        total_seconds = self.hour * 3600 + self.minute * 60 + self.second + seconds
        self.hour = (total_seconds // 3600) % 24
        self.minute = (total_seconds // 60) % 60
        self.second = total_seconds % 60



응용예제3

다음 지시사항을 읽고 노래 제목과 장르 정보를 저장할 수 있는 Song 클래스와 가수이름과

대표곡 정보를 저장할 수 있는 Singer 클래스를 구현하세요.
  다음과 같은 방법으로 song과 singer 인스턴스를 생성하고 필요한 정보를 저장한 뒤 그 정보를 출력하세요.
  Song 클래스는 다음 메소드를 반드시 갖고 있어야 합니다.
  Singer 클래스는 다음 메소드를 반드시 갖고 있어야 합니다.
<실행 예>

가수이름: 김동률

노래제목: 취중진담(발라드)


class Song:
    def set_song(self, title, genre):
        self.title = title
        self.genre = genre
    def print_song(self):
        print('노래제목:{}({})'.format(self.title, self.genre))
class Singer:
    def set_singer(self, singer):
        self.singer = singer
    def hit_song(self, title, genre):
        self.hit_song = title
        self.genre = genre
    def print_song(self):
        print('가수이름:{}'.format(self.singer))
        print('노래제목:{}({})'.format(self.hit_song, self.genre))

 

section16. 클래스와 객체 2

 

기본예제1

다음은 생성자를 이용해서 용량을 가진 USB 인스턴스를 만드는 프로그램입니다.
<실행 예>

64GB USB


class USB:
    def __init__(self, capacity):
        self.capacity = capacity
    def info(self):
        print('{}GB USB:'.format(self.capacity))
usb = USB(64)
usb.info()



기본예제2

다음은 생성자와 소멸자를 이용해서 서비스 안내 메시지를 출력하는 프로그램입니다.
<실행 예>

길 안내 Service가 시작되었습니다.

길 안내 Service가 종료되었습니다.


class Service:
    def __init__(self, service):
        self.service = service
        print('{} Service가 시작되었습니다'.format(self.service))
    def __del__(self):
        print('{} Service가 종료되었습니다'.format(self.service))
s = Service('길 안내')
del s



기본예제3

다음은 가방을 만들 때 마다 현재 만들어진 가방이 몇 개인지 계산할 수 있는 Bag 클래스입니다.
<실행 예>

현재 가방: 0개

현재 가방: 3개

현재 가방: 1개


class Bag:
    count = 0
    def __init__(self):
        Bag.count += 1
    @classmethod
    def sell(cls):
        cls.count -= 1
    @classmethod
    def remain_bag(cls):
        return cls.count
print('현재가방:{}개'.format(Bag.remain_bag()))
bag1 = Bag()
bag2 = Bag()
bag3 = Bag()
print('현재가방:{}개'.format(Bag.remain_bag()))
bag1.sell()
bag2.sell()
print('현재가방:{}개'.format(Bag.remain_bag()))



기본예제4

원두(bean)를 저장하는 Coffee 클래스와 원두(bean)에 물(water)을 섞은 Espresso 클래스를 상속 관계로

구현하였습니다.
<실행 예>

원두: 콜롬비아

물: 30ml


class Coffee:
    def __init__(self, bean):
        self.bean = bean
    def coffee_info(self):
        print('원두:{}'.format(self.bean))
class Espresso(Coffee):
    def __init__(self, bean, water):
        super().__init__(bean)
        self.water = water
    def espresso_info(self):
        print('물:{}ml'.format(self.water))
coffee = Espresso('콜롬비아', 30)
coffee.espresso_info()



응용예제1

다음 지시사항을 읽고 이름과 전체 인구수를 저장할 수 있는 Person 클래스를 생성하세요.
  지시사항:
  1. 다음과 같은 방법으로 man과 woman 인스턴스를 생성하세요.
      man = Person('james')
      woman = Person('emily')
  2. man과 woman 인스턴스가 생성되면 다음과 같은 메시지를 출력할 수 있도록 처리하세요.
      james is born.
      emily is born.
  3. 다음 코드를 통해서 전체 인구수를 조회할 수 있도록 처리하세요
      print('전체 인구수: {}명'.format(Person.get_population())) # 전체 인구수: 2명
  4. 다음과 같은 방법으로 man 인스턴스를 삭제하세요.
      del man
  5. man 인스턴스가 삭제되면 다음과 같은 메시지를 출력할 수 있도록 처리하세요.
      james is dead.
<실행 예>

james is born.

emily is born.

전체 인구수: 2명

james is dead.

전체 인구수: 1명


class Person:
    population = 0  # 클래스 변수로 전체 인구수를 저장할 변수를 추가합니다.
    def __init__(self, name):
        self.name = name
        Person.population += 1 # 인스턴스가 생성될 때마다 전체 인구수를 1 증가시킵니다.
    @staticmethod  # 전체 인구수를 조회하는 메소드는 클래스 메소드 대신 정적 메소드로 구현합니다.
    def get_population():
        return Person.population
    def __str__(self): # 인스턴스를 문자열로 표현하기 위해 __str__ 메소드를 오버라이딩합니다.
        return self.name
    def __del__(self): # 인스턴스가 삭제될 때마다 전체 인구수를 1 감소시킵니다.
        Person.population -= 1
        print('{} is dead'.format(self.name))
# man과 woman 인스턴스 생성
man = Person('james')
woman = Person('emily')
# man과 woman 인스턴스 생성 메시지 출력
print('{} is born'.format(man)) 
print('{} is born'.format(woman))
# 전체 인구수 조회
print( '전체 인구수: {}명'.format(Person.get_population()))
# man 인스턴스 삭제
del man
# 전체 인구수 조회
print( '전체 인구수: {}명'.format(Person.get_population()))



응용예제2

다음 지시사항을 읽고 가게의 매출을 구할 수 있는 Shop 클래스를 구현하세요.
  지시사항:
  1. Shop 클래스는 다음과 같은 클래스 변수를 갖고 있습니다. total은 전체 매출액을 의미하고, menu_list의 각 요소는 {메뉴명:가격}으로 구성된 딕셔너리입니다.
      total = 0
      menu_list = [{'떡볶이':3000}, {'순대':3000}, {'튀김':500}, {'김밥':2000}]
  2. 매출이 생기면 다음과 같은 방식으로 메뉴와 판매량을 작성합니다.
      Shop.sales('떡볶이', 1) # 떡볶이 1개를 판매
      Shop.sales('김밥', 2) # 김밥 2개를 판매
      Shop.sales('튀김', 5) # 튀김 5개를 판매
  3. 모든 매출을 작성한 뒤 다음과 같은 방식으로 전체 매출액을 확인합니다.
      print('매출: {}원'.format(Shop.total)) # 매출: 9500원


class Shop:
    total = 0
    menu_list = [{'떡볶이':3000}, {'순대':3000}, {'튀김':500}, {'김밥':2000}]
    @classmethod
    def sales(cls, menu, quantity):
        for item in cls.menu_list:
            if menu in item:
                price = item[menu]
                sales_amount = price * quantity
                cls.total += sales_amount
                break
Shop.sales('떡볶이', 1) # 떡볶이 1개를 판매
Shop.sales('김밥', 2) # 김밥 2개를 판매
Shop.sales('튀김', 5) # 튀김 5개를 판매
print('매출: {}원'.format(Shop.total)) # 매출: 9500원



응용예제3

다음 지시사항을 읽고 Hybrid 클래스를 구현하세요.
  지시사항:
  1. 다음과 같은 슈퍼클래스 Car를 갖고 있는 서브클래스 Hybrid를 구현하세요. (아래 참고)
  2. 서브클래스 Hybrid는 다음과 같은 특징을 갖고있습니다.
      최대 배터리 충전량은 30입니다.
      배터리를 충전하는 charge() 메소드가 있습니다. 최대 충전량을 초과하도록 충전할 수 없고, 0보다 작은 값으로 충전할 수 없습니다.
      현재 주유량과 충전량을 모두 확인할 수 있는 hybrid_info() 메소드가 있습니다.
  3. 다음과 같은 방식으로 전체 동작을 확인할 수 있습니다. (아래 참고)


class Car:

    max_oil = 50 #최대 주유량
    def __init__(self, oil):
        self.oil = oil
    def add_oil(self, oil):
        if oil <= 0: #0 이하의 주유는 진행하지 않음
            return
        self.oil += oil
        if self.oil > Car.max_oil: # 주유 후 최대 주유량 초과 상태인 경우
            self.oil = Car.max_oil # 현재 주유량을 최대 주유량으로 설정
    def car_info(self):
        print('현재 주유상태:{}'.format(self.oil))
class Hybrid(Car):
    max_battery = 30
    def __init__(self, oil, battery):
        super().__init__(oil)
        self.battery = battery
    def charge(self, battery):
        if battery <= 0:
            return
        self.battery += battery
        if self.battery > Hybrid.max_battery:
            self.battery = Hybrid.max_battery
    def hybrid_info(self):
        print('현재주유상태:{}, 현재충전상태{}'.format(self.oil, self.battery))
car=Hybrid(0,0)
car.add_oil(100)
car.charge(50)
car.hybrid_info()