파이썬의 명명된 자료구조는 데이터를 더 명확하고 가독성 있게 관리하기 위한 구조입니다. 이러한 자료구조는 값에 접근할 때 이름을 통해 접근할 수 있기 때문에 코드의 이해와 유지보수를 용이하게 합니다.
파이썬에서는 다음과 같은 명명된 자료구조를 사용할 수 있습니다.
namedtuple
(fromcollections
)dataclass
(fromdataclasses
)
각각을 설명하고 예제 코드를 제공하겠습니다.
1. namedtuple
(from collections
)
namedtuple
은 일반적인 튜플과 유사하지만, 각 항목에 이름을 붙일 수 있는 튜플입니다. 따라서, 인덱스 번호가 아닌 필드 이름으로 값에 접근할 수 있습니다. 불변(immutable)하다는 점에서는 튜플과 동일합니다.
사용법:
from collections import namedtuple
# namedtuple 정의
Person = namedtuple('Person', ['name', 'age', 'city'])
# 객체 생성
p = Person(name="John", age=30, city="New York")
# 값에 필드 이름으로 접근
print(p.name) # 출력: John
print(p.age) # 출력: 30
print(p.city) # 출력: New York
# 튜플처럼 인덱스로도 접근 가능
print(p[0]) # 출력: John
설명:
namedtuple('Person', ['name', 'age', 'city'])
:Person
이라는 명명된 튜플을 정의합니다. 세 개의 필드 이름name
,age
,city
를 가지며, 각 필드에 이름으로 접근할 수 있습니다.- 불변성:
namedtuple
은 기본적으로 불변(immutable)합니다. 값을 변경할 수 없습니다.
장점:
- 필드 이름으로 데이터에 접근할 수 있어 가독성이 높습니다.
- 메모리 사용이 효율적이고 성능이 뛰어납니다.
2. dataclass
(from dataclasses
)
파이썬의 dataclass
는 3.7 버전부터 도입된 기능으로, 클래스를 더 간편하게 정의할 수 있도록 도와줍니다. 특히, 데이터 저장과 관련된 클래스에 자주 사용되는 __init__
, __repr__
, __eq__
와 같은 메서드를 자동으로 생성해줍니다.
사용법:
from dataclasses import dataclass
@dataclass
class Person:
name: str
age: int
city: str
# 객체 생성
p = Person(name="Alice", age=25, city="Los Angeles")
# 값에 필드 이름으로 접근
print(p.name) # 출력: Alice
print(p.age) # 출력: 25
print(p.city) # 출력: Los Angeles
# __repr__ 메서드 자동 생성됨
print(p) # 출력: Person(name='Alice', age=25, city='Los Angeles')
# __eq__ 메서드 자동 생성됨
p2 = Person(name="Alice", age=25, city="Los Angeles")
print(p == p2) # 출력: True
설명:
@dataclass
:dataclass
데코레이터를 사용하면, 클래스 정의 시 각 필드의 타입과 이름만 적어주면 됩니다. 파이썬이 자동으로 생성자(__init__
), 문자열 표현(__repr__
), 비교(__eq__
) 등을 처리해 줍니다.- 변경 가능성:
dataclass
는 기본적으로 변경 가능(mutable)합니다.
장점:
- 클래스를 더 간결하게 작성할 수 있습니다.
- 자동으로 생성되는 메서드를 통해 코드의 중복을 줄일 수 있습니다.
- 기본 값, 필드 간 타입 검사 등을 쉽게 지원합니다.
dataclass
의 추가 기능:
- 기본값 설정: 필드에 기본값을 설정할 수 있습니다.
- 필드 순서 변경: 기본값이 없는 필드는 기본값이 있는 필드 앞에 위치해야 합니다.
- 불변성 설정:
dataclass
에서 불변성을 설정할 수도 있습니다. 이를 위해frozen=True
를 사용합니다.
from dataclasses import dataclass
@dataclass(frozen=True)
class Point:
x: int
y: int
p = Point(10, 20)
print(p.x) # 출력: 10
# 불변성으로 인해 값을 변경하려고 하면 오류 발생
# p.x = 15 # AttributeError: cannot assign to field 'x'
namedtuple
와 dataclass
비교
특성 | namedtuple |
dataclass |
---|---|---|
불변성 | 기본적으로 불변 | 기본적으로 변경 가능 (불변성 설정 가능) |
메서드 자동 생성 | 일부 (_replace() , _asdict() ) |
여러 메서드 (__init__ , __repr__ , __eq__ 등) |
필드 기본값 설정 | 가능 | 가능 |
가독성 | 필드 이름으로 접근 가능 | 필드 이름으로 접근 가능 |
성능 | 메모리 사용이 더 적음 | 기능이 많아 다소 무거움 |
결론
파이썬의 명명된 자료구조는 가독성을 높이고, 명시적으로 데이터를 관리할 수 있는 좋은 도구들입니다. namedtuple
은 메모리 효율적이고 불변성을 가진 자료 구조가 필요할 때 유용하고, dataclass
는 보다 유연하고 클래스를 빠르게 정의하고 싶을 때 매우 유용합니다.
상황에 맞는 도구를 선택하여 데이터를 관리하면 코드의 유지 보수성과 효율성을 모두 높일 수 있습니다.
'실용적인 자료구조' 카테고리의 다른 글
[실용적인 자료구조] 더블 언더 메소드와 그 역할 (0) | 2024.10.17 |
---|---|
[실용적인 자료구조] 이중 연결 리스트(Doubly Linked List) (0) | 2024.10.17 |
[실용적인 자료구조] Python의 `object` 클래스 1 (0) | 2024.10.17 |
[실용적인 자료구조] 리스트를 상속한 `NamedList` 클래스 (1) | 2024.10.16 |
[실용적인 자료구조] 딕셔너리 상속 명명된 자료구조 1 (0) | 2024.10.16 |