List<Integer> list = new ArrayList<Integer>();
ArrayList<Integer> list = new ArrayList<Integer>();
List와 ArrayList의 차이를 알아보자
- List = 인터페이스
- ArrayList = List에 상속된 클래스
✅List?
위에 언급한 것처럼 List는 인터페이스이다.
처음 코드블럭처럼 List 자료형으로 선언 시에, 그 구현체를 ArrayList나 LinkedList로 구현 할수도 있다.
그러나 처음부터 ArrayList로 선언시, 데이터의 용도가 바뀌어 삽입/삭제가 유리한 LinkedList 구조로 변경 시 ArrayList로 선언된 모든 부분을 LinkedList로 변경해줘야 하기 때문이다. 즉, 다형성 지원을 위해 추후 변경에 대해 유연한 구조로 미리 설계하는 방식인 것이다.
인터페이스가 궁금하다면?
클래스는 크게 일반 클래스와 클래스 자체에 abstract가 붙거나 클래스 내에 '추상 메소드'가 하나 이상 존재하는 추상 클래스로 나뉜다.
인터페이스는 클래스 내에 선언된 모든 메서드가 추상 메소드인 클래스를 의미하는데, 이 인터페이스를 상속받는 클래스는 인터페이스에서 정의된 추상 메소드를 모두 구현해야한다.
✅ArrayList
ArrayList는 클래스이다.
ArrayList는 List 인터페이스를 구현하고 있기 때문에 List가 제공하는 기능들을 다 제공할 수 있기에, List 선언 시에 구현 인스턴스의 자료형으로 작성할 수 있다. 그러나 List와 다르게 ArrayList의 자료형으로 생성 시 LinkedList로 새로운 구현체나 형변환은 할 수 없다.
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
ArrayList<Integer> list = new ArrayList<Integer>();
list = new LinkedList<Integer>(); // error 발생
일반적으로 ArrayList를 선언 시에는 업캐스팅을 통해서 사용하는데 , 아래와 같은 이유가 있다.
참고로 업캐스팅이란?
자식클래스의 객체가 부모 클래스 타입으로 형변환 되는 것을 말한다.
고로고로 참고로 다운캐스팅은 업캐스팅된 것을 다시 원상태로 돌리는 것을 말하며,
클래스로의 다운캐스팅 시에는 타입을 명시적으로 지정해줘야한다.
업캐스팅 EX) Person p =s;
다운캐스팅 EX) Student s = (Student)p;
ArrayList<Object> list = new ArrayList<>(); 가 아닌,
대부분 List<Object> arrList = new ArrayList<>(); 를 사용하는 이유
1. 대부분의 경우 ArrayList에서만 제공하는 기능을 사용하지 않는다.
- List에서도 제공하는 기능인데, ArrayList를 선언한다는 것
- List로 선언해야 List에서 제공하는 메소드까지 사용가능하다.
2. LinkedList나 ArrayList를 유동적으로 사용해야할 때 더 편하다.
❗결론
객체는 인터페이스를 사용하여 선언하는 게 좋다.
- 매개변수 뿐 아니라 리턴값, 변수, 필드를 가능한 인터페이스 타입으로 선언가능하다.
- 적합한 인터페이스가 없다면, 클래스 계층구조 중 최상위 클래스를 사용하자.
읽어봐주셔서 감사합니다. 도움이 되셨으면 좋겠습니다.
참고자료 :
https://computer-science-student.tistory.com/335
https://jistation.tistory.com/entry/JAVA-List-%EC%99%80-ArrayList-%EC%B0%A8%EC%9D%B4
https://velog.io/@adam2/Array%EC%99%80-List%EA%B7%B8%EB%A6%AC%EA%B3%A0-Java-List
'Language & Framework & GIT > JAVA' 카테고리의 다른 글
[JAVA] Call by reference & value (1) | 2022.12.27 |
---|---|
[JAVA] List ? ArrayList? #1 (0) | 2022.12.14 |
[언어공부] 코테를 위한 JAVA 뽀개기 #4 #끝 (1) | 2022.10.29 |
[언어공부] 코테를 위한 JAVA 뽀개기 #3 (0) | 2022.10.28 |
[JAVA] this / super (0) | 2022.10.22 |
댓글