<목차>
• 맵(Map)이란?
맵은 키-값(Key-Value)을 쌍으로 구성되어 저장되는 자료 구조다.
특정 키를 통해 연관된 값을 검색하고 저장하는 데 사용된다. Map은 'java.util' 패키지에 정의 되어 있다.
파이썬의 사전(Dictionary)과 비슷하다고 생각하면 된다.
[참고] - https://bluenoa.tistory.com/11
Dictionary 자료
· Dictionary Dictionary는 '사전'이라는 뜻을 갖고 있다. 우리가 흔히 접하는 한글 사전이나 영어 사전 등을 보면 책의 우측에 보면 가~힣, 혹은 A~Z 까지 순서대로 정렬되어 있는 것을 볼 수 있다. 마찬
bluenoa.tistory.com
- Map의 주요 특징
1. 키-값 쌍
Map은 키와 값을 연결하는 구조를 갖고, 키는 중복될 수 없다. 각 키는 하나의 값과 매핑되어야만 한다.
2. 중복 불가
하나의 Map 내에서 중복된 키는 존재할 수 없다. 각 키는 유일해야 하며, 값은 중복이 가능하다.
3. 순서 없음
일반적으로 키의 순서를 정하지는 않는다. 하지만 Java8부터 'LinkedHashMap'을 사용하여 순서가 보장되는 맵을 사용할 수 있다.
• Map 인터페이스의 주요 메서드
put(key, value) : 지정한 키와 값을 맵에 추가한다.
get(key) : 지정한 키에 해당하는 값을 반환한다.
remove(key) : 지정한 키에 해당하는 키-값 쌍을 제거한다.
containsKey(key) : 특정 키의 존재 여부를 확인한다.
size() : 맵의 크기(키-값 쌍의 수)를 반환한다.
keySet() : 맵에 있는 모든 키를 Set(집합)으로 반환한다.
• Map 자료형의 구현 가능한 종류
1. HashMap
키의 순서가 없으며, 빠른 검색과 저장이 가능한 해시 기반의 맵
2. LinkedHashMap
삽입 순서를 보장하는 해시 맵으로, 순서가 중요한 경우에 사용된다.
3. TreeMap
키를 정렬된 순서로 유지하는 맵으로, 키가 정렬 가능해야 한다. (오름차순으로 데이터를 저장한다.)
4. Hashtable
'HashMap'과 유사하지만 동기화된 메서드로 구현되어 있어 멀티스레드 환경에서 사용이 불가능하다.
<예시>
import java.util.HashMap;
import java.util.Map;
public class sample {
public static void main (String[] args) {
// HashMap 생성
Map<String, Integer> ages = new HashMap<>();
// 값 추가 - put()
ages.put("이순신", 26);
ages.put("이춘향", 22);
ages.put("강갑찬", 37);
ages.put("압둘", 49);
// 값 반환 - get()
int age = ages.get("이순신");
// 반환할 값이 없는 경우
System.out.println(ages.get("김시민")); // null이 출력된다.
// null 대신 기본값 출력 명령어
System.out.println(ages.getOrDefault("김시민", 29));
// 값 삭제 - remove()
ages.remove("강갑찬");
// 맵 순회
for (String name : ages.keySet()) { // 집합으로 구성
int pAge = ages.get(name); // pAge에 나이가 저장된다.
System.out.println(name + " : " + pAge);
// 그냥 keySet을 출력했다면 [키, 값] 형태로 출력된다.
}
}
}
<결과>
null 29 이춘향 : 22 압둘 : 49 이순신 : 26 |
• 집합(Set)이란?
자바의 집합은 중복되지 않는 원소들을 저장하는 자료 구조이다. Set은 중복된 값을 허용하지 않으며, 원소들 사이에 순서가 보장되지 않는다.
이는 파이썬의 집합도 동일한 특징이다.
[참고 : 파이썬 Set 자료형] - https://bluenoa.tistory.com/12
Set 자료
· Set - 집합형 자료 집합의 자료는 순서성이 없고, 중복을 허락하지 않는다. 순서성이 없다는 의미 중복인 데이터를 넣어도 결국엔 하나로 인식해서 결과를 처리하게 된다. # set 생성 방법1 a = set
bluenoa.tistory.com
자바에서 집합은 데이터의 고유성을 보장하고자 할 때, 데이터의 순서가 중요하지 않은 경우, 중복을 제거하고 고유의 값만 관리하는데 주로 활용된다.
- 집합의 특징
1. 중복 불가
Set은 동일한 원소를 중복해서 저장하지 않고, 이미 있는 원소를 추가하려고 하면 추가되지 않는다.
2. 순서 없음
Set은 순서를 보장하지 않는다. 따라서 원소에 대한 인덱스 접근이 불가능하다.
• 집합의 주요 메서드
add(element) : 지정한 원소를 집합에 추가한다.
remove(element) : 지정한 원소를 집합에서 제거한다.
contains(element) : 특정 원소가 집합에 존재하는지 확인
size() : 집합의 크기(원소의 개수)를 반환한다.
isEmpty() : 집합이 비어있는지 여부를 반환한다.
• 집합의 종류
1. HashSet
해시 함수를 사용하여 원소를 저장하므로 원소의 순서가 보장되지 않는다.
2. LinkedHashSet
삽입 순서(입력 순서를 기준)를 보장하는 해시 기반의 집합
3. TreeSet
원소들을 정렬된 순서(오름차순)로 유지하는 집합. 원소가 정렬 가능해야 한다.
<예시>
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
public class sample {
public static void main (String[] args) {
Integer[] set1 = {2,4,6,8,10,12,14,16,18};
Integer[] set2 = {3,6,9,12,15,18,21,24,27};
// HashSet 생성(제네릭스 사용)
HashSet<Integer> s1 = new HashSet<>(Arrays.asList(set1));
HashSet<Integer> s2 = new HashSet<>(Arrays.asList(set2));
// 원소 추가
s1.add(20);
s2.add(30);
// 원소 삭제
s2.remove(30);
// 집합 크기
int s1_Size = s1.size();
// 집합 출력
System.out.println(s1);
System.out.println(s2);
// 교집합
Set<Integer> intersection = new HashSet<>(s1);
intersection.retainAll(s2); // 공통 요소만 남긴다.
// 합집합
Set<Integer> union = new HashSet<>(s1);
union.addAll(s2);
// 차집합
Set<Integer> difference = new HashSet<>(s1);
difference.removeAll(s2);
// 결과 출력
System.out.println("교집합 : " + intersection);
System.out.println("합집합 : " + union);
System.out.println("차집합 : " + difference);
}
}
<결과>
[16, 2, 18, 4, 20, 6, 8, 10, 12, 14] [18, 3, 21, 6, 24, 9, 27, 12, 15] 교집합 : [18, 6, 12] 합집합 : [2, 3, 4, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 27] 차집합 : [16, 2, 4, 20, 8, 10, 14] |
• 상수 집합(Constant Set)
자바에서 상수 집합이라고 말하는 것은 열거형(Enum)을 의미한다. 열거형은 몇 가지 관련되 상수들을 정의하고, 그것들을 집합 형태로 사용할 수 있는 강력한 자료 구조이다.
상수 집합을 사용하는 주된 이유는 3가지 정도로 정의할 수 있다.
1. 가독성
코드의 가독성을 높일 수 있다. 상수들은 이름으로 접근 가능하며, 의미를 가진 이름으로 사용되기 때문에 코드의 의도를 명확하게 표현할 수 있다.
2. 유형 안전성
열거형은 컴파일러가 상수의 유효성을 검사하므로 잘못된 상수 사용을 방지할 수 있다.
3. 제한된 값 집합
특정한 값을 가지는 상수 집합을 만들 수 있다. 이는 코드 내에서 사용되는 값의 범위를 제한하려는 경우 유용하다.
<예시1>
public class sample {
enum Car {
Compact, Sedan, SUV, Truck, trailer
};
public static void main (String[] args) {
Car type = Car.Sedan;
if (type == Car.Sedan) {
System.out.println("My Car is Sedan!");
}
System.out.println(Car.SUV); // 직관적이다.
// 각각의 값들을 출력
for (Car types : Car.values()) {
System.out.print(types + " ");
}
}
}
<결과>
My Car is Sedan! SUV Compact Sedan SUV Truck trailer |
좀 더 세부적인 설명을 하면 다음과 같다.
1. 열거형(Enum)
열거형은 서로 연관된 상수들을 정의하기 위한 자료형이다. 주로 고정된 값들의 집합을 나타내는데 사용된다.
열거형은 클래스와 비슷한 구조를 갖고, 열거된 값들은 해다 열거형의 객체로 취급된다.
2. 상수 정의
열거형을 정의할 때는 열거된 상수들을 나열한다. 이들은 주로 대문자로 작성되며, 고정된 값들을 나타낸다.
3. 값의 비교
열거형의 값은 '==' 연산자를 통해 비교할수 있다. 이는 열거형이 컴파일 시점에서 이미 정의되어 있기 때문에 유형 안전성을 제공한다.
4. 추가 정보
열거형은 필요에 따라 값 외에도 추가 정보를 가질 수 있다. 이를 위해 필드와 메서드를 열거형에 추가할 수 있다.
5. 열거형의 장점
코드의 가독성(의미 전달이 용이함), 유형 안전성(컴파일러가 값의 유효성을 확인)
6. 열거형의 활용
주로 상수, 옵션, 상태 등을 정의하는 데 사용한다.
switch 문 등에서 값의 비교에 활용된다.
상태 기계(State Machine)나 옵션 설정 등에 사용된다.
<예시2 - switch문을 이용한 자동차 판개 개수 기록>
class counter {
public static void carCount(String type) {
String types = type;
int Com_count = 0;
int Se_count = 0;
int SUV_count = 0;
int Truck_count = 0;
int Trail_count = 0;
switch (types) {
// case는 상수이므로 문자로 묶어줬다.
case "Compact":
Com_count++;
System.out.println("경차 판매 개수 : " + Com_count);
break;
case "Sedan":
Se_count++;
System.out.println("승용차 판매 개수 : " + Se_count);
break;
case "SUV":
SUV_count++;
System.out.println("SUV 판매 개수 : " + SUV_count);
break;
case "Truck":
Truck_count++;
System.out.println("트럭 판매 개수 : " + Truck_count);
break;
case "Trailer":
Trail_count++;
System.out.println("트레일러 판매 개수 : " + Trail_count);
break;
default:
System.out.println("Invalild Car type");
}
}
}
public class sample {
enum Car {
Compact, Sedan, SUV, Truck, Trailer
};
public static void main (String[] args) {
counter co = new counter();
co.carCount(Car.Compact.toString());
// enum은 상수 집합이므로, 해당 값을 String으로 변환하여 메서드로 사용했다.
}
}
<결과>
경차 판매 개수 : 1 |
이렇게 상수 집합을 사용하면 자동차 판매 개수를 측정할 때처럼 특정 메서드를 호출할 때 직관적으로 알아 볼 수 있다. 그렇기 때문에 잘못된 값을 입력하는 일을 최소한으로 줄일 수 있다.
'자바(JAVA)' 카테고리의 다른 글
자바 - 제어문, 조건문, 반복문, 분기문 (0) | 2023.09.05 |
---|---|
자바 - 형 변환(Type Conversion) (0) | 2023.08.30 |
자바 - 리스트(List) (0) | 2023.08.21 |
자바 - 배열(Array) (0) | 2023.08.14 |
자바 - StringBuffer 클래스 (0) | 2023.08.11 |