10분만 이 글에 투자해주시면
List, ArrayList, 인터페이스, 구현체 이해시켜드리겠습니다..
(지적은 언제나 대환영입니다.)
본 아티클 시리즈를 정독하면, 아래 의문에 답을 얻을 수 있습니다.
1. 인터페이스와 구현체가 무엇인가? (List와 ArrayList의 차이) -> 본편
2. ArrayList가 아닌 List 타입으로 선언하는 이유 (업캐스팅) (클릭🔗)
3. Set - HashSet, Map - HashMap 의 차이 (클릭🔗)
List<String> stringList = new ArrayList<>();
위 코드를 처음 보고 이런 생각이 들었습니다.
ArrayList<String> stringList = new ArrayList<>();
이렇게 바꿔야하는 거 아닌가?
어차피 ArrayList를 사용할 건데, 왜 타입은 List로 지정하는 거지?
이렇게 생긴 의문은 List와 ArrayList의 차이, List는 뭐였더라.. 등등 겉잡을 수 없는 의문 폭탄에 불을 붙였습니다.
누구에게는 상당히 쉬운 주제일 수 있겠으나,
자바 문법을 가볍고 빠르게 공부한 저에게는
전혀 이해가 되지 않는 문제였습니다.
하지만 이번 공부를 통해 인터페이스와 구현체에 관한 개념은 완벽하게 이해했다고 자부합니다.
관련해서 찾아보고 이해한 내용을 공유하고자 합니다.
Trust me, Follow me. ㅋㅋ
인터페이스(List)와 구현체(ArrayList)
List는 인터페이스이고, ArrayList는 클래스입니다.
그 차이를 알기 위해, 정의된 곳으로 가서 살펴볼 필요가 있습니다.
IntelliJ(또는 Eclipse)에서 List를 import한 후
List에 커서를 가져다 대고 cmd+B(ctrl+B)를 클릭하면, (또는 cmd + 마우스 좌클릭)
해당 클래스가 정의된 곳으로 이동합니다.
Let's go together~
어라.. ArrayList는 이상하다..! 왜 두 번 구현되어 있지..? (사실 두 번보다 더 많다.)
게다가 class나 interface로도 선언되지 않았습니다.
왜냐면, 해당 부분은 생성자를 구현한 부분이기 때문입니다.
위로 올라가면 ArrayList의 선언이 나옵니다.
ArrayList는 AbstractList를 상속받은 클래스입니다. AbstractList도 들어가봅시다.
implements List !!
그렇습니다.
결국 ArrayLisst는 List라는 인터페이스를 구현(implements)한 클래스입니다.
(중간을 매개하는 AbstractList 클래스는 맨 뒤 4번에서 다루겠으니, 잠시 잊어둡시다.)
여기서, 클래스(class)와 인터페이스(interface)의 차이를 짚고 넘어가겠습니다.
(필자는 둘의 차이를 정확히 알지 못했습니다.)
클래스(class) vs 인터페이스(interface)
클래스와 인터페이스는 모두 내부에 메서드를 가집니다.
하지만 클래스는 메서드의 body가 존재해서 그 내용이 구현된 반면,
인터페이스는 body가 존재하지 않습니다! (default, static 메서드는 예외)
여기까지는 필자도 이미 알고 있었지만, 왜 그렇게 되어 있는지는 몰랐습니다.
그것은 인터페이스와 클래스의 역할이 다르기 때문입니다.
아래에서는 List 인터페이스가 add, size 메서드 2개만 가지고 있다고 단순하게 가정하겠습니다.
List 인터페이스는 List가 갖춰야 할 기본 규격을 뜻합니다.
"List라고 하면, 자고로 add, size 메서드 정도는 있어야 해" 라고 알려주는 가이드와도 같습니다.
여기서, List안에 존재하는 add, size 메서드는 추상 메서드 라고 합니다.
구체적으로 기능이 구현된 메서드가 아니라, 그 존재만 추상적으로 선언된 것입니다.
ArrayList는 List 인터페이스를 구현(implements)한 클래스입니다.
List라는 규격에 따라, 실제로 add, size를 구현해서 사용하게끔 만들어졌다는 뜻입니다.
ArrayList 뿐만 아니라 LinkedList, Vector 등 List 인터페이스 규격에 맞게 설계된 많은 클래스들이 존재합니다.
이런 클래스들을 LIst의 구현 객체 또는 구현체 라고 부릅니다.
ArrayList는 그중 배열의 성질을 활용하기 위해 만들어진 하나의 구현체일 뿐인 것이죠.
이렇게 우리는
인터페이스(List)와 구현체(ArrayList, 클래스)의 뜻을 이해했고,
List와 ArrayList가 어떤 차이를 가지는 지도 파악했습니다.
List<String> stringList = new ArrayList<>();
그렇다면, 정말 많이 볼 수 있는 위 구문에서
stringList 변수는 List로 선언되고 ArrayList로 생성된 이유는 무엇일까요?
다음 아티클에서 설명드리겠습니다!! (링크 👇)
'Java' 카테고리의 다른 글
Set과 HashSet, Map과 HashMap의 차이 - 무조건 이해되는 List와 ArrayList의 차이(3) (0) | 2022.11.01 |
---|---|
ArrayList를 List로 선언하는 이유(업캐스팅) - 무조건 이해되는 List와 ArrayList의 차이(2) (0) | 2022.11.01 |
Java 에러 - org.junit.platform.launcher.core.EngineDiscoveryOrchestrator lambda$logTestDescriptorExclusionReasons$7 (1) | 2022.10.28 |
IntelliJ JDK 버전 바꾸기 (m1 macOs) (0) | 2022.10.27 |
Java 공부 자료 추천 - 생활코딩 vs 위키독스(점프 투 자바) (2) | 2022.08.09 |