ecsimsw
배열과 리스트, 어떤 것을 쓰시겠습니까? 본문
배열, 리스트 선택의 근거 잡기
같은 타입의 여러 객체를 단순히 참조만 하는 용도에는 배열이 좋다고 생각했다. 리스트보다 배열이 메모리 관리에 유리하다는 자료구조 책의 한 문장을 기억했지 그 이상을 알려하지 않았다.
배열과 리스트 중 어떤 것을 사용해야하는 지 선택의 근거를 나름대로 잡아보려 한다.
배열보다는 리스트를 사용하라
'Effective Java 규칙 28. 배열보다는 리스트를 사용하라'는 배열보다 리스트 사용을 권장하고 있다. 그 이유를 공부해왔다.
아래처럼 배열을 사용할 경우, ArrayStroreException을 컴파일 시점에선 알 수 없다. 배열은 공변형이고, 런타임에서야 원소의 자료형이 결정되기 때문에, 런타임에서야 그 실수가 드러난다.
Object[] objArr = new Long[1];
objArr[0] = "I don't fit it";
** 공변(Covariant) : sub가 super의 하위 타입이라면, sub[]는 super[]의 하위 타입이다.
** 실체화(reify) : 원소의 자료형이 런타임에서 결정된다.
반면 리스트/제네릭를 사용하면 incompatible types임을 컴파일 시점에서 확인할 수 있다.
List<Object> objList = new LinkedList<Long>();
objList.add("I don't fit it");
** 불공변(Invariant) : sub가 super의 하위 타입이라도, List<sub'>는 List<super>와 무관하다.
** 소거(erasure) : 원소 자료형을 컴파일에만 검사하고 런타임시에는 삭제한다.
무조건 리스트?
사실 위 내용을 공부하고도 리스트와 배열 사용의 명확한 기준을 잡지 못 했다. 위 내용을 안다는 것만으로 '앞으로 무조건 리스트만을 쓰겠어' 라는 언제나 진리인 규칙은 없을테니 말이다.
다만 리스트와 배열을 중 어느 것을 사용하면 좋을지를 고민할 때 결정의 근거가 되는 한가지 요소를 더 알았다는 것에 의의를 두려고 한다.
이전보다 조금은 더 논리를 갖고 배열 또는 리스트를 고민한다면, 그리고 그런 경험과 다른 지식이 더 쌓여간다면, 언젠가는 Effective java에서 벗어나 나만의 규칙이 만들어지지 않을까 생각한다.
'Language > Java, Kotlin' 카테고리의 다른 글
HashSet의 원리 (2) | 2021.03.12 |
---|---|
가독성 있는 자바 코드를 위한 나만의 규칙 (4) | 2021.03.04 |
UnmodifiableList은 원본 객체와의 참조를 끊지 않는다. (0) | 2021.02.15 |
왜 inner class, Lambda는 effectively final만 접근할 수 있을까. (2) | 2021.02.12 |
자바는 항상 Call by Value. (6) | 2021.01.10 |