파이썬에서 상수를 만드는 방법: 명확한 규약과 관습을 활용하여
파이썬에는 다른 프로그래밍 언어처럼 const
키워드와 같은 상수를 명시적으로 선언하는 방법이 없습니다. 하지만 파이썬 개발자들은 명명 규약과 관습을 통해 변수를 상수처럼 취급하고 있습니다.
대문자로 된 스네이크 케이스 사용하기
- 가장 일반적인 방법: 변수 이름을 모두 대문자로 작성하고 단어 사이를 언더스코어(_)로 연결합니다.
- 예시:
PI = 3.14159 GRAVITY = 9.8 DAYS_IN_WEEK = 7
- 이유: 대문자로 된 이름은 일반적인 변수와 시각적으로 구분되어 상수임을 명확히 나타냅니다.
클래스 내부에서 상수처럼 사용하기
- 클래스 변수 활용: 클래스 내부에 변수를 선언하고
self
없이 직접 접근하여 클래스 전체에서 공유하는 상수처럼 사용합니다. - 예시:
class Config: DEBUG = True HOST = 'localhost' PORT = 8080
- 이유: 클래스 변수는 인스턴스 생성과 상관없이 클래스 자체에 속하는 값이므로 변경되지 않도록 관리하기 좋습니다.
namedtuple 사용하기
- 튜플의 장점 활용:
collections.namedtuple
을 사용하여 이름이 있는 튜플을 생성하고, 이를 상수처럼 사용합니다. - 예시:
from collections import namedtuple Color = namedtuple('Color', ['red', 'green', 'blue']) BLACK = Color(0, 0, 0) WHITE = Color(255, 255, 255)
- 이유: 튜플은 변경 불가능한 자료형이므로 값이 바뀌지 않도록 보장할 수 있습니다.
enum 모듈 사용하기
- 열거형 활용:
enum
모듈을 사용하여 열거형을 정의하고, 열거형 멤버를 상수처럼 사용합니다. - 예시:
from enum import Enum class Direction(Enum): NORTH = '북쪽' SOUTH = '남쪽' EAST = '동쪽' WEST = '서쪽'
- 이유: 열거형은 특정 값들의 집합을 나타내는 데 유용하며, 멤버 값이 변경되지 않도록 보장합니다.
왜 파이썬에는 const
키워드가 없을까요?
파이썬은 동적 타이핑 언어이기 때문에 컴파일 시점에 변수의 타입을 검사하지 않습니다. 따라서 const
키워드를 사용하여 변수의 값을 변경하지 못하도록 강제하는 것이 의미가 없다고 판단한 것입니다. 대신 파이썬 개발자들은 코딩 관습을 통해 상수를 관리하고 있습니다.
어떤 방법을 선택해야 할까요?
- 간단한 상수: 대문자로 된 스네이크 케이스가 가장 일반적이고 간편합니다.
- 클래스 관련 상수: 클래스 내부에 클래스 변수로 정의하는 것이 좋습니다.
- 관련된 값들의 집합:
namedtuple
이나enum
을 사용하여 관리하면 코드를 더욱 명확하게 만들 수 있습니다.
파이썬 상수 관련 샘플 코드
대문자 스네이크 케이스를 이용한 상수 선언
# 수학 상수
PI = 3.14159
EULER_NUMBER = 2.71828
# 물리 상수
GRAVITY = 9.8 # 지구 중력 가속도
SPEED_OF_LIGHT = 299792458 # 빛의 속도
# 색상 코드
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
# 방향
NORTH = '북쪽'
SOUTH = '남쪽'
EAST = '동쪽'
WEST = '서쪽'
클래스 내부에서 상수처럼 사용하기
class Car:
WHEELS = 4
MAX_SPEED = 200
def __init__(self, color, model):
self.color = color
self.model = model
def get_max_speed(self):
return self.MAX_SPEED
namedtuple 사용하기
from collections import namedtuple
# 카드 정보
Card = namedtuple('Card', ['rank', 'suit'])
ACE_OF_SPADES = Card('Ace', 'Spades')
KING_OF_HEARTS = Card('King', 'Hearts')
# 사람 정보
Person = namedtuple('Person', ['name', 'age', 'city'])
JOHN_DOE = Person('John Doe', 30, 'Seoul')
enum 사용하기
from enum import Enum
class HTTPMethod(Enum):
GET = 'GET'
POST = 'POST'
PUT = 'PUT'
DELETE = 'DELETE'
class Color(Enum):
RED = '빨강'
GREEN = '초록'
BLUE = '파랑'
실제 코드에서 활용 예시
import math
def calculate_circle_area(radius):
return PI * radius * radius
def calculate_kinetic_energy(mass, velocity):
return 0.5 * mass * velocity ** 2
# ... (다른 함수들)
if __name__ == "__main__":
area = calculate_circle_area(5)
print(f"원의 면적: {area}")
energy = calculate_kinetic_energy(10, 20)
print(f"운동 에너지: {energy}")
주의:
- 파이썬 상수는 강제되지 않습니다. 대문자로 선언했다고 해서 절대 변경할 수 없는 것은 아닙니다.
- 가독성을 위해 주석을 추가하는 것이 좋습니다. 특히 물리 상수나 도메인별 상수의 경우, 해당 값의 의미를 명확히 설명하는 주석을 달아주세요.
- enum은 관련된 값들의 집합을 나타낼 때 유용합니다. HTTP 메서드, 방향, 색상 등을 나타내는 데 적합합니다.
추가 설명:
- 대문자 스네이크 케이스: 가장 일반적인 방법이며, 파이썬 스타일 가이드(PEP 8)에서 권장하는 방법입니다.
- 클래스 내부 상수: 클래스에 속하는 상수를 정의할 때 사용합니다.
- namedtuple: 데이터를 묶어서 관리할 때 유용하며, 불변성을 보장합니다.
- enum: 열거형 데이터를 표현할 때 사용하며, 멤버 값을 문자열로 저장할 수 있습니다.
어떤 방법을 선택해야 할까요?
- 간단한 상수: 대문자 스네이크 케이스
- 클래스 관련 상수: 클래스 내부 상수
- 관련된 값들의 집합: namedtuple 또는 enum
파이썬에서 상수를 대체하는 방법에 대한 추가 설명
파이썬은 const
키워드와 같은 명확한 상수 선언 방식이 없지만, 앞서 설명한 방법 외에도 다양한 상황에서 활용 가능한 몇 가지 대체 방법들이 있습니다.
읽기 전용 속성 (Read-only Attribute)
- 클래스 내부에서 값을 변경하지 못하게 하는 방법:
class MyClass: _CONSTANT = 42 @property def CONSTANT(self): return self._CONSTANT
_CONSTANT
는 클래스 내부에서 사용되는 실제 값을 저장하고,CONSTANT
는 외부에서 접근할 수 있는 읽기 전용 속성입니다.- 외부에서
CONSTANT
의 값을 변경하려고 하면 AttributeError가 발생합니다.
데이터 클래스 (Data Class)
- 불변 데이터를 위한 간결한 표현:
from dataclasses import dataclass @dataclass(frozen=True) class Color: red: int green: int blue: int
@dataclass(frozen=True)
데코레이터를 사용하면 데이터 클래스를 불변으로 만들 수 있습니다.- 인스턴스 생성 후에는 값을 변경할 수 없습니다.
모듈 수준의 변수
- 모듈 내에서 공유되는 상수:
# constants.py PI = 3.14159 GRAVITY = 9.8 # 다른 모듈에서 사용 import constants print(constants.PI)
- 모듈 수준에서 변수를 선언하면 다른 모듈에서도 import하여 사용할 수 있습니다.
- 일반적으로 모듈 이름을 모두 대문자로 작성하여 상수 모듈임을 나타냅니다.
환경 변수
- 외부 설정 값 활용:
import os DEBUG = os.getenv('DEBUG', False)
- 환경 변수를 사용하면 외부에서 프로그램 실행 시 값을 설정할 수 있습니다.
- 주로 개발 환경과 운영 환경에서 다른 값을 사용해야 할 때 유용합니다.
어떤 방법을 선택해야 할까요?
- 불변성: 데이터 클래스는 데이터 자체의 불변성을 강조할 때 적합합니다.
- 외부 접근 제한: 읽기 전용 속성은 클래스 내부의 값을 외부에서 변경하는 것을 막고 싶을 때 사용합니다.
- 모듈 수준 상수: 여러 모듈에서 공유되는 상수를 정의할 때 사용합니다.
- 외부 설정 값: 환경 변수는 프로그램 실행 시 값을 변경해야 할 때 유용합니다.
결론적으로, 파이썬은 const
키워드가 없지만, 다양한 방법으로 상수와 유사한 기능을 구현할 수 있습니다. 어떤 방법을 선택할지는 코드의 구조, 가독성, 그리고 상수의 특성에 따라 달라집니다.
- 파이썬에서 상수는 언어적으로 강제되는 것이 아니므로, 개발자가 의도적으로 값을 변경할 수 있다는 점을 항상 기억해야 합니다.
- 코드의 가독성을 높이기 위해 명확한 이름을 사용하고, 주석을 통해 상수의 의미를 설명하는 것이 좋습니다.
- 특정 상황에서 어떤 방법이 가장 적합할지 궁금하신가요?
- 다른 프로그래밍 언어의 상수와 파이썬의 상수의 차이점에 대해 더 알고 싶으신가요?
python constants