컬렉션 프레임워크란 ?

컬렉션 프레임워크란 , 데이터 군을 저장하는 클래스들을 표준화한 설계 를 뜻한다.

컬렉션 : 다수의 데이터 / 데이터 그룹 프레임워크 : 표준화된 프로그래밍 방식

컬렉션 프레임워크 같은 경우에는 다수의 데이터를 다루는데 필요한 클래스들을 제공해주고, 인터페이스와 다형성을 이용한 객체 지향적 설계를 통해 표준화 되어있기 때문에 사용법을 익히기에도 편하고 재사용성이 높은 코드를 작성할 수 있다는 장점이 있다. → 유지보수에 좋다.

컬렉션 프레임워크의 핵심 인터페이스에 대해 알아보자.

컬렉션 프레임워크의 핵심 인터페이스

컬렉션 프레임워크에는 크게 3가지의 타입이 존재한다.

출처 : https://blog.naver.com/heartflow89/220989831899

리스트 인터페이스

리스트는 순서가 존재한다. (인덱스) 또한 데이터의 중복을 허용한다. 우리의 일상속에서 리스트를 뽑아보자면 단순히 대기자 리스트를 생각하면 쉽다 .😶‍🌫️

어레이리스트/링크드 리스트의 차이점

일단 어레이리스트와 벡터의 차이점 부터 알아보자.

어레이 리스트는 기존의 Vector 를 개선한 것으로, 구현원리와 기능이 동일하다고 할 수 있다.

가장 큰 차이점은 , 벡터 같은 경우에는 동기화가 된다면, 어레이 리스트는 동기화가 되지 않은 상태이다.

더 쉽게 표현하자면, 벡터는 한개의 스레드에서만 접근이 가능하다면, 어레이 리스트는 여러개의 스레드에서 접근이 가능하단 말이다.

더 크게 나아가 어레이 리스트와 링크드 리스트의 차이점을 알아보자.

출처 : https://javagoal.com/difference-between-arraylist-and-linkedlist/

이미지를 보면 알겠지만 , 어레이 리스트는 단순히 어떤 것들이 주르륵 늘어져 있다면, 링크드 리스트는 각 각마다 체인처럼 연결이 되어있다.

가장 큰 차이는 어레이 리스트는 중간에 하나의 요소가 빠진다면, 각각의 순서에 저장되있는 요소들이 한칸씩 앞으로 이동한다. 대기줄을 생각해보자. 한명이 빠지면 우루루 ~ 앞으로 몰려나간다.

링크드 리스트는 무언가로 연결이 되어있다보니 중간에 하나의 요소가 빠진다면, 그 연결을 끊고 그 부분만 앞뒤 요소에 연결해주면 된다. 직접 줄을 스는것보단, 번호표를 뽑고 대기한다고 생각하면 편하다. 🖨

각각 두 클래스의 활용 차이는, 요소가 많이 빠지고 추가된다면 링크드 리스트를, 요소가 많이 변동되지 않고, 일정하다면 검색 속도가 더 빠른 어레이 리스트를 사용하자.

Set 인터페이스

Set 과 List 의 차이는 List는 순서를 저장하고, 중복을 허용한다면 Set은 대체로 순서를 저장하지 않고, 중복을 허용하지 않는다. (인덱스가 존재하지 않는다.)

중복이 허용되지 않기 때문에, null 도 하나만 저장할 수 있다. 수학의 집합에 비유될 수 있다.

(인덱스가 존재하지 않기 때문에 객체에 접근하기 위해서는 Iterator 를 사용해야 한다.)

중복되지 않아야하는 무언가에 사용하면 된다. 예를 든다면 사람 을 가지고 그룹을 짤때. 복제인간이 존재하지 않듯이 (존재할 순 있지만..) 중복값이 없어야 할때 사용한다.

Set 인터페이스를 상속받는 하위 클래스에는

  • HashSet : 무작위로 중복되지 않는 값을 담는다. (순서를 가지지 않는다.)
  • LinkedHashSet : 넣은 순서대로 값을 담는다. (하지만 중복은 허용되지 않는다.) 중복은 허용되지 않으면서 순서는 저장하고 싶을때 사용한다.
  • TreeSet : 저장 순서를 갖지 않고 중복을 허용하지 않는다. 중복되지 않으면서 특정 규칙에 의해 정렬된 형태의 집합을 쓰고 싶을 때 쓴다. ( 데이터의 값에 따라 정렬된다. )

이 있다.

이렇게 같은 값이 들어가지 않는 집합을 생각하면 쉽다.

Map 인터페이스

Set 과 List 의 차이점은, 중복허용과 순서의 유무라면, Map 은 키와 벨류를 가진다.

Set과 마찬가지로 값의 순서를 저장하지 않는다. 만약에 같은 이름의 키에 벨류가 저장된다면, 가장 최근에 저장한 값이 벨류가 된다.

Map 같은 경우엔 자바에서는 Map을 Collection이라고 보지 않는다고 한다.

매핑(mapping)이 collections라 보기 힘들고, collections 또한 mapping이라고 보기 힘들다고 합니다. 그렇기 때문에 Collection 인터페이스를 상속하는 것은 의미가 없다고 합니다.

첫 번째, Collection 인터페이스를 상속하여 구현된 클래스들은 모두 단일 데이터를 처리하지만, Map은 Key와 데이터가 쌍이으로 이루며 처리하기 때문에 굳이 Map만을 위해 Collection에서 Map과 관련된 메소드를 만들 필요가 없습니다. (→ 인터페이스의 의미가 모호해짐)

두 번째, Iterable 인터페이스와 Map 인터페이스간의 문제도 있습니다. Iterable은 반복 가능한 형태를 의미하는데, Map의 구조인 Key, Value에서 어떤 것을 반복자로 할것인가에 대해서도 모호합니다. 

그렇기 때문에 Map은 Collection 인터페이스가 아니지만, Collection Framework에는 포함되는 것입니다.

출처:

https://livenow14.tistory.com/31

[경험의 연장선:티스토리]

  • HashTable : 리스트 인터페이스의 Vector 와 비슷하게 자바 초기버전에 나온 레거시 클래스이다. Key 와 Value 값이 null 이면 안되고, vector 처럼 동기화 처리가 되어 하나의 스레드에서만 접근이 가능하다.

  • HashMap : 정렬되지 않은 Map을 제공한다. 동기화 되지 않고 null 을 허용한다는점을 제외하면 HashTable과 거의 동일하다.

  • LinkedHashMap : LinkedHashSet 과 마찬가지로 입력순서대로의 순서를 저장한다. 삽입 삭제는 HashMap 보다 느리지만 더 빠른 조회가 가능하다.

  • TreeMap : 정렬된 Map을 제공한다. TreeSet과 비슷하게 데이터 값을 기준으로 정렬을 할 수 있다. /레드,블렉 트리로 구현이 되어있다.

컬렉션 프레임워크에 대한 글은 계속 이어집니다-

profile
자스코드훔쳐보는변태

0개의 댓글