자바에서 변수를 선언할때 보통 아래와 같이 선언한다.
Type<T> 변수 = new Type<>();
하지만 ArrayList의 경우에는 보통 List 타입으로 선언한다.
List<T> arrayList = new ArrayList<>();
그 이유가 궁금해서 찾아보기 전 나는 List 클래스의 method가 ArrayList보다 더 많이 제공하고 편한가? 라는 생각을 했다.
1. List
먼저 List는 클래스가 아닌 인터페이스였다.
List 인터페이스를 들어가보면 아래와 같이 인터페이스로 구현되어 있다.
public interface List<E> extends ~
추가로 공식문서에서도 인터페이스라는 것을 확인할 수 있다.
인터페이스란 메소드를 선언만 해놓고 다른 클래스에서 인터페이스를 implement 하여 인터페이스에 존재하는 메소드를 사용한다.
그렇다면 ArrayList 말고도 다른 클래스에서 List라는 인터페이스를 implement 한다는 것을 알 수 있다.
List 인터페이스를 implement 하는 클래스는 공식문서에서 아래와 같이 찾아볼수 있다.
AbstractList, AbstractSequentialList, ArrayList, AttributeList, CopyOnWriteArrayList, LinkedList, RoleList, RoleUnresolvedList, Stack, Vector
그렇다면 ArrayList 클래스를 다른 클래스로 변경할때에도 같은 List 인터페이스를 사용하고 있으므로 기존 로직은 변경될게 많이 없다는 뜻이 될수 있다.
위 스택오버플로우 답변에서 큰 프로젝트에서 이와같이 코드를 삭제하지 않고 클래스를 바꾸는것은 중요하다고 한다.
이와 같이 성질을 다형성 이라고 한다.
다형성이란 어떤 객체의 속성이나 기능이 상황에 따라 여러 가지 형태를 가질수 있는 성질이다.
List라는 상위 인터페이스로 하위 ArrayList를 참조하는 것이다.
여기서 ArrayList는 Stack이 될수도 있고 다른 클래스가 될수도 있다.
이와 같이 하위 클래스를 상위 클래스로 선언하는 것을 업캐스팅 이라고 한다.
2. 캐스팅
자바에서는 타입이 다르면 선언이 불가하다.
하지만 ArrayList 가 List를 부모로서 상속 받기 때문에 선언이 가능하다.
이를 업캐스팅 이라고 한다.
업캐스팅의 특징 중 하나는 자식 클래스만 가지고 있는 메서드는 실행하지 못한다고 한다.
이를 위해 자식 클래스가 가지고 있는 메소드를 사용하기 위해 다운 캐스팅을 하기도 한다.
그래서 업캐스팅과 다운캐스팅은 반대되는 개념과 살짝 다른 특징을 보여준다.
업캐스팅은 주로 자식들을 하나의 인터페이스로 통일시키기 위해,
다운캐스팅은 자식이 가지고 있는 메소드나 속성을 사용하기 위해라고 이해했다.
그렇다면 List로 업캐스팅한 ArrayList는 어떠한 메소드를 가지고 있는지 공식문서에서 찾아봤다.
clone(), removeRange(), forEach 등 여러개의 메소드를 가지고 있다.
forEach는 List의 상위 인터페이스인 Collection의 stream 메소드를 이용하여 구현할 수 있다.
결론은 다형성을 위해 결합도를 낮추고 응집도는 높인 코드를 작성하기 위함이라고 생각한다.
출처
https://bibi6666667.tistory.com/236
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/ArrayList.html
'개발 > JAVA' 카테고리의 다른 글
[Java] 필드 주입시 생성자에 this 꼭 써야할까? (0) | 2023.06.05 |
---|---|
[Java] @Override 꼭 적어야 하나? (0) | 2023.05.04 |
[Java] 인터페이스가 가진 객체지향의 특징 (0) | 2023.05.03 |
[JAVA] 입력 받은 숫자가 소수인지 판단하는 문제 뜯어보기 (0) | 2023.04.06 |
[JAVA] java 기본개념 (+ jshell) (0) | 2023.04.04 |