[Python] practice 1. 구분선 출력

 

지금 하는 프로젝트들은 콘솔로 실행해 보는 것이 전부다. 그래서 콘솔창에 출력을 깔끔하게 하기 위해서 아래 코드처럼 구분선을 하나하나 넣어왔다.

 

def unit_info(self):
    print("-----------------------------------------")
    print("┌ 캐릭터명 : " + self.get_name())
    print("│ 체력 : " + str(self.get_hp()) + " / " + str(self.get_max_hp()))
    if self.equipped_weapon:
        print("└ 장착무기 : " + self.equipped_weapon.get_name())
        print("└ 공격력 : " + str(self.get_min_damage()) + " ~ " + str(self.get_max_damage()))
    else:
        print("└ 장착무기 : 없음")
    print("-----------------------------------------")

 

하지만 구분선을 사용하는 곳이 한두군데도 아니고 이제 코딩을 배운 지도 한 달이 되어가는데 조금은 발전해야 하지 않을까? 그래서 line 메서드를 추가해 보았다.

 

class Unit(ABC):
    @staticmethod
    def line():
        print("-----------------------------------------")

class Character(Unit):
    def unit_info(self):
        Unit.line()
        print("┌ 캐릭터명 : " + self.get_name())
        print("│ 체력 : " + str(self.get_hp()) + " / " + str(self.get_max_hp()))
        if self.equipped_weapon:
            print("└ 장착무기 : " + self.equipped_weapon.get_name())
            print("└ 공격력 : " + str(self.get_min_damage()) + " ~ " + str(self.get_max_damage()))
        else:
            print("└ 장착무기 : 없음")
        Unit.line()

 

Unit 클래스에 line 메서드를 정적 메서드로 정의하고 하위 클래스들에서 Unit.line()으로 접근하게끔 코드를 변경해 보았다. 이렇게 하면 코드 중복을 피하고 구분선 출력 부분을 한 곳에서 관리할 수 있게 되니 훨씬 깔끔해졌다. 별 것 아닌데도 뿌듯했다.

 

그러고 나서 나머지 코드들을 변경하다가 문득 데코레이터에 대해서 배운 것이 생각났다. 지금 구분선을 넣는 작업이 데코레이터와 비슷한 것 아닌가 싶었다. 그래서 다시 수업시간에 배운 것들과 책을 보며 해당 부분에 대해 정리해 보기로 했다.

 

데코레이터(decorator)

def log_decorator(func):
    def wrapper(*args, **kwargs):
        print(func.__name__, "함수가 실행되기 전")
        result = func(*args, **kwargs)
        print(func.__name__, "함수가 실행된 후")

        return result
    return wrapper
    
@log_decorator
def function():
    print("데코레이터 함수 실행")
    
function()

 

이런 식으로 작성하며 배워서 구분선 출력만 놓고 봤을 때 비슷한 개념인 줄 알았다. 하지만 공부를 하다 보니 전혀 다르다는 것을 이해하게 되었다.

 

데코레이터는 주로 함수나 메서드의 동작을 수정하거나 확장하는 용도로 사용되며, 내가 하려고 한 구분선 출력은 어떤 함수 또는 메서드의 앞이나 뒤에 추가되는 작업이긴 하지만, 데코레이터의 주된 용도와는 조금 다를 수도 있다. 다만, 여러 함수나 메서드에 대해 공통적인 작업으로 수행될 수 있기 때문에, 데코레이터는 구분선 출력 로직을 한 곳에서 관리하고 여러 메서드에 일관적으로 적용할 수 있다는 장점이 있을 수도 있다.

 

반면에 정적 메서드는 클래스와 관련된 기능을 제공하기 때문에 구분선 출력이 클래스의 일부로써 고려되는 경우, 정적 메서드를 사용하는 것이 더 직관적일 수 있다.

 

