얼마 전에 면접을 보러 갔다가 이런 질문을 받았다.
면접관 : ArrayList는 List interface를 구현한 클래스인데 3가지 정도가 같이 넘어오는데 그게 뭔지 아나요?
라는 말을 듣고 아주 그냥 멘붕이 왔었다.
그래서 이 글에는 그 내용을 정리해보려고 한다.
이 질문에는 두가지의 의미를 가지고 있다고 생각했다.
첫 번째로는 객체지향프로그래밍(OOP)과 설계 관념에서의 추상적 개념
두 번째로는 실제 기능 관점
아마 첫번째가 맞을 것 같지만 두 가지 모두 끄적여보려고 한다.
객체지향프로그래밍(OOP)와 설계 관념에서의 추상적 개념
1. 다형성 (Polymorphism)
- List list = new ArrayList(); 이렇게 선언하면 List 타입의 참조 변수로 ArrayList 객체를 다룰 수 있다.
- 이는 인터페이스를 구현한 클래스가 다형성을 지원하기 때문에 가능
- 인터페이스를 통해 코드의 유연성과 확장성을 확보할 수 있다.
2. 업캐스팅 (Upcasting)
- ArrayList 객체를 List 타입으로 형 변환 없이 담을 수 있다.
- ArrayList는 List의 자식이기 때문에 자동으로 업캐스팅이 된다.
List<String> list = new ArrayList<>(); // 예를 들자면 이런식으로
3. 인터페이스 기반 프로그래밍 (Interface-based programming)
- List 인터페이스를 기준으로 코딩하면, 이후에 ArrayList, LinkedList, Vector 등으로 쉽게 교체할 수 있다.
- 즉, 구현체를 바꾸더라도 코드 수정이 최소화됨 → 객체지향 설계의 중요한 원칙
List<String> list = new ArrayList<>();
// 나중에 바꾸기 쉬움
list = new LinkedList<>();
이걸 정리해본다면
다형성
업캐스팅 (유연한 객체 참조)
인터페이스 기반 설계 (유지보수성과 확장성 확보)
이렇게 세 가지가 있는 것..
실제 기능 관점
사실 기능 관점에서는 3가지가 넘어가는데 면접관님이 굳이 3가지라고 말한 거 보면 이건 아닌 거 같긴 하다!
그래도 까먹을 수도 있고 알아두면 좋으니까 간략하게 작성하겠다.
1. 요소 추가 (add())
- add(E e) / add(int index, E element)
- List의 가장 기본적인 기능 중 하나
- 순서를 유지하면서 요소를 삽입할 수 있는 특징
2. 요소 접근 (get())
- get(int index)
- 인덱스를 통한 순차적 접근이 가능하다는 게 List의 차별점
- 특히 ArrayList는 이 기능이 상수 시간(O(1))이기 때문에 매우 빠름
3. 요소 개수 확인 (size())
- size()
- 리스트에 얼마나 많은 요소가 들어있는지 확인하는 기능
- 컬렉션의 상태를 판단하는 데 기본이 되는 메서드
물론 cotain()이나 remove()도 중요하지만 기초적이고 본질적인 3가지를 뽑으라면 이 세 개인 것 같다.
다른 List 구현체에서도 공통적으로 쓰이니까..?
앞으로는 이런 거 안 까먹어야지 ㅋㅅㅋ
혹시 잘못된 내용이 있거나 저 질문에 대한 다른 의견이 있으면 댓글로 꼭 알려주세요~!~!
'Java' 카테고리의 다른 글
| [Java] 제네릭 (Generic) 완전 정복 T와 와일드 카드 (0) | 2026.06.17 |
|---|---|
| [Java] HashMap 은 뭐고 어떻게 동작 하는 걸까? (0) | 2026.04.03 |
| Java - Collection Framework란? (0) | 2025.04.24 |
| Java - for each문 직접 구현해보기 (0) | 2025.04.24 |
| Java - for each문 (0) | 2025.04.24 |