List<> = new ArrayList<> 쓰는 이유
목차
ArrayList<> arr = new ArrayList<>(); 이 아니라
List<> arr = new ArrayList<> 처럼 부모클래스로 선언하는 걸 '업캐스팅'이라 한다.
이렇게 선언 시 말고도 업캐스팅이 유용하게 쓰이는 상황이 있다.
각 상황과 사용하는 이유를 알아보자❕ 우선 자바의 형변환 개념부터 알아보자
자바의 형변환
형변환은 다른 타입으로 변환하는 작업을 뜻한다.
업캐스팅 : 자식 클래스의 객체가 부모 클래스 타입으로 형변환되는 것
Parent obj = new Child();
다운캐스팅 : 업캐스팅된 것을 다시 원래로 돌리는 것
Parent p = new Child();
// 업캐스팅Child c = (Child) p;
// 다운캐스팅
업캐스팅/다운캐스팅 하는 이유?
이유를 각각의 케이스와 함께 알아보자.
우선 업캐스팅/다운캐스팅을 사용하는 경우는 주로 다음과 같다.
선언 시
선언부는 인터페이스로, 구현부는 자식클래스로 하는 경우
ex)
List<Object> arr = new ArrayList<>();
매개변수
매개변수로 인터페이스를 받을 경우
ex)
public void ...(CharSequence x)
배열타입
배열타입을 부모클래스로 선언할 경우
ex)
Parent[] arr = new Parent[10];
1. 선언 시
(업캐스팅한 경우, ArrayList만이 가진 메소드는 사용할 수 없다.)
이처럼 인터페이스로 선언하는 이유? (업캐스팅 하는 이유)
후에 구현체를 List의 다른 자식 클래스로 변경할 경우가 있을 수 있다.
그때 구현체를 바꾸어도 내부 코드를 바꿀 필요가 없다! 즉, 변경에 유연하다.
2. 매개변수
만약 메소드에서 문자열과 관련된 처리를 한다고 하자.
매개변수에서 CharSequence
인터페이스로 받을 경우, CharSequence
를 구현하는(상속받는) String
, StringBuilder
, StringBuffer
을 모두 매개변수로 받을 수 있다. 즉, 각각의 메소드를 따로 만들지 않아도 된다. 코드의 중복 없이 다형성을 구현할 수 있다. 그리고 함수 내부에서 instanceof
로 어떤 자식 클래스인지 구분해주면 된다.
3. 배열
부모 클래스로 배열을 선언하면 부모 자신과 자식 클래스 객체들을 모두 담을 수 있다.
여러 타입들을 한번에 처리해야 하는 경우, 배열을 통해서 반복문을 돌릴 수 있다. 혹은 여러 타입들을 한번에 매개변수로 보내야 할 경우에도 사용한다. 배열과 매개변수를 부모 타입으로 하면, 여러 자식 타입들을 한번에 배열에 담아 매개변수 하나에 보낼 수 있다. 그리고 실제 사용할 때는 다운캐스팅해서 원객체로 사용하면 된다.
정리하면
Reference
https://stackoverflow.com/questions/17059139/listobject-listobject-new-arraylistobject
책 <이펙티브 자바> - 아이템 64 객체는 인터페이스를 사용해 참조하라
Last updated