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

코드 설명

  1. __init__ 생성자: 리스트의 크기를 설정합니다. 초기화 시 리스트의 크기를 미리 설정하고, 고정된 크기를 유지하도록 _data 리스트를 생성합니다.
    • self._data: 고정된 크기를 가진 리스트입니다. 초기값은 None으로 채워집니다.
    • self.current_index: 현재 리스트에 추가된 요소의 개수를 추적합니다.
  2. add(value) 메서드: 요소를 추가하는 메서드입니다. self.current_index를 이용하여 요소를 추가할 위치를 관리하고, 리스트의 크기를 넘어서 추가하려고 하면 OverflowError 예외를 발생시킵니다.
  3. update(index, value) 메서드: 리스트의 특정 인덱스에 있는 값을 업데이트하는 메서드입니다. 인덱스가 유효한 범위에 있는지 확인하고, 잘못된 인덱스면 IndexError를 발생시킵니다.
  4. get(index) 메서드: 리스트의 특정 인덱스 값을 반환하는 메서드입니다. 마찬가지로 인덱스가 범위를 벗어날 경우 IndexError를 발생시킵니다.
  5. 예외 처리: 리스트가 가득 찼을 때 추가 작업을 수행하려고 하면 OverflowError가 발생합니다. 인덱스가 잘못된 경우에는 IndexError를 발생시킵니다.

기능 확장 아이디어

  • 원형 버퍼(Circular Buffer): 고정된 크기를 초과할 경우, 처음 요소를 덮어쓰는 방식으로 확장할 수 있습니다.
  • 정렬 기능: 삽입된 데이터를 정렬하는 메서드를 추가할 수 있습니다.
  • 삭제 기능: 고정된 크기 내에서 요소를 제거하고, 이후 새로운 요소를 추가할 수 있도록 할 수 있습니다.

이 고정 크기 리스트는 메모리 사용량을 관리하거나 제한된 공간 내에서 데이터를 처리해야 하는 시나리오에 적합합니다.

+ Recent posts