추상화된 자료구조

ArrayList에 대해서 공부하다가 List 설명에서

리스트는 추상화된 자료구조의 개념으로, 여러 형태의 리스트가 존재합니다. 가장 흔한 형태로는 연결 리스트(Linked List)와 배열 리스트(Array List)가 있습니다.

추상화된 자료구조라는 말을 보고 추상화된 자료구조가 무슨 말인지 정확히 찾아보고 싶어서 검색해봤다.

추상 자료형(Abstract Data Type, ADT) 은 자료 구조와 그 자료 구조가 수행할 수 있는 연산을 정의한 것입니다. 이를 통해 구현 세부 사항을 숨기고 인터페이스만 제공하여, 사용자는 자료 구조의 내부 동작을 몰라도 사용할 수 있습니다.

추상 자료형(ADT)의 정의

추상 자료형은 두 가지 주요 요소로 구성됩니다:

  1. 데이터: ADT가 다루는 데이터의 종류 및 구조.
  2. 연산: ADT가 제공하는 작업(또는 함수). 이러한 연산은 데이터의 구조와 상관없이 외부에서 사용 가능한 인터페이스를 제공합니다.

예를 들어, 리스트 ADT는 다음과 같은 연산을 포함할 수 있습니다:

  • 삽입: 리스트에 요소를 추가.
  • 삭제: 리스트에서 요소를 제거.
  • 탐색: 리스트에서 특정 요소를 찾음.
  • 접근: 리스트의 특정 위치에 있는 요소를 읽거나 수정.

이 연산들은 리스트가 어떻게 구현되었는지와 관계없이 동일한 방식으로 제공됩니다.

추상화의 예

추상 자료형의 주요 목적은 복잡성을 줄이고, 코드의 재사용성을 높이며, 변경에 유연하게 대응할 수 있게 만드는 것입니다. 이를 위해 구체적인 자료구조 구현 세부 사항을 감추고, 일관된 인터페이스를 제공하는 것입니다.

ArrayList와 LinkedList의 예

Java의 List 인터페이스는 리스트 자료구조에 대한 추상 자료형을 정의합니다. List 인터페이스는 다음과 같은 메서드를 포함합니다:

  • add(E e): 요소를 리스트에 추가.
  • remove(Object o): 리스트에서 특정 요소 제거.
  • get(int index): 특정 위치의 요소 반환.
  • size(): 리스트의 크기 반환.

ArrayList와 LinkedList는 각각 List 인터페이스를 구현한 구체적인 자료구조입니다. ArrayList는 배열 기반으로, LinkedList는 노드 기반으로 구현됩니다. 하지만 이 두 클래스는 동일한 List 인터페이스를 구현하기 때문에, 사용자는 내부 구현을 신경 쓰지 않고 리스트의 기능을 사용할 수 있습니다.

import java.util.List;
import java.util.ArrayList;
import java.util.LinkedList;

public class AbstractDataTypeExample {
    public static void main(String[] args) {
        // List 인터페이스 타입으로 ArrayList와 LinkedList 선언
        List<String> arrayList = new ArrayList<>();
        List<String> linkedList = new LinkedList<>();

        // 동일한 방식으로 사용
        arrayList.add("ArrayList Element");
        linkedList.add("LinkedList Element");

        System.out.println(arrayList.get(0)); // 출력: ArrayList Element
        System.out.println(linkedList.get(0)); // 출력: LinkedList Element
    }
}

이 예제에서 arrayList와 linkedList는 서로 다른 자료구조로 구현되었지만, 동일한 List 인터페이스를 사용하여 동일한 방식으로 요소를 추가하고 접근할 수 있습니다.

추상 자료형의 장점

  1. 유연성: 구체적인 구현을 변경하더라도 인터페이스는 동일하게 유지되므로 코드의 다른 부분에 영향을 미치지 않습니다.
  2. 재사용성: 동일한 인터페이스를 통해 다양한 구현을 사용할 수 있으므로, 코드를 재사용하기 쉽습니다.
  3. 가독성: 복잡한 구현 세부 사항을 숨김으로써 코드를 읽고 이해하기 쉽게 만듭니다.
  4. 유지보수성: 인터페이스와 구현을 분리함으로써 유지보수를 용이하게 합니다.

결론

추상화된 자료구조는 데이터와 연산을 정의하는 인터페이스를 제공하여, 구현 세부 사항을 감추고 일관된 방식으로 사용할 수 있게 합니다. 이는 코드의 유연성, 재사용성, 가독성, 유지보수성을 높여줍니다. ArrayList와 LinkedList는 List 인터페이스를 구현한 구체적인 예로, 이를 통해 추상 자료형의 개념을 이해할 수 있습니다.

 

그럼 또 궁금한 점 ?

List와 Collection의 차이