본문 바로가기
Python/객체지향 및 자료구조

객체 생성 연습

by hooni40 2021. 7. 8.
728x90
반응형

안녕하세요, 지난 시간까지 Class를 이용한 객체 생성 전반에 대해 정리를 하였는데요, 오늘은 이제까지 배운 것들을 활용하여 객체 생성 연습을 해보고자 합니다. 이전까지 공부한 내용들은 옆에 메뉴에서 확인 부탁드립니다! 문제들은 Codeit이라는 인터넷 강의를 참조하였습니다!

 

Q1. 배달음식 메뉴 생성

 배달 음식 메뉴를 나타낼 클래스를 작성하는 건데요. MenuItem 클래스가 가져야 할 다음 조건들을 보고 배달 음식 메뉴를 나타내는 MenuItem 클래스를 정의해보세요.

 

인스턴스 변수(타입):

-. name(문자열): 메뉴 이름

-. price(숫자): 메뉴 가격

인스턴스 메소드:

-. __init__: MenuItem 클래스의 모든 인스턴스 변수를 초기화한다.

-. __str__: MenuItem 인스턴스의 정보를 문자열로 리턴한다. 단, 리턴 형식은 아래의 출력 예시와 같은 형식이어야 한다.

 

Code / 결과물

class MenuItem:
    def __init__(self, name, price):
        self.name = name
        self.price = price

    def __str__(self):
        return "{} 가격: {}".format(self.name, self.price)


menu1 = MenuItem("햄버거", 4000)
menu2 = MenuItem("콜라", 1500)
menu3 = MenuItem("후라이", 1500)

print(menu1)
print(menu2)
print(menu3)

 

위와 같이 객체들을 출력했을 때 __str__에 의해 원하는 결과를 얻을 수 있었습니다.

 

Q2. 계산기 만들기 

 계산기 클래스를 만들려 합니다. 여기서 주의할 점은 속성은 없고 행동만 있는 객체를 생성하려 하기 때문에 정적 메소드라는 메소드를 사용하여야합니다. 정적 메소드는 인스턴스 변수나 클래스 변수를 쓰지 않을 때 사용하는 것으로 정적 메소드 데코레이터(@staticmethod)를 붙여 만들어 줍니다.

 

Code / 결과물

class SimpleCalculator:
    @staticmethod
    def add(a, b):
        return a + b

    @staticmethod
    def substract(a, b):
        return a - b

    @staticmethod
    def multiply(a, b):
        return a * b

    @staticmethod
    def divide(a, b):
        return a / b

calculator = SimpleCalculator()

print(SimpleCalculator.add(3,5))
print(SimpleCalculator.substract(7,5))
print(SimpleCalculator.divide(10,5))

 

 

위와 같이 인스턴스 변수, 클래스 변수를 사용하지 않는 다면 정적메소드를 사용할 수도 있습니다.

 

Q3. 게임 캐릭터 만들기

게임 캐릭터를 ‘클래스’로 작성하는 것입니다. 이미 객체의 속성과 행동을 뭐로 할지에 대해서는 생각을 마친 상태입니다. 다음 조건들과 출력 예시에 맞게 GameCharacter클래스를 작성하세요.

 

인스턴스 변수(타입):

-. name(문자열): 캐릭터의 이름

-. hp(숫자형): 캐릭터의 체력

-. power(숫자형): 캐릭터의 공격력

인스턴스 메소드:

-. __init__: 사용할 모든 인스턴스 변수 설정

-. is_alive: 게임 캐릭터의 체력이 0보다 큰지 확인(0 초과이면 True, 이하이면 False 리턴)

 

-. get_attacked: 게임 캐릭터의 체력이 0보다 큰 상태이면 파라미터로 받은 공격력만큼 체력 깎인다.

조건:

is_alive 메소드를 사용해 인스턴스가 살아있는 경우에만 체력을 깍는다. 이미 캐릭터가 죽었으면 죽었다는 메시지 출력

남은 체력보다 공격력이 더 크면 체력(hp)을 0으로 설정

 

-. attack: 파라미터로 받은 다른 캐릭터의 체력을 자신의 공격력만큼 깎는다.

조건:

is_alive 메소드를 이용해 살아있는 인스턴스만 공격할 수 있도록 한다.

get_attacked 메소드를 사용

 

-. __str__: 게임 캐릭터의 의미 있는 정보를 포함한 문자열 리턴

 

class GameCharacter:
    # 인스턴스 속성을 정의
    def __init__(self, name, hp, power):
        self.name = name
        self.hp = hp
        self.power = power
    
    #생존여부 확인 -> if문 없이 return문 이용하는 연습!!
    def is_alive(self):
        return self.hp > 0

    #ternary expression을 이용해서 if문을 한줄에 나타내자!!!
    def get_attacked(self, damage):
        if self.is_alive():
            self.hp = self.hp - damage if self.hp >= damage else 0
        else:
            print("{}는 이미 죽었습니다.".format(self.name))

    #객체도 파라미터로 받을 수 있다!
    def attack(self, other_character):
        if self.is_alive():
            other_character.get_attacked(self.power)

    def __str__(self):
        return self.name + "님의 hp는 " + str(self.hp) + "만큼 남았습니다."

#게임 케릭터 인스턴스 생성
character_1 = GameCharacter("하히후헤호", 200, 30)
character_2 = GameCharacter("아야어여", 300, 50)

character_2.attack(character_1)
character_2.attack(character_1)
character_2.attack(character_1)
character_2.attack(character_1)
character_2.attack(character_1)

print(character_1)
print(character_2)

 

 

머릿속으로는 이해하고 있었다고 생각했었는데 막상 문제를 풀어보니 아직 완벽히 이해는 못 한 것 같습니다!

앞으로 객체지향에 대해 더 깊이 공부하면서 복습도 꾸준히 해보겠습니다!

728x90
반응형

'Python > 객체지향 및 자료구조' 카테고리의 다른 글

가변 타입 / 불변 타입  (0) 2021.07.04
클래스 메소드  (0) 2021.07.03
__str__ 메소드  (0) 2021.05.10
__init__ 메소드  (0) 2021.05.08
인스턴스 메소드 / 변수  (0) 2021.05.07

댓글