공식문서에서는 method에 대해 서술할 때 타입을 일일이 설명해 주기 때문에 직관적으로 외우기 불편하다. 그래서 이곳에 내가 기억하기 편한 방식으로 정리해 두려 한다. 각 구현 클래스들에 관한 것은 시간이 된다면 다음 포스팅에서 다룰 예정이다. '이것이 자바다' 교재를 통해 공부한 내용과 개인적인 이해방식을 바탕으로 작성했으므로 틀린 내용이 있을 수 있다.
List와 Set은 Collection 인터페이스를 상속하는 자식 인터페이스이고, Map은 독립(POJO) 인터페이스이다. 셋 다 java.util 패키지에 속해 있으므로, 사용하려면 인터페이스를 가져오는(import) 작업이 필요하다.
List
List는 index 순서대로 저장하는 방식이다. 다른 index에 같은 내용의 객체를 중복 저장할 수 있다. 대표적인 구현 클래스로는 ArrayList, Vector, LinkedList가 있다.
외우기 편한 방식으로만 작성했으므로, 표현방식이 엄밀하지 않은 점을 감안해야 한다.
method | 실행내용 | |
추가 | add(저장값) | 저장값 추가 |
add(index, 저장값) | index에 저장값 추가 | |
set(index, 저장값) | index의 저장값을 교체 | |
삭제 | remove(저장값) | (하나의) 저장값 삭제 |
remove(index) | index의 저장값 삭제 | |
clear() | 모두 삭제 | |
검색 | get(index) | index의 저장값 불러오기 |
contains(저장값) | 저장값이 있는지 확인 | |
isEmpty() | 비어 있는지 확인 | |
size() | List 크기 확인 |
remove의 경우 특정 정수값을 삭제할 때는 index와 구분하기 위해 remove( Integer.valueOf(정수값) )을 사용해야 한다.
get/set과 add/remove 메소드에서 ArrayList와 LinkedList의 시간복잡도가 갈리게 된다. 어떤 작업을 주로 하느냐에 따라 유리한 구현 클래스를 선택하는 것이 좋다. 이는 다음 포스팅에서 다룰 예정이다.
해당 포스팅에서 다루게 되었다(https://hellmir.tistory.com/entry/Linked-List-%EA%B5%AC%EC%A1%B0%EC%9D%98-%EC%9D%B4%ED%95%B4).
Set
Set은 index 없이 집합으로 저장하는 방식이다. index가 없으므로, 같은 내용의 객체를 중복 저장하지 않는다. 참조하는 메모리 번지가 같을 뿐만 아니라, 구분해 줄 수 있는 index가 없어 여러 번 저장해도 쓸모가 없기 때문이다. 즉, 같은 내용을 여러 번 저장할 이유가 없다. 이 같은 특성 때문에 중복을 배제한 자료를 구현할 때 상당히 유용하다. 대표적인 구현 클래스로는 HashSet, TreeSet이 있다.
TreeSet은 기본적으로 오름차순 집합으로 정렬되어 저장되며, 내림차순으로 정렬하기 위해서는 객체 생성 시 매개변수로 Collections.reverseOrder()를 삽입해 주면 된다.
List의 method에서 index 관련한 method가 전부 빠지고, 이를 보완하는 method인 iterator가 추가됐다. set과 iterator는 객체를 참조하는 변수명이므로, 작명에 따라 변동된다.
method | 실행내용 | |||
추가 | add(저장값) | 저장값 추가 | ||
삭제 | remove(저장값) | 저장값 삭제 | ||
clear() | 모두 삭제 | |||
검색 | Set.iterator() | Iterator <타입> iterator = set.iterator(); 형태로 선언 | iterator.hasNext() | 남은 저장값 있는지 확인 |
iterator.next() | 저장값 하나 가져 옴 | |||
iterator.remove() | next()가 가져 온 저장값 삭제 | |||
contains(저장값) | 저장값이 있는지 확인 | |||
isEmpty() | 비어 있는지 확인 | |||
size() | Set 크기 확인 |
Map
Map은 index를 지정해서 저장하는 방식이다. Map에서 index는 key라고 한다. index와 달리 번호가 아닌 형식으로도 지정할 수 있다. 대표적인 구현 클래스로는 HashMap, Hashtable, TreeMap, Properties가 있다.
Set 타입으로 치환하여 key와 저장값을 분리하거나 Set 인터페이스의 method를 사용할 수 있다.
method | 실행내용 | |||||||
추가 | put(key, 저장값) | key, 저장값 추가 | ||||||
삭제 | remove(key) | key, 저장값 삭제 | ||||||
clear() | 모두 삭제 | |||||||
검색 | Map.keySet() | Set<key 타입> keySet = map.keySet(); 형태로 선언 | 모든 key를 Set 타입으로 치환(분리) => Set의 메소드 사용 가능 | |||||
Map.values() | Collection<저장값 타입> values = map.values(); 형태로 선언 | 모든 저장값을 Collection 타입으로 치환(분리) => Set의 메소드 사용 가능 | ||||||
Map.entrySet() | Set<Map.Entry<key 타입, 저장값 타입>> entrySet = map.entrySet(); 형태로 선언(Entry 타입) | 모든 key, 저장값을 Set 타입으로 치환 => iterator 메소드 사용 가능 | ||||||
get(key) | key의 저장값 불러오기 | |||||||
getOrDefault(key, 기본값) | 해당 키가 존재하지 않으면 기본값을 불러오며, 존재하면 key의 저장값 불러오기(put과 조합해 각 key의 개수 count 시 유용) | |||||||
containsKey(key) | key가 있는지 확인 | |||||||
containsValue(저장값) | 저장값이 있는지 확인 | |||||||
isEmpty() | 비어 있는지 확인 | |||||||
size() | Map 크기 확인 |
(시간이 된다면) 다음 글에서는 각 interface 구현 클래스들의 차이에 대해 포스팅할 예정이다.
'Development > Java' 카테고리의 다른 글
Java에서 char 타입의 활용 (0) | 2023.07.05 |
---|---|
배열 출력, 복제, List 또는 Set에서 변경 (0) | 2023.04.22 |
method overriding 과정에서 @Override annotation을 사용해야 하는 이유 (0) | 2023.03.29 |
인터페이스의 객체지향적 특징 (0) | 2023.03.28 |
객체지향의 네 가지 특성 : 캡슐화, 추상화, 다형성, 상속성 (0) | 2023.03.28 |