파이썬에서 object
클래스를 상속하여 사용자 정의 데이터 타입을 만들 수 있습니다. 이를 통해 기본 데이터 타입(예: int
, str
, list
)처럼 동작하는 객체를 만들거나, 특별한 동작을 가지는 데이터를 정의할 수 있습니다.
사용자 정의 데이터 타입 만들기
사용자 정의 데이터 타입을 만들기 위해서는 object
클래스를 상속받고, 필요한 속성(데이터)과 메서드(동작)를 정의합니다. 이때, 파이썬의 __init__
, __repr__
, __eq__
, __lt__
등과 같은 특수 메서드를 재정의하면, 객체 간 비교, 출력, 초기화 등을 정의할 수 있습니다.
예제: 사용자 정의 복소수 타입
다음은 파이썬의 object
클래스를 상속하여 복소수(Complex Number)를 표현하는 사용자 정의 데이터 타입을 만드는 예제입니다.
class ComplexNumber(object):
def __init__(self, real, imag):
"""복소수의 실수부와 허수부를 초기화"""
self.real = real
self.imag = imag
def __add__(self, other):
"""두 복소수의 덧셈"""
return ComplexNumber(self.real + other.real, self.imag + other.imag)
def __sub__(self, other):
"""두 복소수의 뺄셈"""
return ComplexNumber(self.real - other.real, self.imag - other.imag)
def __mul__(self, other):
"""두 복소수의 곱셈"""
real_part = self.real * other.real - self.imag * other.imag
imag_part = self.real * other.imag + self.imag * other.real
return ComplexNumber(real_part, imag_part)
def __eq__(self, other):
"""복소수의 동등성 비교"""
return self.real == other.real and self.imag == other.imag
def __repr__(self):
"""복소수의 표현"""
return f"{self.real} + {self.imag}i"
def conjugate(self):
"""복소수의 켤레 복소수 계산"""
return ComplexNumber(self.real, -self.imag)
# 사용자 정의 복소수 클래스 사용 예제
z1 = ComplexNumber(3, 2)
z2 = ComplexNumber(1, 7)
# 덧셈
z3 = z1 + z2
print(f"z1 + z2 = {z3}") # 출력: z1 + z2 = 4 + 9i
# 뺄셈
z4 = z1 - z2
print(f"z1 - z2 = {z4}") # 출력: z1 - z2 = 2 - 5i
# 곱셈
z5 = z1 * z2
print(f"z1 * z2 = {z5}") # 출력: z1 * z2 = -11 + 23i
# 켤레 복소수
z_conjugate = z1.conjugate()
print(f"z1의 켤레 복소수: {z_conjugate}") # 출력: z1의 켤레 복소수: 3 - 2i
# 동등 비교
print(f"z1과 z2가 같은가? {z1 == z2}") # 출력: z1과 z2가 같은가? False
설명:
__init__(self, real, imag)
는 클래스의 인스턴스가 생성될 때 호출되며, 복소수의 실수부와 허수부를 초기화합니다.__add__(self, other)
는 두 복소수를 더하는 메서드로,+
연산자를 오버로드합니다.__sub__(self, other)
는 두 복소수를 빼는 메서드로,-
연산자를 오버로드합니다.__mul__(self, other)
는 두 복소수를 곱하는 메서드로,*
연산자를 오버로드합니다.__eq__(self, other)
는 두 복소수가 같은지 비교하는 메서드로,==
연산자를 오버로드합니다.__repr__(self)
는 객체를 문자열로 나타낼 때 사용되며,print()
함수나 인터프리터에서 출력될 때 호출됩니다.conjugate(self)
는 복소수의 켤레 복소수를 반환하는 메서드입니다.
사용자 정의 타입의 장점
- 데이터 모델링: 현실 세계의 개념을 더 잘 반영하는 데이터 타입을 정의할 수 있습니다.
- 연산자 오버로딩: 기본 연산자(
+
,-
,*
,==
등)를 재정의하여 객체 간의 연산을 직관적으로 수행할 수 있습니다. - 메서드 추가: 필요한 메서드를 추가하여 데이터 처리나 계산을 간편하게 수행할 수 있습니다.
예제: 2D 벡터를 표현하는 사용자 정의 데이터 타입
다음은 2D 벡터를 표현하는 클래스입니다.
class Vector2D(object):
def __init__(self, x, y):
"""2D 벡터의 x, y 좌표를 초기화"""
self.x = x
self.y = y
def __add__(self, other):
"""두 벡터의 덧셈"""
return Vector2D(self.x + other.x, self.y + other.y)
def __sub__(self, other):
"""두 벡터의 뺄셈"""
return Vector2D(self.x - other.x, self.y - other.y)
def __mul__(self, scalar):
"""벡터의 스칼라 곱"""
return Vector2D(self.x * scalar, self.y * scalar)
def magnitude(self):
"""벡터의 크기 계산"""
return (self.x ** 2 + self.y ** 2) ** 0.5
def __repr__(self):
"""벡터의 표현"""
return f"Vector2D({self.x}, {self.y})"
# 2D 벡터 클래스 사용 예제
v1 = Vector2D(3, 4)
v2 = Vector2D(1, 2)
# 벡터 덧셈
v3 = v1 + v2
print(f"v1 + v2 = {v3}") # 출력: v1 + v2 = Vector2D(4, 6)
# 벡터 뺄셈
v4 = v1 - v2
print(f"v1 - v2 = {v4}") # 출력: v1 - v2 = Vector2D(2, 2)
# 스칼라 곱
v5 = v1 * 3
print(f"v1 * 3 = {v5}") # 출력: v1 * 3 = Vector2D(9, 12)
# 벡터의 크기
print(f"v1의 크기: {v1.magnitude()}") # 출력: v1의 크기: 5.0
설명:
Vector2D
클래스는 2차원 벡터를 나타냅니다.+
,-
,*
연산자를 오버로드하여 벡터 덧셈, 뺄셈, 스칼라 곱을 정의합니다.magnitude()
메서드는 벡터의 크기를 계산합니다.
이와 같이 Python의 object
클래스를 상속받아 사용자 정의 데이터 타입을 만들면, 데이터의 의미를 명확하게 정의하고, 관련된 연산을 직관적으로 처리할 수 있습니다.
'실용적인 코드 샘플' 카테고리의 다른 글
[실용적인 코드 샘플] 히스토리 기반 통계 작성 클래스 (8) | 2024.10.22 |
---|---|
[실용적인 코드 샘플] Way Point기반 시나리오 맵 자료구조 (10) | 2024.10.22 |
[실용적인 코드 샘플] 메타클래스 기반 게임 설정값 저장 클래스 (0) | 2024.10.20 |
[실용적인 코드 샘플] 리스트 상속 기반 스택(Stack) 자료구조 (2) | 2024.10.20 |
[실용적인 코드 샘플] Singleton 패턴 (클래스 변수, 메타클래스 활용) (2) | 2024.10.19 |