-
2022년 7월 6일 TIL - 필요 이상의 영역을 굳이 미리 넘겨짚지 않기Today I Learned 2022. 7. 6. 23:15
ArrayList<> 인스턴스를 생성할 때 왜 일반적으로 ArrayList<> 구현체가 아닌 List<> 타입으로 선언하는지에 대한 의문이 있었다. 몇몇 블로그의 내용과 홀맨님이 알려주신 것들을 종합해본 내용은 다음과 같다.
- List는 interface이다.
- 이런 추상인 List에서 구현해야 하는 메서드 등을 각자에 맞게 구현한(implements) 것들이 ArrayList, LinkedList와 같은 구현체이다.
- interface 타입의 변수에는 구현체 인스턴스가 할당될 수 있으며, 해당 변수의 메서드는 구현체에 정의된 내용으로 수행된다. 그리고 특정 구현체의 인스턴스가 할당된 interface 타입의 변수에는 다른 구현체 인스턴스가 재할당될 수 있다. 이를 다형성(Polymorphism)이라 한다.
- 다형성을 지원할 경우 소스코드의 구조 변경에 유연하게 대처할 수 있다는 이점이 있다. 이를테면 LinkedList 형태로 구현된 변수들의 성능 이슈가 발생하여 ArrayList 형태로의 변경이 필요할 경우, LinkedList 인스턴스를 생성하는 것을 ArrayList 인스턴스를 생성하는 것으로 변경함으로써 손쉽게 구조를 변경할 수 있다.
- 그러나 구현체 인스턴스를 받는 변수의 타입을 인스턴스와 동일한 구현체로 지정할 경우, 해당 구현체의 interface를 구현한 다른 구현체 인스턴스를 재할당할 수는 없게 되어 구조 변경이 유연해지지 못하게 되는 문제점이 발생할 수 있다.
그럼에도 불구하고 개인적으로 '그렇다면 ArrayList<> 인스턴스가 할당된 List<>는 ArrayList<>에만 정의된 메서드는 사용할 수가 없게 되고, 그렇다면 ArrayList<>의 모든 기능을 온전히 활용하지 못하는 것 아닌가?'와 같은 고민을 했었다. 그러나 홀맨님으로부터 'ArrayList에만 정의된 메서드를 사용하는 경우는 극히 드물며, 그보다도 중요한 핵심은 다른 구현체들을 유연하게 사용할 수 있다는 것'이라는 조언을 듣고 난 뒤, 중요하지 않은 부분에 너무 집중해 필요한 수준 이상으로 시간을 쏟고 있었다는 생각이 들었다.
주어진 시간은 부족하고, 찾아지는 지식의 양은 너무 방대하다. 개념을 찾아 이해하려 하는 과정에서도 이 개념이 실질적으로 어떻게 쓰이기 때문에 중요하고, 개념을 사용하지 않을 때 대비 사용할 때 어떤 이점이 있는지에 중점을 두고 바라볼 필요가 있다.
Reference: docs.oracle.com, ics.uci.edu, 블로그
'Today I Learned' 카테고리의 다른 글
2022년 7월 8일 TIL - 미라클 모닝 참여 후기 (0) 2022.07.08 2022년 7월 7일 TIL - 적합한 이름 짓기라는 이름의 고통 (0) 2022.07.07 2022년 7월 5일 TIL - 허물을 벗었으면 다시 움직임을 (0) 2022.07.05 2022년 7월 4일 TIL - 구멍이 숭숭 (0) 2022.07.05 2022년 7월 3일 TIL - Pressure (0) 2022.07.03 - List는 interface이다.