자료구조를 공부하다가 리스트 선언에 대한 의문을 가지고 정리하게 되었습니다.
1️⃣ List vs ArrayList
- List : 인터페이스
- ArrayList, LinkedList, Vector 등 여러 구현체(클래스)의 공통 규약을 정의합니다.
- add(), get(), remove() 같은 메서드가 정의되어 있지만 구현은 없습니다.
- ArrayList : List 인터페이스를 구현한 클래스
- 내부적으로는 배열로 요소를 관리하며, 요소를 순차적으로 저장합니다.
- 인덱스로 빠르게 접근할 수 있습니다. - O(1)
- 중간 삽입/삭제는 느립니다. - O(N)
2️⃣ List<Integer> list = new ArrayList<>();
의미
인터페이스 타입으로 선언, 구현체로 생성
- 선언 타입 : List (인터페이스)
- 실제 객체 : ArrayList (구현체)
장점
- 나중에 구현체를 쉽게 바꿀 수 있습니다.
List<Integer> list = new LinkedList<>();
- 코드의 유연성(확장성) 증가 : 코드가 인터페이스에만 의존하면, 구현체가 바뀌어도 메서드 변경이 없습니다.
- 좋은 설계 원칙 : 상위 타입(List)으로 참조 → 구현체 숨김 → OCP(Open-Closed Principle)
- 나중에 구현체를 쉽게 바꿀 수 있습니다.
3️⃣ ArrayList<Integer> list = new ArrayList<>();
의미
구현체로 선언, 구현체로 생성
- 선언 타입 : ArrayList (구현체)
- 실제 객체 : ArrayList
특징
- ArrayList에만 있는 특화 메서드를 사용할 수 있습니다.
- 그러나 대부분의 경우 ArrayList만의 특화 기능은 거의 없습니다.
- 따라서 불필요하게 구현체에 종속적이 됩니다.
4️⃣ 차이점 : 다형성(polymorphism)
선언 방식 | 다형성 | 구현체 교체 | 유연성 |
---|---|---|---|
List list = new ArrayList<>(); | O | O | 유연 |
ArrayList list = new ArrayList<>(); | X | X | 덜 유연 |
언제 ArrayList 타입으로 선언하나?
특별한 이유가 없다면 인터페이스 타입(List)로 선언하는 것이 바람직합니다.
하지만 ArrayList의 고유 메서드를 써야 한다면 ArrayList로 선언해야 합니다.
예: trimToSize(), ensureCapacity()
5️⃣ 전체 비교 정리
구분 | List | ArrayList |
---|---|---|
타입 | 인터페이스 | 클래스 (구현체) |
역할 | 규약만 정의 | List를 배열 기반으로 구현 |
구현체 교체 | 유연 | 어려움 |