Python에서 고정 크기 리스트 자료구조는, 리스트의 크기가 한 번 설정되면 그 크기를 넘어서 추가 요소를 저장할 수 없는 방식으로 동작하는 자료구조입니다. 파이썬의 기본 리스트는 동적으로 크기가 변하지만, 크기 고정 리스트를 구현하기 위해서 몇 가지 방법을 사용할 수 있습니다.
1. 고정 크기 리스트 설계 방법
- 고정 크기 설정: 리스트의 크기를 미리 지정하고, 그 크기를 넘어서 요소를 추가하려고 하면 오류를 발생시키거나 요소 추가를 막습니다.
- 기존 요소 업데이트: 이미 추가된 요소는 업데이트 가능하지만, 새로운 요소를 추가하려고 하면 제한이 걸리게 만듭니다.
구현 방법
- 리스트 초기화: 고정된 크기의 리스트를 미리 설정하고, 이를 내부적으로 관리합니다.
- 삽입 제한: 요소 추가 메서드를 오버라이드하여 리스트가 고정된 크기를 초과할 경우 오류를 발생시키거나 무시합니다.
예제 코드
class FixedSizeList:
def __init__(self, size):
"""
고정 크기 리스트 생성자
size: 리스트의 고정 크기
"""
if size <= 0:
raise ValueError("Size must be a positive integer")
self.size = size
self._data = [None] * size # 크기 고정 리스트 생성
self.current_index = 0 # 리스트에 요소를 추가할 위치 추적
def add(self, value):
"""
리스트에 요소 추가. 만약 리스트가 꽉 차면 오류 발생
"""
if self.current_index >= self.size:
raise OverflowError("Cannot add more elements, list is full")
self._data[self.current_index] = value
self.current_index += 1
def update(self, index, value):
"""
주어진 인덱스의 값을 업데이트
"""
if index < 0 or index >= self.size:
raise IndexError("Index out of range")
self._data[index] = value
def get(self, index):
"""
주어진 인덱스의 값을 반환
"""
if index < 0 or index >= self.size:
raise IndexError("Index out of range")
return self._data[index]
def __repr__(self):
return f"FixedSizeList(size={self.size}, data={self._data})"
# 고정 크기 리스트 생성
fixed_list = FixedSizeList(5)
# 값 추가
fixed_list.add(10)
fixed_list.add(20)
fixed_list.add(30)
print(fixed_list) # 출력: FixedSizeList(size=5, data=[10, 20, 30, None, None])
# 값 업데이트
fixed_list.update(1, 50)
print(fixed_list.get(1)) # 출력: 50
# 리스트가 가득 찬 경우
fixed_list.add(40)
fixed_list.add(50)
print(fixed_list) # 출력: FixedSizeList(size=5, data=[10, 50, 30, 40, 50])
# 크기를 초과해서 추가하려고 하면 오류 발생
try:
fixed_list.add(60) # 리스트가 가득 찼으므로 오류 발생
except OverflowError as e:
print(e) # 출력: Cannot add more elements, list is full
코드 설명
__init__
생성자: 리스트의 크기를 설정합니다. 초기화 시 리스트의 크기를 미리 설정하고, 고정된 크기를 유지하도록_data
리스트를 생성합니다.self._data
: 고정된 크기를 가진 리스트입니다. 초기값은None
으로 채워집니다.self.current_index
: 현재 리스트에 추가된 요소의 개수를 추적합니다.
add(value)
메서드: 요소를 추가하는 메서드입니다.self.current_index
를 이용하여 요소를 추가할 위치를 관리하고, 리스트의 크기를 넘어서 추가하려고 하면OverflowError
예외를 발생시킵니다.update(index, value)
메서드: 리스트의 특정 인덱스에 있는 값을 업데이트하는 메서드입니다. 인덱스가 유효한 범위에 있는지 확인하고, 잘못된 인덱스면IndexError
를 발생시킵니다.get(index)
메서드: 리스트의 특정 인덱스 값을 반환하는 메서드입니다. 마찬가지로 인덱스가 범위를 벗어날 경우IndexError
를 발생시킵니다.- 예외 처리: 리스트가 가득 찼을 때 추가 작업을 수행하려고 하면
OverflowError
가 발생합니다. 인덱스가 잘못된 경우에는IndexError
를 발생시킵니다.
기능 확장 아이디어
- 원형 버퍼(Circular Buffer): 고정된 크기를 초과할 경우, 처음 요소를 덮어쓰는 방식으로 확장할 수 있습니다.
- 정렬 기능: 삽입된 데이터를 정렬하는 메서드를 추가할 수 있습니다.
- 삭제 기능: 고정된 크기 내에서 요소를 제거하고, 이후 새로운 요소를 추가할 수 있도록 할 수 있습니다.
이 고정 크기 리스트는 메모리 사용량을 관리하거나 제한된 공간 내에서 데이터를 처리해야 하는 시나리오에 적합합니다.
'실용적인 코드 샘플' 카테고리의 다른 글
[실용적인 코드 샘플] 리스트 상속 기반 스택(Stack) 자료구조 (2) | 2024.10.20 |
---|---|
[실용적인 코드 샘플] Singleton 패턴 (클래스 변수, 메타클래스 활용) (2) | 2024.10.19 |
[실용적인 코드 샘플] 제너릭을 이용한 `Triple` 자료구조 1 (2) | 2024.10.16 |
[실용적인 코드 샘플] 특정 키와 값의 타입을 제한하는 딕셔너리 (TypedDict) (2) | 2024.10.16 |
[실용적인 코드 샘플] 최대 크기를 가지는 딕셔너리 (`LimitedSizeDict`) (0) | 2024.10.16 |