파이썬의 명명된 자료구조는 데이터를 더 명확하고 가독성 있게 관리하기 위한 구조입니다. 이러한 자료구조는 값에 접근할 때 이름을 통해 접근할 수 있기 때문에 코드의 이해와 유지보수를 용이하게 합니다.

파이썬에서는 다음과 같은 명명된 자료구조를 사용할 수 있습니다.

  1. namedtuple (from collections)
  2. dataclass (from dataclasses)

각각을 설명하고 예제 코드를 제공하겠습니다.


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'

namedtupledataclass 비교

특성 namedtuple dataclass
불변성 기본적으로 불변 기본적으로 변경 가능 (불변성 설정 가능)
메서드 자동 생성 일부 (_replace(), _asdict()) 여러 메서드 (__init__, __repr__, __eq__ 등)
필드 기본값 설정 가능 가능
가독성 필드 이름으로 접근 가능 필드 이름으로 접근 가능
성능 메모리 사용이 더 적음 기능이 많아 다소 무거움

결론

파이썬의 명명된 자료구조는 가독성을 높이고, 명시적으로 데이터를 관리할 수 있는 좋은 도구들입니다. namedtuple은 메모리 효율적이고 불변성을 가진 자료 구조가 필요할 때 유용하고, dataclass는 보다 유연하고 클래스를 빠르게 정의하고 싶을 때 매우 유용합니다.

상황에 맞는 도구를 선택하여 데이터를 관리하면 코드의 유지 보수성과 효율성을 모두 높일 수 있습니다.

+ Recent posts