Map collection
- 키와 값으로 구성된 객체를 저장하는 구조
키와 값은 모두 객체이다!

Map 컬렉션에는 HashMap, Hashtable, LinkedHashMap, Properties, TreeMap 등이 존재한다.
< Map 인터페이스의 메소드>
|
기능
|
메소드
|
설명
|
|
객체추가
|
V put(K key, V value)
|
주어진 키와 값을 추가, 저장되면 값을 리턴
|
|
객체검색
|
boolean containsKey(Object key)
|
주어진 키가 있는지 여부
|
|
|
boolean containsValue(Object value)
|
주어진 값이 있는지 여부
|
|
|
Set(Map.Entry<K,V>> entrySet()
|
키와 값의 쌍으로 구성된 모든 Map.Entry 객체를 Set에 담아서 리턴
|
|
|
V get(Object key)
|
주어진 키가 있는 값을 리턴
|
|
|
boolean isEmpty()
|
컬렉션이 비어 있는지 여부
|
|
|
Set<K> keySet()
|
모든 키를 Set 객체에 담아서 리턴
|
|
|
int size()
|
저장된 키의 총 개수 리턴
|
|
|
Collection<V> values()
|
저장된 모든 값을 Collection에 담아서 리턴
|
|
객체삭제
|
vold clear()
|
모든 Map.Entry(키와 값)를 삭제
|
|
|
V remove(Object key)
|
주어진 키와 일치하는 Map.Entry를 삭제하고 값을 리턴
|
Map<String, Integer> map = ...;
map.put("홍길동", 30); // 객체 추가
int score = map.get("홍길동"); // 객체 찾기
map.remove("홍길동"); // 객체 삭제
Map의 경우 객체추가는 put 객체찾기는 get() 메소드, 삭제는 romove() 사용한다.
Map<K, V> map = ...;
Set<K> keySet = map.keySet();
Iterator<K> keyIterator = keySet.iterator();
while(keyIterator.hasNext()) {
K key = keyIterator.next();
V value = map.get(key);
}
key값을 알고있다면 get을 사용하면 되지만 저장된 객체 전체를 하나씩 얻고 싶을 경우는
위와 같이 keySet() 메소드를 사용하여 값을 얻는다.
- set컬렌션으로 모든 키를 얻은 다음 반복자로 키를 하나씩 얻어 get() 메소드를 통해 값얻기!
HashMap
-map 인터페이스를 구현한 대표전인 map 컬렉션!
Map<String, Integer> map = new HashMap<String, Integer>();
키와 값의 타입은 Primitive type(byte, short, int, float, long, double, boolean, char)을 사용할 수 없고 클래스 및 인터페이스 타입만 가능!
public class HashMapExample {
public static void main(String[] args) {
// 1. Map 컬렉션 생성
Map<String,Integer> map = new HashMap<>();
map.put("윈터", 80);
map.put("카리나",85);
map.put("제시카",95);
map.put("윈터",85);
System.out.println("총 Entry 수: " + map.size()); // 저장된 총 Entry 수 얻기
// 2. 객체 찾기
System.out.println("\t윈터 : " +map.get("윈터"));
System.out.println();
// 4. 객체 삭제
map.remove("윈터");
System.out.println("총 객체 수 : " + map.size());
// 5. 객체를 하나씩 처리
Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
for (Map.Entry<String, Integer> entry : entrySet) {
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println("\t" + key + ": " + value);
}
System.out.println();
// 6. 모든 Map.Entry 삭제
map.clear();
System.out.println("총 Entry 수 : " + map.size());
}
}
map.put("윈터", 80);
map.put("카리나",85);
map.put("제시카",95);
map.put("윈터",85);
System.out.println("총 Entry 수: " + map.size());
- 윈터라는 키가 같기 때문에 마지막에 저장된 값으로 엎어진다!
LIFO , FIFO 컬렉션 - Stack과 Queue
LIFO 후입선출 - 나중에 넣은 객체가 먼저 빠져나가는 자료구조!

Stack 의 예시
Stack (후입선출, LIFO)
- 마지막에 넣은 객체가 가장 먼저 빠지는 구조!

<Stack 클래스의 주요 메소드>
|
리턴 타입
|
메소드
|
설명
|
|
E
|
push(E item)
|
주어진 객체를 스택에 넣는다
|
|
E
|
peek()
|
스택의 맨 위 객체를 가져온다. 객체를 스택에서 제거하지 않는다.
|
|
E
|
pop()
|
스택의 맨 위 객체를 가져오고, 객체를 스택에서 제거한다.
|
import java.util.Stack;
public class StackExample {
public static void main(String[] args) {
Stack<Coin> coinStack = new Stack<>();
coinStack.push(new Coin(500));
coinStack.push(new Coin(100));
coinStack.push(new Coin(50));
coinStack.push(new Coin(10));
while (!coinStack.isEmpty()) { // 동전케이스가 비었다면 반복문 종료
Coin coin = coinStack.pop(); // 동전케이스에서 제일 위에 동전 꺼내기
System.out.println("꺼내온 동전: " + coin.getValue() + "원");
}
}
}
<실행결과>
꺼내온 동전: 10원
꺼내온 동전: 50원
꺼내온 동전: 100원
꺼내온 동전: 500원
이렇게, 500,100,50,10 순으로 push 했지만
pop으로 꺼낼때는 마지막에 넣었던 순서대로 빠져나온다.
그럼 실행결과와 같이 10,50,100,500 순이다!!!
Queue (선입선출, FIFO)
- 들어간 데이터가 먼저 출력되는 구조 !

< Queue 메소드 >
|
리턴 타입
|
메소드
|
설명
|
|
boolean
|
offer(E e)
|
주어진 객체를 넣는다.
|
|
E
|
peek()
|
객체 하나를 가져온다. 객체를 큐에서 제거하지 않는다.
|
|
E
|
poll()
|
객체 하나를 가져온다. 객체를 큐에서 제거한다.
|
Stack이 push였다면 Queue는 offer로 객체를 넣는다!
pop이아닌 poll!
Queue 인터페이스를 구현한 대표적인 클래스는 LinkedList!
import java.util.LinkedList;
import java.util.Queue;
public class QueueExample {
public static void main(String[] args) {
Queue<Message> messageQueue = new LinkedList<>();
messageQueue.offer(new Message("sendMail", "홍길동"));
messageQueue.offer(new Message("sendSms", "제니"));
messageQueue.offer(new Message("sendKakaoTalk", "리사"));
while (!messageQueue.isEmpty()) { // 메시지 큐가 비었는지 확인
Message message = messageQueue.poll(); // 메시지 큐에서 하나의 메시지 꺼냄
switch (message.getCommand()) {
case "sendMail":
System.out.println(message.getTo() + "에게 메일을 보냅니다.");
break;
case "sendSms":
System.out.println(message.getTo() + "에게 SMS를 보냅니다.");
break;
case "sendKakaoTalk":
System.out.println(message.getTo() + "에게 카톡을 보냅니다.");
break;
}
}
}
}
<실행결과>
홍길동에게 메일을 보냅니다.
제니에게 SMS를 보냅니다.
리사에게 카톡을 보냅니다.

Queue 의 예시
람다식이란
- 함수를 간단한 식으로 표현하는 방법!
익명함수를 생성하기 위한 식이라고도 한다.
그럼 람다식을 왜 사용하농?

1. 코드가 매우 간결해진다.
2. 컬렉션 요소를 필터링하거나 매핑해서 원하는 결과를 쉽게 집계할 수 있다.
람다식 작성하기
int max(int v1, int v2) {
return v1 > v2 ? v1 : v2;
}
이랬는데?
(int v1, int v2) -> v1 > v2 ? v1 : v2
이렇게 까지도 간결하게 만들수 있는데....음...어...
ㅋㅋㅋㅋㅋㅋ 너무 간결한데..???/ ㅋㅋㅋㅋㅋㅋ
아직 익숙하지 않아서 더 헷갈리네요 ㅠㅋㅋㅋㅋㅋ
기본 문법
(타입 매개변수, ...) -> { 실행문; ...; }
이렇게 작성하는데....
int 매개변수 a의 값을 콘솔 출력하는 코드를 작성하면
(int a) -> { System.out.println(a); }
매개변수타입은 런타임 시 대입되는 값에 따라 자동인식될 수 있기 때문에 언급 ㄴㄴ!
(a) -> { System.out.println(a); }
이렇게 작성가능하다는겈ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
아니 이게 더 보기 힘든데 저만 그럴까요? ㅋㅋㅋㅋㅋ
이게 뭐시여...

(x, y) -> x + y;
return x+y; 값이 있더라도 retrun문을 사용하지 않고 작성ㅋㅋㅋㅋ 허허
람다식으로 변경해보기 연습
int max(int a, int b) {
return a > b ? a : b;
}
- 정답 : ( a, b ) - > a > b ? a : b
int print(String name, int i) {
System.out.println(name+"="+i);
}
- 정답 : ( name, i ) - > System.out.println(name+"="+i);
int square(int x) {
return x * x;
}
- 정답 : x - > x * x
아..ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 이해는 하겠는데....
이렇게 쓰면 간결은 해지겠는데
다른 사람 코드 봤을 때 이해를 할 수있을지 .... 많이 보고 익숙해져야겠네요..ㄷㄷㄷ
이게 더 헷갈릴수 있겠다는 생각이 계속 듭니당...
그래도 익숙해지면 코드가 짧아지니 엄청 편리할거같아요!!!
함수형 인터페이스 (@FunctionalInterface)
- 단 하나의 추상 메소드만 선언된 인터페이스
매개 변수와 리턴값이 없는 람다식
public class MyFunctionalInterfaceExample {
public static void main(String[] args) {
MyFunctionalInterface finter;
finter = () -> {
String str = "method call 1";
System.out.println(str);
};
finter.method();
finter = () -> {
System.out.println("method call 2");
};
finter.method();
finter = () -> System.out.println("method call 3");
finter.method();
}
}
<실행 결과>
method call 1
method call 2
method call 3
매개 변수가 있는 람다식
public class MyFunctionalInterfaceExample2 {
public static void main(String[] args) {
MyFunctionalInterface2 finter2;
finter2 = (x) -> {
int result = x * 5;
System.out.println(result);
};
finter2.method(2);
finter2 = (x) -> {
System.out.println(x * 5);
};
finter2.method(2);
finter2 = x -> System.out.println(x * 5);
finter2.method(2);
}
}
실행결과는?
10
10
10
리턴값이 있는 람다식
public class MyFunctionalInterfaceExample4 {
public static void main(String[] args) {
MyFunctionalInterface3 finter3;
finter3 = (x, y) -> {
int result = x + y;
return result;
};
System.out.println(finter3.method(2, 5));
finter3 = (x, y) -> {
return x + y;
};
System.out.println(finter3.method(2, 5));
finter3 = (x, y) -> x + y;
System.out.println(finter3.method(2, 5));
}
}
실행결과는?
7
7
7
오늘은 이렇게 람다식 까지 배웠는데엽!!!!
오늘은 나름 정보처리기사 시험준비할때 후입선출 선입선출 등등 공부한 내용이 많아
이해하기엔 쉬웠던거 같아요!! ㅎㅎㅎㅎ
람다식도 코드가 간결해졌다길래 ㅇ우와 하고 봤는데
아직 익숙하지 않은지 좀 알아보기 힘들다? 이렇게 예시로 짧은건 알아보기 싶지만
먼가 길어지거나 복잡해지면 알아보기 어렵겠군,, 싶더라구요 ㅠㅠ
익숙해지는걸로!!!
위클리 과제하고 sql 공부하러 가야겠어용 ㅠ
sql 진짜 ... 공부까진 괜찮은데 블로그작성은 고민중이랍니다....
문제위주로 풀다보니 적기가 애매하달까요 ㅠㅋㅋㅋㅋ
ㅇ일단!!!!
오늘도 공부열심히 했구!
내일도 파이팅!!!!!!!!!!!!

주말 잘보내세요~~~~~~~~~~~
'[4기] 백엔드 개발자 부트캠프 "오르미" ~ing > [4기] 백엔드 개발자 부트캠프 오르미 수업 복습' 카테고리의 다른 글
| [4기] 50일차 Java ( 스트림 ) (2) | 2024.02.20 |
|---|---|
| [4기] 49일차 Java ( 람다식2 , 스트림-필터링 ) (0) | 2024.02.19 |
| [4기] 45일차 Java ( Collection - list,set ) (0) | 2024.02.15 |
| 일기) DailyQuiz9 (제네릭) (0) | 2024.02.14 |
| [4기] 44일차 Java ( 제네릭2 ) (2) | 2024.02.14 |