본문 바로가기
Data Structure/Collection

Collection 프레임워크

by yoondoo 2022. 12. 5.
728x90

쉽게 구현해보는 자바 어플리케이션 3기의 첫 내용이
collection과 stream API을 비교하면서 어떤 점이 다르고 stream을 사용했을 때 컬렉션보다 더 좋은점은 무엇인지 알아보는 강의 인데 나는 컬렉션을 제대로 공부해본 적이 없어서....

먼저 컬렉션에 대해서 먼저 학습하는 차원에서 Collection과 Map에 대해서 정리하려고 한다.

 

본 글은 생활코딩님의 강의를 중점으로 정리한 글이고

Set은 HashSet

List는 ArrayList

Map은 HashMap

을 우선 예시로 사용하고 기타 다른 하위 클래스들은 추후에 더 자세한 글로 정리하겠다.


● Collection

객체, 데이터를 효율적으로 사용할 수 있는 자료구조들이 있는 라이브러리가 컬렉션(Collection) 프레임워크

쉽게 말해서

컬렉션 프레임워크는 (다양한 특성의 값을 담는 그릇들)을 가지고 있는 컨테이너라고 생각하면 된다.

컬렉션이 가지고 있는 그릇 중 담으려는 값의 특성, 성격을 고려해 알맞은 것을 사용하면 된다는 얘기다.

즉, 자신이 하고자 하는 일에서 적당한 구성요소(그릇, 클래스)를 선택해서 사용할 줄 알아야 한다.

 

예로 배열과 비슷하지만 크기에 제약이 없고 값을 추가할 때 마다 크기가 자동으로 증가하는 형태를 원하면
List클래스(의 하위 클래스)를 선택해서 사용하면 되는 것이다.

 

우선 컬렉션의 구성을 그림으로 살펴보면

출처 - https://techvidvan.com/tutorials/java-collection-framework/

 

상위에 속하는 값들은 대부분 인터페이스로 구현되어 있고 하위 클래스들이 상위 인터페이스를 상속받아 사용하고 있는 구성이다.

 

위의 사진은 복잡하니 아래사진으로 좀 더 설명을 이어나가겠다.

출처 - https://opentutorials.org/module/516/6446

먼저 List를 설명하기 전 ArrayList가 어디에 존재하는지 보자.

Collection - List 컨테이너에 속해있다. List는 인터페이스이기 때문에 하위 클래스들 전부 List인터페이스를 구현하기 때문에 같은 API를 가지고 있다.


● List - ArrayList

List의 특징은 두 가지가 있다.

1. 중복이 허용된다.
2. 순서가 존재한다.

ArrayList는 이름에서 보다시피 배열과 유사해 보이지만 완전히 다른 특성을 가지고 있다.

배열과 ArrayList의 차이
결과값

코드의 주석처리를 보면 알다시피 제일 큰 차이점은 크기의 제약이다.

 

배열은 선언하거나 초기화시 지정된 크기의 범위를 넘어서는 행위를 하면 ArrayIndexOutOfBoundsException 에러가 발생한다.

 

ArrayList는 선언시 크기를 따로 지정해주지 않기 때문에 정해지지 않은 크기의 배열이 필요할 때 사용하면 유용하다.

 

그리고 원래 제네릭<>을 사용해서 타입의 안정성과 코드의 중복성을 보장해줘야 하는데 제네릭에 관한건

(추가)링크를 통해 따로 정리했다.


● Set - HashSet

Set은 집합이다.

수학의 정석 앞장에 나오는 그 집합과 똑같다고 보면된다.

 

Set은 두 가지 특징이 있다.

1. 중복이 허용되지 않는다.
2. 순서가 존재하지 않는다.

눈치 빠른분은 아마 List와의 차이점이 보일 것이다.

 

Set과  List의 차이점을 비교해 보면서 각각의 특징을 알아보자.

빨간 구간 위주로 보면 된다.
결과값

A에 add()메서드를 통해서 2를 총 4번을 넣었고 출력해보면 2가 한 번 들어가 있는 것을 볼 수 있다.

 

Iterator는 (추가)링크에 따로 정리했다.

 

이처럼 Set은 중복되는 값 말고 고유한 값들만 저장한다.
( 이러한 특성을 이용해서 코테 문제에 중복되는 값을 빠르게 없애는데 사용할 수 있을 것 같다.)

 

contaionsAll()메서드는 부분집합인지 아닌지 boolean값을 리턴해준다고 보면 된다.

출처 -&nbsp;https://opentutorials.org/module/516/6446

addAll()메서드는 합집합(Union)으로 보면 된다.

addAll()
결과값
출처 -&nbsp;https://opentutorials.org/module/516/6446

retainAll()메서드는 교집합으로 보면 된다.

retainAll()
결과값
출처 -&nbsp;https://opentutorials.org/module/516/6446

removeAll()은 차집합으로 보면 된다.

removeAll()
결과값

 

출처 -&nbsp;https://opentutorials.org/module/516/6446


● Map - HashMap

Map은 Key와 Value의 쌍으로 값을 저장하는 컬렉션이다.

1. Key는 중복이 안된다.
2. Value는 중복 허용 된다.

Id와 Password를 생각하면 된다. 아이디는 중복되면 안되지만 비밀번호는 중복되도 상관 없는 것 처럼 말이다.

 

Map인터페이스는 Collection인터페이스를 상속하지 않기 때문에 add()메서드가 아닌 put()메서드를 사용한다.

이미 Key값에 "two"가 존재하는데 put("two",200)을 하면 새로운 two,200의 값이 생기는 것이 아닌
기존에 있던 키의 값이 교체된다.

200이라는 Value값이 중복되지만 Value는 중복을 허용하기 때문에 put("이",200)를 하면 
Key : "이" Value : 200 의 값이 생성된다.


출처 - https://prashantgaurav1.files.wordpress.com/2013/12/java-util-collection.gif

위의 사진을 보면 Collection 인터페이스를 Set과 List 인터페이스가 상속받고 있는데
Set의 인터페이스 메소드는 추가적인 메소드가 없으므로 Collection의 메소드와 정확히 일치한다고 보면 된다.

List는 Set과 다르게 메소드들이 더 있는데 메서드들의 매개변수를 보면 index가 있는 것을 확인할 수 있다.

 

List의 특징이 순서가 있기 때문이다. 

 

마지막으로 표로 각각의 인터페이스들의 특징을 보며 마무리 하겠다.

  Set List Map
순서 O X X
중복 O X Key : X  |  Value : O
종류 ArrayList
Vector
LinkedList
Stack
HashSet
TreeSet
LinkedhashSet
HashMap
TreeMap
HashTable

%Collection과 Collections는 다르다.

 

Stream을 공부하기 위해 급하게 정리하는 거라 대표적인 것만 빠르게 보고 넘어가지만 다시 하나하나의 특징을 비교해 보면서 정리를 이어가보려 한다.

반응형

댓글