Sam Park Blog.

Sam의 워드프레스 블로그

Sam Park Blog.

Sam의 워드프레스 블로그

미분류

파이썬 코딩 자율학습단 12기 4주차 학습 후기


이번 4주차는 파이썬의 객체지향 프로그래밍과 예외 처리, 모듈 및 패키지에 대한 심화 학습을 진행한 시간이었습니다. 클래스의 기본 개념을 바탕으로, 다양한 유닛을 활용한 게임 구현을 통해 객체지향 프로그래밍의 원리를 체험했습니다. 또한, 예외 처리를 통해 프로그램의 안정성을 높이는 방법을 배우고, 모듈과 패키지를 활용하여 코드를 구조화하는 기법을 익혔습니다. 이번 시간을 통해서 파이썬 프로그래밍의 기초를 더욱 확고이 하고 다양한 기능을 활용할 수 있는 방법들을 배울수 있는 시간이였습니다.




16일차 : 클래스

3주차 마지막에 학습한 클래스 개념을 이어서 더욱 심화하는 과정이었습니다. 클래스는 객체지향 프로그래밍의 핵심으로, 현실 세계의 사물이나 개념을 코드로 구현할 수 있게 해줍니다. 이번 주차에서는 클래스를 활용하여 간단한 게임을 구현하고, 이를 통해 객체지향 프로그래밍의 원리를 더욱 깊이 이해하게 되었습니다.

게임구현을 위해 Unit, AttackUnit, Soldier, Tank, Flyable, FlyableAttackUnit, Stealth와 같은 다양한 클래스를 정의했습니다. 각 클래스는 특정한 속성과 메소드를 가지며, 유닛 간의 상호작용을 명확히 표현할 수 있었습니다.

예를 들어, Unit 클래스는 기본적인 유닛의 속성을 정의하고, 이동 및 피해를 입는 메소드를 포함하였습니다. 이를 상속받아 AttackUnit클래스는 공격 능력을 추가하였고, Soldier와 Tank 같은 세부 유닛 클래스는 각각의 특성을 반영한 추가 메소드를 구현했습니다.


class Unit:
    def __init__(self, name, hp, speed):
        self.name = name
        self.hp = hp
        self.speed = speed
        print("{0} 유닛을 생성했습니다.".format(self.name))
    
    def move(self, location):
        print("{0}: {1} 방향으로 이동합니다. [속도 {2}]".format(self.name, location, self.speed))

    def damaged(self, damage):
        print("{0}: {1} 만큼 피해를 입었습니다.".format(self.name, damage))
        self.hp -= damage
        print("{0}: 현재 체력은 {1}입니다.".format(self.name, self.hp))
        if self.hp <= 0:
            print("{0}: 파괴됐습니다.".format(self.name))

class AttackUnit(Unit):
    def __init__(self, name, hp, damage, speed):
        super().__init__(name, hp, speed)
        self.damage = damage

    def attack(self, location):
        print("{0}: {1} 방향 적군을 공격합니다. [공격력 {2}]".format(self.name, location, self.damage))

class Soldier(AttackUnit):
    def __init__(self):
        super().__init__("보병", 40, 5, 1)

    def booster(self):
        if self.hp > 10:
            self.hp -= 10
            print("{0}: 강화제를 사용합니다. (HP 10 감소)".format(self.name))
        else:
            print("{0}: 체력이 부족해 기술을 사용할 수 없습니다.".format(self.name))

class Tank(AttackUnit):
    siege_developed = False

    def __init__(self):
        super().__init__("탱크", 150, 35, 1)

    def set_siege_mode(self):
        if not Tank.siege_developed:
            return
        
        print("{0}: 시저 모드로 전환합니다.".format(self.name))
        self.damage *= 2

class Flyable:
    def __init__(self, flying_speed):
        self.flying_speed = flying_speed

    def fly(self, name, location):
        print("{0}: {1} 방향으로 날아갑니다. [속도 {2}]".format(name, location, self.flying_speed))

class FlyableAttackUnit(AttackUnit, Flyable):
    def __init__(self, name, hp, damage, flying_speed):
        AttackUnit.__init__(self, name, hp, damage, 0)
        Flyable.__init__(self, flying_speed)
    
    def move(self, location):
        self.fly(self.name, location)

class Stealth(FlyableAttackUnit):
    def __init__(self):
        super().__init__("전투기", 80, 20, 5)
        self.cloaked = False

    def cloaking(self):
        if self.cloaked:
            print("{0}: 은폐 모드를 해제합니다.".format(self.name))
            self.cloaked = False
        else:
            print("{0}: 은폐 모드를 설정합니다.".format(self.name))
            self.cloaked = True

def game_start():
    print("[알림] 새로운 게임을 시작합니다.")

def game_over():
    print("Player : Good Game")
    print("[Player] 님이 게임에서 퇴장했습니다.")

