맵
사람을 "이름=홍길동", "생일=몇 월 며칠" 등으로 구분할 수 있듯이
맵(Map)은 키(Key)와 갑(value)의 대응 관계를 쉽게 표현할 수 있게 해주는 자료형
맵은 다른 언어에도 있는 자료형으로, associative array 또는 hash라고도 불림
맵은 사전(dictionary)과 비슷. 예를 들어 people이란 단어에는 사람, baseball이라는 단어에는 야구라는 뜻이 대응되듯이 맵은 키와 값을 한 쌍으로 갖는 자료형임
맵은 리스트나 배열처럼 순차적으로(sequential) 요솟값을 구하지 않고 키(key)를 이용해 값(value)을 얻음. 마치 사전에서 baseball이라는 단어의 뜻을 찾을 때 처음부터 순서대로 읽지 않고 해당 단어가 있는 곳을 찾아서 확인하는 것과 같음
맵 자료형에는 HashMap, LinkedHashMap, TreeMap 등이 있음
HashMap
맵 잘형 중 가장 기본인 HashMap에 대해 알아보도록 하겠슴
put
put 메서드는 key와 value를 추가하는 데 사용함. key와 value가 String인 HashMap을 만들고 앞의 표에서 봤던 항목을 입력
import java.util.HashMap;
public class Sample {
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<>();
map.put("people", "사람");
map.put("baseball", "야구");
}
}
HashMap 역시 제네릭스를 이용함. HashMap의 제네릭스는 key, value 모두 String 자료형임
따라서, key, value에 String 이외의 자료형은 사용할 수 없음
get
get메서드는 key에 해당하는 value를 얻을 때 사용함
import java.util.HashMap;
public class Sample {
public static void main(String[] args)
HashMap<String, String> map = new HashMap<>();
map.put("people", "사람");
map.put("baseball", "야구");
System.out.println(map.get("people")); // "사람" 출력
}
}
위의 예제를 출력해보면, map 객체의 key인 people에 대응하는 value인 사람이 출력됨
getOrDefault
맵에 해당 key가 없을 때 get 메서드를 사용하면 null이 반환됨
System.out.println(map.ge("java")); //null 출력
맵에 해당 키가 없을 때 null 대신 기본값을 얻고 싶다면 getOrDefault 메서드를 사용하면 됨
System.out.println(map.getOrDefault("java", "자바")); //자바 출력
containsKey
containsKey 메서드는 맵에 해당 key가 있는지를 참(true) 또는 거짓(false)으로 반환함
(... 생략 ...)
HashMap<String, String> map = new HashMap<>();
map.put("people", "사람");
map.put("baseball", "야구");
System.out.println(map.containsKey("people")); // true 출력
remove
remove 메서드는 맵의 항목을 삭제하는 메서드로, 해당 key의 항목을 삭제한 후 value값을 반환함
(... 생략 ...)
HashMap<String, String> map = new HashMap<>();
map.put("people", "사람");
map.put("baseball", "야구");
System.out.println(map.remove("people")); // "사람" 출력
people key와 그에 해당하는 value가 맵에서 삭제되고, 삭제된 value인 사람이 출력됨
size
size 메서드는 맵 요소의 개수를 반환함
(... 생략 ...)
HashMap<String, String> map = new HashMap<>();
map.put("people", "사람");
map.put("baseball", "야구");
System.out.println(map.remove("people")); // "사람" 출력
System.out.println(map.size());
1
처음에는 people과 baseball 두 개의 요소가 있었지만, people이 삭제되어 남은 요소의 개수인 1이 출력됨
keySet
keySet 메서드는 맵의 모든 key를 모아서 반환함
import java.util.HashMap;
public class Sample {
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<>();
map.put("people", "사람");
map.put("baseball", "야구");
System.out.println(map.keySet()); // [baseball, people] 출력
}
}
[baseball, people]
keySet() 메서드는 맵의 모든 key를 모아서 집합 자료형으로 반환함. 집합 자료형은 리스트 자료형으로 바꾸어 사용할 수 있음
ArrayList<String> keyList = new ArrayList<>(map.keySet());
LinkedHashMap과 TreeMap
맵의 가장 큰 특징은 순서에 의존하지 않고, key로 value를 가져오는 것.
하지만, 때로는 맵에 입력된 순서대로 데이터를 가져오거나, 입력한 key에 따라 정렬하여 저장하고 싶을 수도 있음. 이럴 때는 LinkedHashMap과 TreeMap을 사용하면 됨
- LinkedHashMap: 입력된 순서대로 데이터를 저장함
- TreeMap: 입력된 key의 오름차순으로 데이터를 저장함
언뜻 리스트와 맵이 비슷해 보이지만, 큰 차이가 있음.
리스트는 순서가 중요하지만, 맵은 순서에 의존하지 않음. 따라서 프로그래밍의 목적에 따라 개발자가 잘 선택해서 사용해야 함
집합
집합(Set) 자료형은 집합과 관련된 연산을 쉽게 처리하기 위해 만든 자료형으로, HashSet, TreeSet, LinkedHashSet 등이 있음. 이 중에서 가장 많이 사용하는 HashSet에 대해서 알아볼 것임
import java.util.Arrays;
import java.util.HashSet;
public class Sample {
public static void main(String[] args) {
HashSet<String> set = new HashSet<>(Arrays.asList("H", "e", "l", "l", "o"));
System.out.println(set); // [e, H, l, o] 출력
}
}
집합 자료형 2가지 특징
- 중복을 허용하지 않음
- 순서가 없음(unordered)
리스트나 배열은 순서가 있기(ordered)때문에 인덱싱을 통해 값을 얻을 수 있지만, 집합 자료형은 순서가 없기 때문에(unordered) 인덱싱으로 값을 얻을 수 없음. 이는 맵 자료형과 비슷함. 맵 자료형 역시 순서가 없는 자료형이라 인덱싱을 지원하지 않음
집합 자료형은 중복을 허용하지 않기 때문에 중복을 제거하기 위한 필터 역할로 종종 사용함
교집합, 합집합, 차집합 구하기
집합 자료형은 교집합, 합집합, 차집합을 구할 때 유용함. 먼저 집합 자료형 2개를 만들어보면
import java.util.Arrays;
import java.util.HashSet;
public class Sample {
public static void main(String[] args) {
HashSet<Integer> s1 = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5, 6));
HashSet<Integer> s2 = new HashSet<>(Arrays.asList(4, 5, 6, 7, 8, 9));
}
}
여기서 s1은 1부터 6까지의 값을 가지게 되었고, s2는 4부터 9까지의 값을 가지게 되었음
제네릭스로 int를 사용하고 싶다면 int의 Wrapper 클래스인 Integer를 대신 사용해야 함
교집합 구하기 = retainAll
retainAll 메서드를 사용하면 교집합을 쉽게 구할 수 있음. s1의 데이터를 유지하기 위해 s1으로 intersection이라는 HashSet 객체를 복사해서 생성함. 만약 intersection 대신 s1에 retainAll 메서드를 사용하면 s1의 내용이 변경될 것임
import java.util.Arrays;
import java.util.HashSet;
public class Sample {
public static void main(String[] args) {
HashSet<Integer> s1 = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5, 6));
HashSet<Integer> s2 = new HashSet<>(Arrays.asList(4, 5, 6, 7, 8, 9));
HashSet<Integer> intersection = new HashSet<>(s1); // s1으로 intersection 생성
intersection.retainAll(s2); // 교집합 수행
System.out.println(intersection); // [4, 5, 6] 출력
}
}
[4, 5, 6]
retainAll 메서드로 교집합을 수행한 후 intersection을 출력하니 교집합에 해당하는 [4, 5, 6]이 출력됨
합집합 구하기 = addAll
addAll 메서드를 사용
import java.util.Arrays;
import java.util.HashSet;
public class Sample {
public static void main(String[] args) {
HashSet<Integer> s1 = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5, 6));
HashSet<Integer> s2 = new HashSet<>(Arrays.asList(4, 5, 6, 7, 8, 9));
HashSet<Integer> union = new HashSet<>(s1); // s1으로 union 생성
union.addAll(s2); // 합집합 수행
System.out.println(union); // [1, 2, 3, 4, 5, 6, 7, 8, 9] 출력
}
}
[1, 2, 3, 4, 5, 6, 7, 8, 9]
차집합 구하기 = removeAll
import java.util.Arrays;
import java.util.HashSet;
public class Sample {
public static void main(String[] args) {
HashSet<Integer> s1 = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5, 6));
HashSet<Integer> s2 = new HashSet<>(Arrays.asList(4, 5, 6, 7, 8, 9));
HashSet<Integer> subtract = new HashSet<>(s1); // s1으로 subtract 생성
subtract.removeAll(s2); // 차집합 수행
System.out.println(subtract); // [1, 2, 3] 출력
}
}
[1, 2, 3]
집합 자료형과 관련된 메서드 = add, addAll, remove
retainAll, addAll, removeAll과 같은 메서드 외에도 집합 자료형과 관련된 메서드에 대해 더 알아볼 것임
add
add 메서드는 집합 자료형에 값을 추가할 때 사용
import java.util.HashSet;
public class Sample {
public static void main(String[] args) {
HashSet<String> set = new HashSet<>();
set.add("Jump");
set.add("To");
set.add("Java");
System.out.println(set); // [Java, To, Jump] 출력
}
}
[Java, To, Jump]
addAll
값을 한꺼번에 여러 개 추가할 때는 addAll 메서드를 사용함
import java.util.Arrays;
import java.util.HashSet;
public class Sample {
public static void main(String[] args) {
HashSet<String> set = new HashSet<>();
set.add("Jump");
set.addAll(Arrays.asList("To", "Java"));
System.out.println(set); // [Java, To, Jump] 출력
}
}
[Java, To, Jump]
합집합을 구할 때도 addAll을 사용함
remove
remove 메서드는 특정 값을 제거할 때 사용함
import java.util.Arrays;
import java.util.HashSet;
public class Sample {
public static void main(String[] args) {
HashSet<String> set = new HashSet<>(Arrays.asList("Jump", "To", "Java"));
set.remove("To");
System.out.println(set); // [Java, Jump] 출력
}
}
[Java, Jump]
TreeSet과 LinkedHashSet
집합 자료형의 특징은 순서가 없다는 것. 그런데 집합에 입력한 순서대로 데이터를 가져오거나 오름차순으로 정렬된 데이터를 가져오고 싶을 수 있음. 이럴 때는 TreeSet과 LinkedHashSet을 사용하면 됨
- TreeSet: 값을 오름차순으로 정렬해 저장함
- LinkedHashSet: 값을 입력한 순서대로 저장함
'JAVA > [JAVA] 기초 문법' 카테고리의 다른 글
| [자료형] 상수 집합 (0) | 2026.01.11 |
|---|---|
| [자료형] 배열과 리스트 (1) | 2026.01.11 |
| [자료형] 문자와 문자열 (0) | 2026.01.08 |
| [자료형] 숫자 (0) | 2026.01.07 |
| [JAVA] 키보드로 입력 받는 방법 (0) | 2026.01.06 |