Python

파이썬 자료구조(연결리스트)

mincom1224 2025. 8. 15. 16:45

이번 글은 저번에 알아보았던 자바자료구조(연결리스트)를 파이썬 버전으로 알아보자 이번 글은 파이썬과 자바에서의 차이를 중점으로 알아보자.

연결 리스트(Linked List)는 파이썬과 자바 모두에서 구현할 수 있지만, 두 언어에서의 기본 제공 여부와 사용 방식에는 큰 차이가 있다. 자바에서는 LinkedList 클래스가 표준 라이브러리(java.util 패키지)에 포함되어 있어, 개발자가 직접 노드 구조를 구현하지 않아도 즉시 사용할 수 있다. 반면 파이썬 표준 라이브러리에는 연결 리스트 자료구조가 별도로 포함되어 있지 않으며, 필요할 경우 사용자가 직접 구현하거나 collections.deque와 같은 다른 자료구조를 활용해야 한다.

자바의 LinkedList 클래스는 내부적으로 이중 연결 리스트(Doubly Linked List) 로 구현되어 있으며, List, Deque, Queue 인터페이스를 모두 지원한다. 이를 통해 인덱스 기반 접근, 큐·스택 연산, 양방향 삽입·삭제를 모두 효율적으로 처리할 수 있다. 예를 들어 addFirst(), addLast(), removeFirst(), removeLast() 메서드를 사용하면 데이터 구조를 자유롭게 조작할 수 있다. 또한 제네릭(Generic)을 지원하여 타입 안정성을 제공하고, 컴파일 시점에 자료형 오류를 방지할 수 있다.

반면 파이썬에서는 연결 리스트를 기본 제공하지 않기 때문에, 일반적으로 클래스 기반으로 Node와 LinkedList를 직접 구현해야 한다. 삽입·삭제 로직은 자바와 동일하게 노드 참조를 변경하는 방식이지만, 파이썬의 동적 타이핑 특성상 별도의 제네릭 선언이 필요 없다. 모든 객체가 참조형으로 취급되기 때문에 다양한 자료형의 데이터를 같은 연결 리스트에 혼합하여 저장할 수 있다는 장점이 있지만, 이는 타입 안정성 측면에서는 단점이 될 수 있다.

성능 측면에서도 차이가 있다. 자바의 LinkedList는 고도로 최적화된 구현으로, 요소 접근·삽입·삭제의 시간 복잡도가 명확하게 보장된다. 반면 파이썬에서 직접 구현한 연결 리스트는 언어의 인터프리터 특성상 상대적으로 느릴 수 있고, 추가적인 최적화가 필요하다. 대신 파이썬의 collections.deque는 내부적으로 이중 연결 리스트와 유사한 구조를 가지며, 양방향 삽입·삭제에서 높은 성능을 제공하므로 실무에서는 이를 대체제로 활용하는 경우가 많다.

또한 메모리 관리 방식에서도 차이가 있다. 자바는 JVM의 가비지 컬렉션이 사용되지 않는 노드를 자동으로 회수하지만, 파이썬은 참조 카운트와 가비지 컬렉션을 병행하여 메모리를 관리한다. 이로 인해 순환 참조가 있는 경우, 파이썬에서는 약간의 추가 처리(예: weakref 사용)가 필요할 수 있다.

자바는 저번 글에서 코드를 다루었으므로 파이썬만 코드를 첨부하면

class Node:
    def __init__(self, data):
        self.data = data
        self.next = None

class LinkedList:
    def __init__(self):
        self.head = None

    def add_first(self, data):
        new_node = Node(data)
        new_node.next = self.head
        self.head = new_node

    def add_last(self, data):
        new_node = Node(data)
        if not self.head:
            self.head = new_node
            return
        current = self.head
        while current.next:
            current = current.next
        current.next = new_node

    def remove(self, data):
        if not self.head:
            return
        if self.head.data == data:
            self.head = self.head.next
            return
        current = self.head
        while current.next and current.next.data != data:
            current = current.next
        if current.next:
            current.next = current.next.next

    def print_list(self):
        current = self.head
        while current:
            print(current.data, end=" -> ")
            current = current.next
        print("None")

ll = LinkedList()
ll.add_first(10)
ll.add_first(5)
ll.add_last(20)
ll.add_last(30)
print("초기 연결 리스트:")
ll.print_list()
ll.remove(20)
print("20 삭제 후:")
ll.print_list()

정리하자면,

java: 표준 라이브러리에서 최적화된 LinkedList 제공, 제네릭 지원, 타입 안정성 높음, 이중 연결 리스트 기반

python: 표준 연결 리스트 없음, 직접 구현 필요, 동적 타이핑으로 다양한 자료형 혼합 가능, 대신 타입 안정성 낮음, 실무에서는 주로 deque 사용

이러한 차이로 인해, 자바에서는 바로 연결 리스트를 가져다 쓰는 경우가 많고, 파이썬에서는 학습용 또는 특수한 경우에 직접 구현하거나 다른 자료구조로 대체하는 경향이 있다.

'Python' 카테고리의 다른 글

파이썬 리스트  (2) 2025.08.14
파이썬 내장함수(input())  (1) 2025.07.08