복잡한 파이썬 코드를 간단하게 만드는 방법
파이썬 프로그래밍을 하다 보면 코드는 점점 길어지고 복잡해집니다. 코드가 복잡해지면 수정하거나 디버깅하는 데 많은 시간이 걸리고, 코드의 가독성도 떨어지게 됩니다. 이번 포스팅에서는 복잡한 파이썬 코드를 간단하게 만들고, 유지하는 몇 가지 방법을 소개하고자 합니다.
글의 순서
함수와 클래스로 코드 분리하기
모듈화
주석과 문서화
정적 함수(method) 사용하기
함수와 클래스로 코드 분리하기
파이썬 코드의 반복되는 부분을 함수와 클래스로 나누면 재사용성과 가독성이 높아집니다.또한 코드의 특정 기능을 함수로 만들고, 관련된 함수들을 클래스에 묶으면 유지보수가 쉬워집니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
class CoffeeMachine: def __init__(self, water_level, coffee_beans): self.water_level = water_level self.coffee_beans = coffee_beans def add_water(self, amount): self.water_level += amount print('water level :', self.water_level) def add_beans(self, amount): self.coffee_beans += amount print('coffee beans amount :', self.coffee_beans) def make_coffee(self): if self.water_level > 0 and self.coffee_beans > 0: self.water_level -= 1 self.coffee_beans -= 1 return "Here is your coffee!" else: return "Not enough resources to make coffee." machine = CoffeeMachine(10, 5) machine.add_water(5) machine.add_beans(5) print(machine.make_coffee()) |
1 2 3 |
water level : 15 coffee beans amount : 10 Here is your coffee! |
▶클래스 사용: CoffeeMachine 클래스는 커피 머신의 상태를 보여줍니다. 클래스의 변수를 사용하여 커피 머신의 물과 커피 원두 양을 변화시킬 수 있습니다.
▶함수 분리: add_water, add_beans, make_coffee 함수는 각각의 기능을 수행하며, 코드의 가독성을 높입니다.
파이썬 코드 모듈화
코드를 여러 파일로 나누어 관리할 수 있습니다. 서로 연관되는 함수나 클래스를 별도의 파일로 분리하고, 필요할 때 import하여 사용합니다. 이렇게 하면 코드가 길어지더라도 관리하기 쉬워집니다.
1 2 3 4 5 |
from coffee_machine import CoffeeMachine machine = CoffeeMachine(10, 5) machine.add_beans(4) print(machine.make_coffee()) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
class CoffeeMachine: def __init__(self, water_level, coffee_beans): self.water_level = water_level self.coffee_beans = coffee_beans def add_water(self, amount): self.water_level += amount print('water level :', self.water_level) def add_beans(self, amount): self.coffee_beans += amount print('coffee beans amount :', self.coffee_beans) def make_coffee(self): if self.water_level > 0 and self.coffee_beans > 0: self.water_level -= 1 self.coffee_beans -= 1 return "Here is your coffee!" else: return "Not enough resources to make coffee." |
1 2 |
coffee beans amount : 9 Here is your coffee! |
▶모듈화: CoffeeMachine 클래스를 별도의 파일로 분리하여 main.py 파일을 깔끔하게 유지합니다. 필요할 때 해당 모듈을 import하여 사용합니다.
▶코드 분리: main.py 파일에는 프로그램 실행에 필요한 최소한의 코드만 포함되도록 하여 가독성을 높일 수 있습니다.
파이썬 코드 주석과 문서화
코드의 이해를 돕기 위해 주석을 적절히 사용하고, 함수와 클래스에는 docstring을 추가해서 자세히 설명을 붙여 놓는 것이 좋습니다. Docstring은 일반적으로 함수나 클래스의 첫 번째 줄에 위치하며, 아래 코드처럼 삼중 따옴표(“”” 또는 ”’)로 감싸여 있습니다.
잘 작성된 Docstring은 코드의 유지보수에 도움을 주고, 협업을 원활하게 해줍니다. 따라서, 코드를 작성할 때는 항상 Docstring을 포함하여 코드를 문서화하는 습관을 가지는 것이 좋습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
class CoffeeMachine: """ 커피 머신 클래스로, 커피를 만들고 물과 커피 원두를 추가하는 기능을 제공합니다. :param water_level: 초기 물의 양 :type water_level: int :param coffee_beans: 초기 커피 원두의 양 :type coffee_beans: int 메서드: - add_water(amount): 물을 추가합니다. - add_beans(amount): 커피 원두를 추가합니다. - make_coffee(): 커피를 만듭니다. """ def __init__(self, water_level, coffee_beans): self.water_level = water_level self.coffee_beans = coffee_beans def add_water(self, amount): """ 물을 추가합니다. :param amount: 추가할 물의 양 :type amount: int """ self.water_level += amount print('water level:', self.water_level) def add_beans(self, amount): """ 커피 원두를 추가합니다. :param amount: 추가할 커피 원두의 양 :type amount: int """ self.coffee_beans += amount print('coffee beans amount:', self.coffee_beans) def make_coffee(self): """ 커피를 만듭니다. :return: 커피가 준비되었으면 메시지 반환, 자원이 충분하지 않으면 경고 메시지 반환 :rtype: str """ if self.water_level > 0 and self.coffee_beans > 0: self.water_level -= 1 self.coffee_beans -= 1 return "Here is your coffee!" else: return "Not enough resources to make coffee." |
정적 함수(method) 사용하기
정적 함수는 클래스의 인스턴스나 클래스 자체에 의존하지 않는 함수입니다. 유틸리티 함수처럼 독립적으로 동작하는 기능을 정의할 때 유용합니다.
1 2 3 4 5 6 7 8 9 10 11 12 |
class MathOperations: @staticmethod def add(a, b): return a + b @staticmethod def multiply(a, b): return a * b # 인스턴스를 생성하지 않고 클래스 이름으로 호출 가능 print(MathOperations.add(5, 3)) # 출력: 8 print(MathOperations.multiply(5, 3)) # 출력: 15 |
▶정적 함수(메서드) : @staticmethod를 사용하여 클래스의 객체(인스턴스)나 클래스 변수에 접근하지 않는 함수를 정의할 수 있습니다.
▶클래스 이름으로 호출 : 정적 메서드는 인스턴스를 생성하지 않고 클래스 이름으로 직접 호출할 수 있어 유틸리티 함수처럼 사용하기 좋습니다.
정적 메서드와 대응되는 인스턴스 메서드는 인스턴스를 통해 호출되며, 첫 번째 매개변수로 항상 self를 받습니다. 반면, 정적 메서드는 클래스의 인스턴스나 클래스 자체에 의존하지 않으며, 클래스 이름을 통해 직접 호출됩니다. 첫 번째 매개변수로 self를 받지 않습니다.
마치며 …
이번 포스팅에서는 복잡한 파이썬 코드를 간단하게 만들고, 유지하는 몇 가지 방법을 소개하였습니다. 파이썬 코드를 간단하게 유지하는 방법을 통해 코드의 가독성을 높이고, 유지보수도 쉬워집니다. 함수와 클래스로 코드를 분리하고, 모듈화를 통해 코드의 복잡성을 줄이며, 주석과 문서화를 통해 코드를 이해하기 쉽게 만들수 있습니다. 또한, 정적 메서드를 활용하여 독립적인 기능을 정의하면 인스턴스를 생성하지 않고 클래스 이름으로 직접 호출할 수 있어 유틸리티 함수처럼 사용하기 좋습니다 이러한 방법들을 적용하면, 복잡한 파이썬 코드도 간단하게 관리할 수 있습니다. 코드 정리에 도전해 보시기 바랍니다. 복잡한 파이썬 코드를 가독성 좋은 코드로 만드실 수 있을 것입니다.
함께 참고하면 좋은 글
▶ 파이썬 프로그래밍 시작 (12) 클래스, 오브젝트(object, 객체)
▶ 파이썬 프로그래밍 시작 (13) 상속(inheritance)
▶ 파이썬 프로그래밍 시작 (14) 패키지, 모듈
▶ 파이썬 IDE 설정. 비주얼 스튜디오 코드(Visual Studio Code, VS code)
참고자료
▶ Zoe Zbar and Alex Baransky(2020), How to Simplify Your Python Code for Optimal Readability, NYC DATA SCIENCE ACADEMY
▶ 테크보이 워니(2020), 코딩 1시간만에 배우기 – 파이썬 (ft. 실리콘밸리 엔지니어)