ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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, 블로그

    댓글

Designed by Tistory.