나는 구분선을 함수가 출력되는 위, 아래에만 넣는 것이 아니라 중간중간에도 입력할 생각이기 때문에 정적메서드로 작성하는 것이 좋겠다는 결론이 내려졌다. 데코레이터도 적용해보고 싶어서 알아봤지만 지금 상태에서는 해당 기능을 사용할 곳이 없어 보여 아쉽다. 하지만 작업을 하다가 적용할 수 있는 곳이 보인다면 꼭 사용해 봐야겠다.

 

다시 구분선 출력에 대한 부분으로 돌아가서, 자바에서 인터페이스를 썼던 것처럼 해당 클래스를 따로 생성해서 필요한 정적메서드들을 만든 뒤 불러오는 것은 어떨까라는 생각이 들었다. 배운 건 어떻게든 욱여넣어 보고 싶었다.

 

1. Interface.py

class Line:
    @staticmethod
    def line_one():
        print("-----------------------------------------")

    @staticmethod
    def line_two():
        print("=========================================")

2. Unit.py

from Interface import Line
class Character(Unit):
    def unit_info(self):
    Line.line_one()
    print("┌ 캐릭터명 : " + self.get_name())
    print("│ 체력 : " + str(self.get_hp()) + " / " + str(self.get_max_hp()))
    if self.equipped_weapon:
        print("└ 장착무기 : " + self.equipped_weapon.get_name())
        print("└ 공격력 : " + str(self.get_min_damage()) + " ~ " + str(self.get_max_damage()))
    else:
        print("└ 장착무기 : 없음")
    Line.line_one()

 

한 파일에 작성하기보다는 파일을 따로 만들어서 작성하고 싶었기 때문에 위와 같이 코드를 작성해 보았다.

 

처음에 자바를 생각하고 '클래스명.메서드명'을 입력했는데 오류 표시가 떠서 당황했다. 찾아보니 이렇게 작업하는 것을 모듈이라고 하는 것 같다. 아직 모듈에 대해서 정확하게 배우지 않아서 찾아본 자료들로 얼추 만들긴 했지만 다음 수업까지 기다릴 수가 없어서 간단하게 여기서 정리해 보기로 했다.

 

모듈

모듈로 나누면 코드 작성과 관리가 쉬워진다.

솔직히 내가 하고 있는 미니 프로젝트는 한 파일에 다 작성해도 될 정도로 규모가 작다. 하지만 규모가 큰 프로그램을 작성할 경우에는 기능별로 파일을 나눠서 구현하기 때문에 하나의 코드 파일에서는 해당 기능의 규현만 신경 쓰면 되므로 코드 작성과 관리가 편해진다.

이미 작성된 코드를 재사용할 수 있다.

특정 기능을 구현한 모듈은 다른 프로그램을 작성할 때 재사용할 수 있다. 이렇게 되면 코드를 다시 만들지 않아도 되기 때문에 코드를 빨리 작성할 수 있다.

공동 작업이 편리해진다.

공동으로 프로젝트를 진행할 때 모듈별로 설계하고 개인별로 나누어 코딩한 후 전체 모듈을 통합하게 된다. 모듈별로 구분해 코드를 작성하게 되면 자신이 맡은 모듈만 신경 쓰면 되므로 공동 작업으로 인한 복잡성이 줄고 효율이 높아진다.

 

import 모듈명 as 별명

from 모듈명 import 변수명 as 별명
from 모듈명 import 함수명 as 별명
from 모듈명 import 클래스명 as 별명

 

이런 형식으로 모듈을 불러와 작업을 진행하게 된다. as 별명 부분은 생략할 수 있다.

 

모듈은 직접 만들 수도 있지만 파이썬에 내장된 모듈도 있고 다양한 공개 모듈들이 많기 때문에 이를 활용하면 코드를 쉽고 간편하게 작성할 수 있다. 그동안 써온 random, math, pickle 같은 것들이 내장된 모듈이라고 한다.

 

일단은 간단하게 모듈에 대한 개념을 훑어보았다. 나중에 수업을 통해서 더 정확하게 배운 뒤에 다시 확인해 보는 것이 좋을 것 같다. 코딩은 알면 알수록 신기하고 재밌는 것 같다.