[4기] 백엔드 개발자 부트캠프 "오르미" ~ing/[4기] 백엔드 개발자 부트캠프 오르미 수업 복습

[4기] 46일차 Java ( Collection - Map, 람다식 )

sohee99 2024. 2. 16. 16:59

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 진짜 ... 공부까진 괜찮은데 블로그작성은 고민중이랍니다.... 

 

문제위주로 풀다보니 적기가 애매하달까요 ㅠㅋㅋㅋㅋ

 

ㅇ일단!!!!

 

오늘도 공부열심히 했구!

 

내일도 파이팅!!!!!!!!!!!!

 

 

주말 잘보내세요~~~~~~~~~~~