Java/컬렉션 프레임워크

List, Set, Map 인터페이스

재성스 2023. 8. 27. 15:26
반응형

Collection 인터페이스 (List, Set의 조상)

 

 Collection 인터페이스의 메서드

 

Collectrion 인터페이스는 컬렉션 클래스(List, Set으로 구현한 클랙스) 저장된 데이터를 읽고, 추가하고, 삭제하는 컬렉션을 다루는데 가장 기본적인 메서드들을 정의하고 있다.

 

 


 

List 인터페이스 (Collection 인터페이스의 자손)

 

List 인터페이스는 데이터 값에 대한 "중복을 허용"하고 "저장순서가 유지"되는 컬렉션을 구현하는데 사용된다. List 인터페이스를 구현한 클래스로는 ArrayList, LinkedList 있다.

  • 순서 O, 중복O

 

*참고* 위 List 인터페이스 특징에 대해 서술한 "컬렉션 구현하는데 사용된다". 말에 혼동이 있다.  컬렉션은 일반적으로 컬렉션 프레임워크의 인터페이스로 구현한 클래스의 "인스턴스" 표현하는 개념이다.

 

 

예를 들어, "List 컬렉션"이라고 하면 List 인터페이스를 구현한 클래스인 ArrayList LinkedList 같은 클래스의 "인스턴스" 의미하는 것이다. 마찬가지로 "Set 컬렉션"이라고 하면 Set 인터페이스를 구현한 HashSet TreeSet 같은 클래스의 인스턴스를 말하는 것이다.

 

 

 

List 상속 계층도

 

 

List인터페이스의 메서드 (Collection 인터페이스 메서드는 제외)

 


Set 인터페이스(Collection 인터페이스의 자손)

Set 인터페이스는 List와는 반대로 "중복을 허용하지 않고" "저장순서가 유지되지 않는" 컬렉션 클래스를 구현하는데 사용된다. Set 인터페이스를 구현한 클래스로는 HashSet, TreeSet 등이 있다.

  • 순서 X 중복 X 

 

Set 상속계층도

 

 

Set 인터페이스의 메서드(Collection 인터페이스의 메서드는 제외)

 

 


Map 인터페이스

 

Map 인터페이스는 키(Key)와 값(Value)을 하나의 쌍으로 묶어서 저장하는 컬렉션 클래스를 구현하는 데 사용된다. 키는 고유해야하므로, 중복될 수 없지만 값은 중복을 허용한다. (Key와 value의 관계를 id와 password의 관계와 같다고 생각하면 쉽다. 사용자의 id는 중복되면 안되지만, password는 중복되어도 상관없다). 

  • 순서 X 중복 (키 X 값 O)

 

기존에 저장된 데이터와 중복된 키와 값을 저장하면 기존의 값은 없어지고 마지막에 저장된 값이 남게 된다.(키의 중복을 허용하지 않기 때문)

 

 

Map인터페이스를 구현한 클래스로는, Hashtable, HashMap, LinkedHashMap, SortedMap, TreeMap 등이 있다.

 

 

*참고*  키와 인덱스는 비슷하지만 다른 개념이다. 인덱스는 순차적인 위치를 가진다는 개념이지만, 키는 특정 위치라는 개념이 없다. 책으로 비유하자면, 소설 책과 사전이라고 생각할 수 있다. 소설 책을 읽는 방법은 순차적으로 페이지를 넘겨가며 읽지만, 사전은 특정 단어를 찾아서 읽는다. 여기서 소설책의 페이지 번호를 인덱스라고 비유하고, 사전의 특정 단어는 키라고 표현할 수 있는 것이다.

 

이 예시에서는 사전의 정렬 방식은 제외를 하고 생각해야 이해할 수 있다. 단지 특정 단어로 값을 찾다라는 의미에 초점을 두어야 한다. 그 이유는 Map의 요소(키, 값)은 순차적으로 메모리에 저장되지 않고 분산되어 저장되기 때문이다. (Map의 특징 순서X) 

 

 

 

Map의 상속 계층도 

 

Map 인터페이스의 메서드

 

*참고* 위 메서드에서 반환 타입이 Collection인 것과 Set인 것이 약간의 혼동을 일으킬 수 있다. 이는 Java의 컬렉션 프레임워크 설계에서 유래한 것이다. Collection 인터페이스(List, Set)는 List, Set과 같은 "단일 요소 컬렉션"을 다루는 인터페이스이다. 반면 Map은 요소가 키와 값, 쌍으로 이루어져 있다. (즉, 키와 값이 하나의 요소로 취급된다.)

 

 

Map 인터페이스의 values() 메서드는 키-값 중 모든 '값(value)'을 컬렉션(Collection) 형태로 반환한다. (키와 값을 분리하여 값만을 다루게 되면 "단일 요소로써" Collection으로 다루는 것이 효율적이라서 반환 타입이 Collection인 것이다.) 이는, Map의 모든 값들을 모아서 List나 Set처럼 다룰 수 있도록 도와준다.(List와 Set은 Collection인터페이스의 자손) 

 

 

List와 Set으로 반환되는 기준은 아래 예시를 통해 알아본다. 

Map<> ageMap1 = new HashMap<>();
Map<> ageMap2 = new HashMap<>();

// 중복된 값이 있는 Map
ageMap1.put("Tom", 20);	
ageMap1.put("Bob", 20);
ageMap1.put("David", 30);

// 중복된 값이 없는 Map
ageMap1.put("Tom", 10);	
ageMap1.put("Bob", 20);
ageMap1.put("David", 30);

 

List의 특징은 앞서 서술한대로 "중복을 허용"하기 때문에, values() 메서드 호출 시 Map의 모든 값 중에 중복된 값이 있으면, List 형태로 반환하는 것이고 중복된 값이 없으면 Set 형태로 반환하는 것이다.

 

이와 마찬가지로 위 Map의 메서드 중, keySet()메서드가 반환 타입이 Set인 이유는 Map의 특성 상 ''는 중복을 허용하지 않기 때문에 반환타입이 Set인 것이다. 

 

 

Map.Entry 인터페이스

 

Map.Enty 인터페이스는 Map 인터페이스의 내부 인터페이스이다. 내부 클래스의 개념과 같이 인터페이스도 인터페이스 안에 인터페이스를 정의하는 "내부 인터페이스(inner interface)를 정의하는 것이 가능하다.

 

 

Map에 저장되는 key와 value쌍을 다루기 위해 내부적으로 Entey인터페이스를 정의해 놓았으며, 이것은 보다 객체지향적으로 설계하도록 유도하기 위한 것으로 Map인터페이스를 구현하는 클래스에서는 Map.Entry 인터페이스도 함께 구현해야 한다. 

 


비교

종류 List Set Map
특징 순서O, 중복O 순서X, 중복X 순서X, 중복(키X, 값O)
구현 클래스  ArrayList, LinkedList 등 HashSet, TreeSet 등 HashMap, TreeMap 등

 

출처 - 자바의 정석 3판 ( 저자: 남궁성)

반응형