본문 바로가기

Java

컬렉션을 쓰는 이유

 

오늘은 컬렉션에 대해서 알아보겠다. 그러려면 우선 Collection이 뭔지부터 알아보자.

오늘도 equals 포스팅과 같이 내가 궁금했던 점들을 물음표 형식으로 풀어나갈 것이다.

 

Collection이 뭔가?

단순히 말하자면 데이터 묶음이다. 그냥 단순한 데이터 묶음은 아니고, 데이터를 저장하고, 검색하고 처리한다. 

 

그럼 Collection Framework는 뭐지?

효과적으로 데이터를 처리하기 위한 통일된 아키텍쳐라고 볼 수 있다. 데이터를 저장하는 자료구조와 데이터를 처리하는 알고리즘을 아래 구성요소로 제공해준다.

모든 collection framework은 다음과 같이 구성되어 있다.

  • Interfaces: 컬렉션을 표현하는 추상적인 데이터 타입이다. 자체적으로 데이터가 처리되는 컬렉션들이 이 안에 포함된다. 객체지향 언어에서는 인터페이스가 일반적으로 계층으로 구성되어 있다.
  • Implementations: 인터페이스의 구현체에 해당한다. 필수적으로 재사용성 있는 자료구조이다.
  • Algorithms: 데이터를 검색하고, 정렬하는 등 유용한 계산을 수행하는 메서드들이다. 컬렉션 인터페이스를 구현하는 객체(Implementations) 안에 포함되어 있다. 이 알고리즘들은 다형성을 가지고 있어서 같은 메서드를 인터페이스를 구현하고 있는 다른 많은 구현객체들에 의해 사용되어질 수 있다. 필수적으로 이 알고리즘들은 기능적으로 재사용성이 있어야한다. 

 

자바 프레임워크의 경우 어떻게 구성되어 있는지 알아보자.

초록색 - 인터페이스

파랑색 - 구현체

 

 

잠깐, 왜 Map은 Collection을 상속받지 않지?

java의 컬렉션 프레임워크라면 크게 list, set, map으로 알고 있는데, list와 set은 컬렉션이라는 인터페이스를 상속받는다. 근데 왜 map은 혼자 저렇게 따로 있는거지?공식 페이지에 따르면 '디자인 차이'라고 한다. 맵은 컬렉션이 아니고, 컬렉션도 맵이 아니다.만약 Map이 Collection이라면, Map에서 Element는 뭘까? Map의 구조를 봤을 때 합리적인 답은 'key-value 쌍'이 될 수 있다. 하지만 이대로 진행한다면 Map의 추상화에 한계를 만들어버린다. 주어진 key로 value 값을 찾아오는 것도 안되고, value 없이 key만으로 key-value 쌍을 지울 수도 없다.그럼 반대로 Collection이 Map을 상속받게 만들어진다고 해보자. 여기서 의문점을 낳는다. 그럼 Collection에 key는 어딨지? 만족스러운 답은 없다. 둘의 연관관계를 억지로 만들게 되면 부자연스러운 인터페이스가 만들어질 수밖에 없다.

 

데이터 묶음이면 그냥 배열 사용하면 되지 않나?

여기서 배열과 유사한 컬렉션 자료구조인 List와 비교하며 정리하고 넘어가야겠다.

 

배열

  • 배열 선언 시 크기가 고정되어 있다.
  • 연속적인 데이터라서 메모리 관리가 용이하다.
  • 데이터에 인덱스가 부여되기 때문에 검색에 유용하다.
  • 크기 확장(또는 삽입)이 불편하다. 더 큰 크기의 배열을 선언하고 배열을 복사하여 써야한다.
  • 크기를 변경할 수 없기 때문에 중간에 데이터를 삭제하면 데이터 낭비의 문제로 이어진다.

List

  • 크기가 유연하게 변경가능하다.
  • 위의 특징에 이어서 삽입, 삭제가 편리하다.
  • 불연속 데이터로 포인터를 통해 접근한다.
  • List도 순서를 보장해준다. 배열처럼 인덱스를 가지고 있지 않고 몇번째 데이터인지의 정보를 가지고 있다.
  • 빈틈없는 데이터 적재로 필요한 메모리만큼 차지한다.

배열의 단점(크기가 고정되어 있음, 삽입 삭제가 불편함.. 등)을 List가 커버해준다는 것은 알 수 있다.

하지만 무조건 어떤 자료구조가 더 좋다고 할 수 없다.

 

 

컬렉션을 씀으로써 얻을 수 있는 장점은?

이미 자료구조를 반영해 자바 언어로 구현해놓은 고품질의 프레임워크로 제공하기 때문에 low-level의 알고리즘을 고민할 시간을 아낄 수 있고, 그 시간에 애플리케이션 설계-개발에 집중할 수 있다.

컬렉션 프레임워크가 없는 환경에서 개발하고 있다고 상상해보자. 순서가 있는 데이터 묶음에 중간에 삽입과 삭제할 일이 잦은 자료형이 필요하다고 가정한다면 그 자료형을 코드로 직접 짜기위해 많은 고민을 해야할 것이다. 

또한 자바의 특성에 따라 자바 컬렉션 프레임워크의 경우 다형성을 가지고 있기 때문에 인터페이스의 변수에 필요한 자료구조를 가진 구현체를 선택하여 저장해 사용할 수 있다.

 

 

 

 


참고

 

'Java' 카테고리의 다른 글

JDBC가 뭐지?  (0) 2021.05.30
equals와 hashcode는 왜쓰는거지?  (0) 2021.05.25
[WS live-study] 8주차: 인터페이스  (0) 2021.02.13
[WS live-study] 7주차: 패키지  (0) 2021.02.07
[WS live-study] 6주차: 상속  (0) 2021.02.04