# 게임 시작
game_start()

# 유닛 생성
so1 = Soldier()
so2 = Soldier()
so3 = Soldier()

ta1 = Tank()
ta2 = Tank()

st1 = Stealth()

# 유닛 리스트에 추가
attack_units = [so1, so2, so3, ta1, ta2, st1]

# 모든 유닛 이동
for unit in attack_units:
    unit.move("1시")

# 탱크의 시지 모드 개발
Tank.siege_developed = True
print("[알림] 탱크의 시지 모드 개발이 완료됐습니다.")

# 유닛별 행동
for unit in attack_units:
    if isinstance(unit, Soldier):
        unit.booster()
    elif isinstance(unit, Tank):
        unit.set_siege_mode()
    elif isinstance(unit, Stealth):
        unit.cloaking()

# 유닛 공격
for unit in attack_units:
    unit.attack("1시")

# 유닛 피해 입기
for unit in attack_units:
    unit.damaged(randint(5, 20))

# 게임 종료
game_over()

이러한 과정을 통해 클래스의 객체와 개념을 실제로 적용해보는 기회를 가졌습니다. 특히, 상속과 다형성을 통해 코드의 재사용성과 유지보수성을 높일 수 있는 점이 매우 인상적이였습니다.


17~18일차 : 예외처리

예외처리는 프로그램 실행 중 발생할 수 있는 오류를 관리하는 중요한 기법으로, 프로그램의 안정성을 높이는 데 필수적입니다.

기본적인 try-except 블록을 사용하여 오류를 처리하는 방법을 배우고, 다양한 오류 상황을 처리하는 코드를 작성했습니다. 특히, 사용자 정의 예외를 만드는 방법을 배우면서 특정 상황에 맞는 오류를 정의하고 처리하는 방법을 익혔습니다.

예를 들어, 한 자리 숫자만 입력받는 나누기 전용 계산기를 구현하면서 사용자가 잘못된 값을 입력했을 때 발생할 수 있는 오류를 처리하는 과정을 통해 예외 처리의 중요성을 깊이 이해하게 되었습니다.


class BigNumberError(Exception):
    def __init__(self, msg):
        self.msg = msg
    
    def __str__(self):
        return "[오류 코드 001] " + self.msg

try:
    num1 = int(input("첫 번째 숫자를 입력하세요 : "))
    num2 = int(input("두 번째 숫자를 입력하세요 : "))
    if num1 >= 10 or num2 >= 10:
        raise BigNumberError("입력값 : {0}, {1}".format(num1, num2))
    print("{0} / {1} = {2}".format(num1, num2, int(num1 / num2)))
except ValueError:
    print("값을 잘못 입력했습니다. 한 자리 숫자만 입력하세요.")
except BigNumberError as err:
    print("오류가 발생했습니다. 한 자리 숫자만 입력하세요.")
    print(err)
finally:
    print("계산기를 이용해 주셔서 감사합니다.")

이러한 사용자 정의 예외를 통해 프로그램 유연성을 크게 향상시킬 수 있었습니다. 예외 처리의 중요성을 깨달으면, 안정적인 프로그램을 만드는 데 필수적인 요소임을 느꼈습니다.




19~20일차 : 모듈과 패키지

여러 기능을 모듈화하여 코드의 가독성과 재사용성을 높이는 방법을 배우고, 실제로 thread_module과 같은 모듈을 만들어 다양한 가격 정책을 구현했습니다.

모듈을 활용하여 특정 기능을 별도의 파일로 분리하고, 필요할 때마다 import하여 사용하는 방법을 배웠습니다. 또한 패키지를 통해 여러 모듈을 그룹화하는 방법을 배워 대규모 프로젝트에서의 코드 관리가 얼마나 효율적인지를 깨달았습니다.


# theater_module.py
def price(people):
    print(f"일반 가격: {people * 10000}원")

def price_morning(people):
    print(f"조조 할인 가격: {people * 6000}원")

def price_soldier(people):
    print(f"군인 할인 가격: {people * 4000}원")

import theater_module as mv

mv.price(3)
mv.price_morning(4)
mv.price_soldier(5)

이러한 모듈화는 코드의 구조를 더욱 명확하게 하고, 나중에 유지보수가 용이하게 만들어 줍니다. 패키지를 통해 여러 모듈을 그룹으로 묶는 방법도 배우며, 대규모 프로젝트에서의 코드 관리 방식을 이해하게 되었습니다.




마무리

4주차 학습은 3주차에서 배운 클래스를 더움 심화하고, 예외처리 및 모듈화를 통해 프로그래밍의 기초를 다지는 중요한 시간이였습니다. 객체지향 프로그래밍의 원리를 이해하고, 예외 처리와 모듈화의 중요성을 깨달으며, 안정적이고 유지보수하기 쉬운 코드를 작성하는 방법을 익힐 수 있었습니다.



답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다