<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>실버벨의 Stack Overflow</title>
    <link>https://sbell92.tistory.com/</link>
    <description>&amp;quot;기초를 잘하자!&amp;quot;
안녕하세요 실버벨입니다. 제가 공부한 지식을 공유하는 블로그 입니다. 틀린 내용이 있다면 댓글로 feedback주세요!</description>
    <language>ko</language>
    <pubDate>Tue, 14 Jul 2026 07:08:42 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>silverbell</managingEditor>
    <item>
      <title>[JAVA_BigDecimal] 큰 수 처리</title>
      <link>https://sbell92.tistory.com/95</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;# BigDecimal의 선언&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1617673995331&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;BigDecimal bigNumber = new BigDecimal(&quot;10000.12345&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;BigDecimal&lt;/span&gt;&lt;span&gt;은&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt; java.math&lt;/b&gt;&lt;/span&gt;안에 있으며 위와 같이 선언하시면 됩니다. 특이한 점은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;BigDecimal&lt;/span&gt;&lt;span&gt;을 초기화하기 위해서는 문&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;자열을 인자 값으로 넘겨주어야 한다는 점입니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;BigDecimal&lt;/span&gt;&lt;span&gt;가 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;문자열&lt;/b&gt;&lt;/span&gt;로 되어 있기 때문입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span&gt;# BigDecimal의 사측연산&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1617674120181&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;BigDecimal bigNumber1 = new BigDecimal(&quot;100000.12345&quot;);
BigDecimal bigNumber2 = new BigDecimal(&quot;10000&quot;);
						
System.out.println(&quot;덧셈(+) :&quot; +bigNumber1.add(bigNumber2));			 // 덧셈(+) :110000.12345
System.out.println(&quot;뺄셈(-) :&quot; +bigNumber1.subtract(bigNumber2));		 // 뺄셈(-) :90000.12345
System.out.println(&quot;곱셈(*) :&quot; +bigNumber1.multiply(bigNumber2));		 // 곱셈(*) :1000001234.50000
System.out.println(&quot;나눗셈(/) :&quot; +bigNumber1.divide(bigNumber2));		// 나눗셈(/) :10.000012345
System.out.println(&quot;나머지(%) :&quot; +bigNumber1.remainder(bigNumber2));	// 나머지(%) :0.12345	&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;# BigDecimal의 두 수 비교&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1617674536194&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;BigDecimal bigNumber_down = new BigDecimal(&quot;100000.12345&quot;);
BigDecimal bigNumber_up = new BigDecimal(&quot;1000000.6789&quot;);
				
//두 수 비교 compareTo
int compare = bigNumber_down.compareTo(bigNumber_up);
System.out.println(compare);&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;margin: 20px 0px; caret-color: auto; background-color: #fafafa; padding: 20px 20px 22px; border: 1px dashed #c5c5c5; color: #333333;&quot; data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p style=&quot;line-height: 1.6; margin: 1px auto 0px;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;-. &lt;b&gt;같다면&lt;/b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; : &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;0&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;-. compartTo(param)&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;param이 &lt;b&gt;크면&lt;/b&gt;&amp;nbsp; &amp;nbsp; : &lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;-1&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;param이 &lt;b&gt;작으면&lt;/b&gt; : &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;1&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>silverbell</author>
      <guid isPermaLink="true">https://sbell92.tistory.com/95</guid>
      <comments>https://sbell92.tistory.com/95#entry95comment</comments>
      <pubDate>Tue, 6 Apr 2021 11:05:38 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스 #level3] 네트워크.java</title>
      <link>https://sbell92.tistory.com/93</link>
      <description>&lt;p&gt;&lt;a href=&quot;https://programmers.co.kr/learn/courses/30/lessons/43162&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;programmers.co.kr/learn/courses/30/lessons/43162&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1615882386053&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;코딩테스트 연습 - 네트워크&quot; data-og-description=&quot;네트워크란 컴퓨터 상호 간에 정보를 교환할 수 있도록 연결된 형태를 의미합니다. 예를 들어, 컴퓨터 A와 컴퓨터 B가 직접적으로 연결되어있고, 컴퓨터 B와 컴퓨터 C가 직접적으로 연결되어 있&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/43162&quot; data-og-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/43162&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/nPkPh/hyJz3SBZBZ/Y4GGnOgtpkufWak0uMm0y0/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626,https://scrap.kakaocdn.net/dn/2oQ40/hyJzYDKwog/TNHzyw1ag9LcHUMAYmRU71/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626,https://scrap.kakaocdn.net/dn/nPu6F/hyJz02Dnv9/Hpd9PagGafl9mYrXg7l46k/img.png?width=714&amp;amp;height=622&amp;amp;face=0_0_714_622&quot;&gt;&lt;a href=&quot;https://programmers.co.kr/learn/courses/30/lessons/43162&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/43162&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/nPkPh/hyJz3SBZBZ/Y4GGnOgtpkufWak0uMm0y0/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626,https://scrap.kakaocdn.net/dn/2oQ40/hyJzYDKwog/TNHzyw1ag9LcHUMAYmRU71/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626,https://scrap.kakaocdn.net/dn/nPu6F/hyJz02Dnv9/Hpd9PagGafl9mYrXg7l46k/img.png?width=714&amp;amp;height=622&amp;amp;face=0_0_714_622');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;코딩테스트 연습 - 네트워크&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;네트워크란 컴퓨터 상호 간에 정보를 교환할 수 있도록 연결된 형태를 의미합니다. 예를 들어, 컴퓨터 A와 컴퓨터 B가 직접적으로 연결되어있고, 컴퓨터 B와 컴퓨터 C가 직접적으로 연결되어 있&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;DFS 와 BFS 두 가지로 문제를 해결해 봤다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;BFS&lt;/h3&gt;
&lt;pre id=&quot;code_1615882438791&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package eun;

import java.util.*;

public class Solution {
	public static void main(String[] args) {
		int[][] computers  = {{1, 1, 0}, {1, 1, 0}, {0, 0, 1}};
		int n = 3;
		solution(n, computers);
	}
	
	public static int solution(int n, int[][] computers) {
		int answer = 0;
		Queue&amp;lt;Integer&amp;gt; q = new LinkedList&amp;lt;&amp;gt;();
		boolean[] visited = new boolean[n];
		
		// 시작점 for 문
		for (int i=0; i&amp;lt;n; i++) {
			if (!visited[i]) {
				q.add(i);
				
				while(!q.isEmpty()) {
					int cur = q.poll();
					visited[cur] = true;
					
					// 시작점에서 갈 수 있는곳 탐색
					for (int j=0; j&amp;lt;n; j++) {
						if(!visited[j] &amp;amp;&amp;amp; computers[cur][j] == 1) q.add(j);
					}
				}
				
				answer++;
			}
		}
		System.out.println(answer);
		return answer;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;DFS&lt;/h3&gt;
&lt;pre id=&quot;code_1615882470743&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package eun;

public class Eun {
	public static int answer =0;
	public static int[] dx = { 0, 1, 0, -1 };
	public static int[] dy = { 1, 0, -1, 0 };
	public static void main(String[] args) {
		int[][] computers  = {{1, 1, 0}, {1, 1, 0}, {0, 0, 1}};
		//int[][] computers  = {{1, 1, 0}, {1, 1, 1}, {0, 1, 1}};
		int n = 3;
		
		solution(n, computers);
	}
	
	public static int solution(int n, int[][] computers) {
		
        for(int y=0; y&amp;lt;n; y++) {
        	for(int x=0; x&amp;lt;n; x++) {
        		if(computers[y][x] == 1) {
        			dfs(x, y, computers, n);
        			answer++;
        		}
        	}
        }
        System.out.println(answer);
		return answer;
    }
	
	public static void dfs(int x, int y, int[][] computers, int n) {
		computers[y][x] = 0;
		
		for (int i=0; i&amp;lt;4; i++) {
			int nx = x + dx[i];
			int ny = y + dy[i];
			
			if (nx &amp;lt; 0 || nx &amp;gt;= n || ny &amp;lt; 0 || ny &amp;gt;= n) continue;
			if (computers[ny][nx] == 0) continue;
			dfs(nx, ny, computers, n);
		}
	}
	
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Algorithm/solution</category>
      <category>BFS</category>
      <category>dfs</category>
      <author>silverbell</author>
      <guid isPermaLink="true">https://sbell92.tistory.com/93</guid>
      <comments>https://sbell92.tistory.com/93#entry93comment</comments>
      <pubDate>Tue, 16 Mar 2021 17:15:30 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스 #level2] 소수찾기.java</title>
      <link>https://sbell92.tistory.com/92</link>
      <description>&lt;p&gt;&lt;a href=&quot;https://programmers.co.kr/learn/courses/30/lessons/42839&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;programmers.co.kr/learn/courses/30/lessons/42839&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1615274187731&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;코딩테스트 연습 - 소수 찾기&quot; data-og-description=&quot;한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다. 각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 &quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/42839&quot; data-og-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/42839&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/zG2jv/hyJvQsfyyn/rsKdvR67F6Nvxghi67pHZk/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626,https://scrap.kakaocdn.net/dn/2zHZT/hyJvFjYYaM/l6K3HwU9fdqIvtqwrRP151/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626&quot;&gt;&lt;a href=&quot;https://programmers.co.kr/learn/courses/30/lessons/42839&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/42839&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/zG2jv/hyJvQsfyyn/rsKdvR67F6Nvxghi67pHZk/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626,https://scrap.kakaocdn.net/dn/2zHZT/hyJvFjYYaM/l6K3HwU9fdqIvtqwrRP151/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;코딩테스트 연습 - 소수 찾기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다. 각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;완전탐색&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;모든 경우의 수 를 다 따져봐야 하는 문제이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;크게 2가지 스텝으로 나눴다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &lt;b&gt;STEP 1)&lt;/b&gt; 조합으로 모든 경우의 수 완전 탐색&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &lt;b&gt;STEP 2)&lt;/b&gt; 소수 인지 판별&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;1단계에서 중복된 숫자가 나올 수 있는 경우를 제외해 줘야 한다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; -. 중복 제거를 위해 &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;SET&lt;/b&gt;&lt;/span&gt; 자료 구조 활용.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; -. 맨 앞이 0인 경우는 제외!&lt;/p&gt;
&lt;pre id=&quot;code_1615274205928&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package eun;

import java.util.ArrayList;
import java.util.List;
import java.util.TreeSet;

public class Eun {
	private static int count;
	private static TreeSet&amp;lt;String&amp;gt; ts = new TreeSet&amp;lt;&amp;gt;();
	
	public static void main(String[] args) {
		String numbers = &quot;011&quot;;
		
		System.out.println(solution(numbers));
	}
	
	private static int solution(String numbers) {
		List&amp;lt;Character&amp;gt; origin = new ArrayList&amp;lt;&amp;gt;();
		List&amp;lt;Character&amp;gt; result = new ArrayList&amp;lt;&amp;gt;();
		int n = numbers.length();
		
		for (int i=0; i&amp;lt;n; i++) {
			origin.add(numbers.charAt(i));
		}
		
		for (int i=1; i&amp;lt;=n; i++) {
			recursion(origin, result, n, i);			
		}
		
		int answer = count;
		return answer;
	}
	
	private static void recursion(List&amp;lt;Character&amp;gt; origin, List&amp;lt;Character&amp;gt; result, int n, int pick) {
		// 탈출
		if (pick == 0) {
			// 0으로 시작하는거 제거
			if (result.get(0) == '0') return;
				
			// result에 담긴 결과 String화
			String strResult = &quot;&quot;;
			for (char c : result) {
				strResult += c;
			}
			
			// 중복 되지 않으면
			if( !ts.contains(strResult) ) {
				// 결과에 추가하고
				ts.add(strResult);
				
				// 소수 판별
				if ( isPrime(Integer.parseInt(strResult)) ) {
					System.out.println(strResult);
					count++;
				}
			}
			
		}
		
		for (int i=0; i&amp;lt;n; i++) {
			result.add(origin.remove(i));
			recursion(origin, result, n-1, pick-1);
			origin.add(i, result.remove(result.size() -1));
		}
	}
	
	
	// 소수 판별
	private static boolean isPrime(int n) {
		int sqrt = (int) Math.sqrt(n);
		
		// 2는 소수
		if (n == 2) return true;
		
		// 1 또는 짝수는 소수가 아님
		if (n == 1 || n%2 == 0) return false;
		
		// 제곱근까지만 홀수로 나눠보면 됨
		for (int i=3; i&amp;lt;=sqrt; i +=2) {
			if ( n%i ==0 ) return false;
		}
		
		return true;
	}
}
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>silverbell</author>
      <guid isPermaLink="true">https://sbell92.tistory.com/92</guid>
      <comments>https://sbell92.tistory.com/92#entry92comment</comments>
      <pubDate>Tue, 9 Mar 2021 16:27:38 +0900</pubDate>
    </item>
    <item>
      <title>[JAVA ] JSON handling (JACKSON-ObjectMapper)</title>
      <link>https://sbell92.tistory.com/90</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;직렬화&lt;/b&gt;란&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt; &lt;/span&gt;객체를 전송가능한 형태로 말아주는걸 의미 (&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;java object&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;to&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;json&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;역직렬화&lt;/b&gt;란&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;그 데이터들을 다시 자바 객체로 변환해주는 걸 의미 (&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;json&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;to&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;java object&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p id=&quot;1bc5&quot; data-selectable-paragraph=&quot;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;java object &lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;to&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;json&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre id=&quot;code_1614150409834&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ObjectMapper mapper = new ObjectMapper();

String json = mapper.writeValueAsString(data); // java Object -&amp;gt; String
jsonNode = mapper.readTree(json); // String -&amp;gt; jsonNode&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p id=&quot;1bc5&quot; data-selectable-paragraph=&quot;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;json &lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;to&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;java object&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre id=&quot;code_1614150428023&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;JsonResponse response = doPost(request);
JsonNode getResData = response.getResponseBodyAsJson();

ObjectMapper mapper = new ObjectMapper();

String jsonString = mapper.writeValueAsString(data); // json -&amp;gt; String
postCjmallQnaList = mapper.readValue(jsonString,class); // String -&amp;gt; java Object&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p id=&quot;1bc5&quot; data-selectable-paragraph=&quot;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Dependencies&lt;/b&gt; &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;jackson-databind&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;maven&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;dependency&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;groupId&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;com.fasterxml.jackson.core&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;groupId&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;artifactId&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;jackson-databind&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;artifactId&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;version&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;2.11.0&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;version&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;dependency&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;b&gt;&lt;span&gt;gradle&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p&gt;&lt;span&gt;mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;compile group: 'com.fasterxml.jackson.core',&amp;nbsp;name:&amp;nbsp;'jackson-databind',&amp;nbsp;version:&amp;nbsp;'2.11.0'&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;참고 블로그&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;-. pjh3749.tistory.com/281&lt;/p&gt;
&lt;p&gt;&amp;nbsp;-. soulduse.tistory.com/22&lt;/p&gt;</description>
      <category>언어/java</category>
      <category>JSON</category>
      <category>ObjectMapper</category>
      <category>readValue</category>
      <category>writeValueAsString</category>
      <author>silverbell</author>
      <guid isPermaLink="true">https://sbell92.tistory.com/90</guid>
      <comments>https://sbell92.tistory.com/90#entry90comment</comments>
      <pubDate>Wed, 24 Feb 2021 16:08:47 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스 #level2] 조이스틱.java</title>
      <link>https://sbell92.tistory.com/89</link>
      <description>&lt;p&gt;&lt;a href=&quot;https://programmers.co.kr/learn/courses/30/lessons/42860&quot;&gt;문제 링크&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1614065388570&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;코딩테스트 연습 - 조이스틱&quot; data-og-description=&quot;조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다. ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA 조이스틱을 각 방향으로 움직이면 아래와 같습니다. ▲ - 다&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/42860&quot; data-og-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/42860&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/PuSB3/hyJmzj4K0C/XV6rysnvJ6dTcUo5Pqhkok/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626,https://scrap.kakaocdn.net/dn/UvP2F/hyJmyrV6QD/ANm8OBkb179uJwUgjuRMGk/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626&quot;&gt;&lt;a href=&quot;https://programmers.co.kr/learn/courses/30/lessons/42860&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/42860&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/PuSB3/hyJmzj4K0C/XV6rysnvJ6dTcUo5Pqhkok/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626,https://scrap.kakaocdn.net/dn/UvP2F/hyJmyrV6QD/ANm8OBkb179uJwUgjuRMGk/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;코딩테스트 연습 - 조이스틱&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다. ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA 조이스틱을 각 방향으로 움직이면 아래와 같습니다. ▲ - 다&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;b&gt;그리디(Greedy)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1614065768014&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package eun;

// 알파벳은 모두 더하고,
// 이동경로의 최소를 찾는 문제

public class Solution {
	static public int solution(String name) {
        int answer = 0;
        
        int len = name.length();
        
        //최대로 가질 수 있는 min값은 끝까지 가는것
        int min_move = len-1;
        
        for(int i=0; i&amp;lt;len; i++) {
        	answer += Math.min(name.charAt(i)-'A', 'Z'-name.charAt(i)+1);
        	
        	//BEAABA
            //012345
        	
        	//좌우: 연속된 A의 등장에 따라 최소 움직임이 달라진다
        	int next = i+1;// 현재 다음 위치부터
        	//내 다음이 A라면 계속 NEXT++
        	while(next&amp;lt;len &amp;amp;&amp;amp; name.charAt(next) == 'A')
        		next++;
        	
        	min_move = Math.min(min_move, i+len-next + i);
        }//for
        
        answer += min_move;
        
        return answer;
    }
	
    
	public static void main(String[] args) {
		System.out.println(solution(&quot;BEAABA&quot;));
	}
}
&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/solution</category>
      <category>조이스틱</category>
      <category>프로그래머스</category>
      <author>silverbell</author>
      <guid isPermaLink="true">https://sbell92.tistory.com/89</guid>
      <comments>https://sbell92.tistory.com/89#entry89comment</comments>
      <pubDate>Tue, 23 Feb 2021 16:28:53 +0900</pubDate>
    </item>
    <item>
      <title>TCP/IP 정리</title>
      <link>https://sbell92.tistory.com/88</link>
      <description>&lt;blockquote&gt;
&lt;p id=&quot;1bc5&quot; data-selectable-paragraph=&quot;&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;TCP&lt;/b&gt;&lt;/span&gt;(&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;T&lt;/b&gt;ransmission&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;b&gt;C&lt;/b&gt;&lt;/span&gt;ontrol&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;P&lt;/b&gt;rotocol)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;간단하게 말하면 데이터 전달 규칙!&lt;br /&gt;&lt;br /&gt;ex)&amp;nbsp;A라는&amp;nbsp;데이터를&amp;nbsp;보낸다면, &lt;br /&gt;&amp;nbsp;A-1,&amp;nbsp;A-2,&amp;nbsp;...,&amp;nbsp;A-10&amp;nbsp;이런식으로&amp;nbsp;잘게&amp;nbsp;나누어&amp;nbsp;데이터를&amp;nbsp;전송한다. &lt;br /&gt;잘게&amp;nbsp;나누어진&amp;nbsp;것들이&amp;nbsp;패킷! &lt;br /&gt;&lt;br /&gt;데이터를&amp;nbsp;패킷으로&amp;nbsp;나누는&amp;nbsp;기준이&amp;nbsp;&lt;b&gt;MTU&lt;/b&gt;(Maximum&amp;nbsp;Trasmission&amp;nbsp;Unit) &lt;br /&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;MTU&lt;/b&gt;&lt;/span&gt;란&amp;nbsp;패킷의&amp;nbsp;최대&amp;nbsp;크기를&amp;nbsp;나타내는&amp;nbsp;수치. &lt;br /&gt;&lt;br /&gt;-. MTU값이 &lt;b&gt;작으면&lt;/b&gt; 패킷수가 많아진다&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;=&amp;gt; 패킷이 가지고 있는 공통 header들을 처리하는 양이 늘어나므로 &lt;b&gt;overhead가 늘어나는 문제&lt;/b&gt; 발생. &lt;br /&gt;-.&amp;nbsp;MTU값이&amp;nbsp;&lt;b&gt;크면&lt;/b&gt;&amp;nbsp;패킷수가&amp;nbsp;줄어들기&amp;nbsp;때문에&amp;nbsp;한번에&amp;nbsp;많은&amp;nbsp;데이터를&amp;nbsp;보낼수&amp;nbsp;있으므로&amp;nbsp;&lt;b&gt;대량의&amp;nbsp;데이터를&amp;nbsp;처리&lt;/b&gt;할&amp;nbsp;때&amp;nbsp;이점이&amp;nbsp;있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;=&amp;gt; 하지만 패킷이 훼손되어 오는 경우에는 다시 큰 패킷을 요청해야하는데, 패킷이 큰 만큼 오는데 오랜&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;시간이 걸리게 된다. &lt;br /&gt;&lt;br /&gt;패킷은&amp;nbsp;하나의&amp;nbsp;루트로만&amp;nbsp;전송되지&amp;nbsp;않는다.&amp;nbsp;여러&amp;nbsp;루트를&amp;nbsp;통해서&amp;nbsp;전송이&amp;nbsp;가능한데&amp;nbsp;여러&amp;nbsp;루트마다&amp;nbsp;도착시간이&amp;nbsp;달라서&amp;nbsp;순서가&amp;nbsp;보장되지&amp;nbsp;않는다. &lt;br /&gt;데이터를&amp;nbsp;받는쪽은&amp;nbsp;A-2,A-10,&amp;hellip;,&amp;nbsp;A-1&amp;nbsp;데이터를&amp;nbsp;순서에&amp;nbsp;맞게&amp;nbsp;A-1,A-2,&amp;hellip;,A-10으로&amp;nbsp;재조립&amp;nbsp;한다.&amp;nbsp;순서에맞게&amp;nbsp;재조립이&amp;nbsp;가능한&amp;nbsp;이유는,&amp;nbsp;TCP&amp;nbsp;방식으로&amp;nbsp;데이터&amp;nbsp;전송시&amp;nbsp;Header가&amp;nbsp;붙게되는데&amp;nbsp;Header에&amp;nbsp;순서에&amp;nbsp;관한&amp;nbsp;정보(Sequence&amp;nbsp;Number)가&amp;nbsp;있기&amp;nbsp;때문이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;2730804F52BBE48A04.jfif&quot; data-origin-width=&quot;683&quot; data-origin-height=&quot;379&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3tgTX/btqYeaD7jMe/k4PEt6M9Be7WpEFbA5F4w1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3tgTX/btqYeaD7jMe/k4PEt6M9Be7WpEFbA5F4w1/img.jpg&quot; data-alt=&quot;[참고] TCP 헤더&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3tgTX/btqYeaD7jMe/k4PEt6M9Be7WpEFbA5F4w1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3tgTX%2FbtqYeaD7jMe%2Fk4PEt6M9Be7WpEFbA5F4w1%2Fimg.jpg&quot; data-filename=&quot;2730804F52BBE48A04.jfif&quot; data-origin-width=&quot;683&quot; data-origin-height=&quot;379&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[참고] TCP 헤더&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;TCP헤더 구조를 보면&lt;br /&gt;&lt;b&gt;Source&amp;nbsp;Port&lt;/b&gt;는&amp;nbsp;송신측의&amp;nbsp;port&amp;nbsp;번호를&amp;nbsp;나타낸다. &lt;br /&gt;&lt;b&gt;Destination&amp;nbsp;Port&lt;/b&gt;는&amp;nbsp;수신측의&amp;nbsp;port번호를&amp;nbsp;나타낸다. &lt;br /&gt;&lt;b&gt;CheckSum&lt;/b&gt;은&amp;nbsp;패킷의&amp;nbsp;훼손여부를&amp;nbsp;체크하는&amp;nbsp;역할을&amp;nbsp;한다. &lt;br /&gt;&lt;b&gt;SYN&lt;/b&gt;은&amp;nbsp;통신을&amp;nbsp;하는&amp;nbsp;양측의&amp;nbsp;&lt;b&gt;Sequence&lt;/b&gt;&amp;nbsp;&lt;b&gt;Number&lt;/b&gt;를&amp;nbsp;동기화&amp;nbsp;하기위해&amp;nbsp;사용된다. &lt;br /&gt;&lt;b&gt;ACK&lt;/b&gt;는&amp;nbsp;데이터를&amp;nbsp;잘&amp;nbsp;받았다는&amp;nbsp;응답을&amp;nbsp;전달하기&amp;nbsp;위해&amp;nbsp;사용되며&amp;nbsp;Sequence&amp;nbsp;Number에&amp;nbsp;+&amp;nbsp;1을&amp;nbsp;붙이는&amp;nbsp;방법을&amp;nbsp;이용한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p id=&quot;1bc5&quot; data-selectable-paragraph=&quot;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;IP&lt;/b&gt;&lt;/span&gt;(&lt;b&gt;I&lt;/b&gt;nternet &lt;b&gt;P&lt;/b&gt;rotocol)&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;인터넷상에서 사용되는 주소&lt;/span&gt;&lt;/p&gt;</description>
      <category>자기계발 일지</category>
      <category>ip</category>
      <category>TCP</category>
      <category>TCP/IP</category>
      <author>silverbell</author>
      <guid isPermaLink="true">https://sbell92.tistory.com/88</guid>
      <comments>https://sbell92.tistory.com/88#entry88comment</comments>
      <pubDate>Mon, 22 Feb 2021 16:40:18 +0900</pubDate>
    </item>
    <item>
      <title>HTTP/HTTPS 란?</title>
      <link>https://sbell92.tistory.com/87</link>
      <description>&lt;h1 id=&quot;df28&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;p&gt;API 개발을 하게 되면서 요새 무척이나 자주쓰는 용어들이 있다.&lt;/p&gt;
&lt;p&gt;그중에 하나가 HTTP 인데... 이번기회에 정리를 함으로써 리마인드 하기로 했다&lt;/p&gt;
&lt;blockquote&gt;
&lt;p id=&quot;1bc5&quot; data-selectable-paragraph=&quot;&quot;&gt;&lt;b&gt;HTTP&lt;/b&gt;(&lt;b&gt;H&lt;/b&gt;yper&lt;b&gt;T&lt;/b&gt;ext&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;T&lt;/b&gt;ransfer&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;P&lt;/b&gt;rotocol)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p id=&quot;1bdb&quot; data-selectable-paragraph=&quot;&quot;&gt;HTTP는 인터넷상에서 클라이언트와 서버가 데이터를 주고 받는 방법이다.&lt;/p&gt;
&lt;p id=&quot;331a&quot; data-selectable-paragraph=&quot;&quot;&gt;Text Transfer라는 단어가 들어간걸 봐서는 둘이서 문자를 서로 주고 받는 것인데, Hyper가 들어가서 인지 글을 주고 받았지만 엄청난 일들이 이루어진다. HTTP 방식이 없었다면 지금 이렇게 글을 쓰고 조회 할 수 있는 이런 일들이 가능했을까?&lt;/p&gt;
&lt;p id=&quot;a57a&quot; data-selectable-paragraph=&quot;&quot;&gt;&lt;b&gt;클라이언트&lt;/b&gt;(Client)는 HTTP를 통해 데이터를 서버로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;요청&lt;/b&gt;(Request)하는 요청자이며, 흔히 크롬, IE, FireFox 같은 웹 브라우저가 그 역할을 한다. 응용 프로그램에서는 Http 요청을 위해 사용하는 라이브러리가 그 역할을 한다.&lt;/p&gt;
&lt;p id=&quot;8f66&quot; data-selectable-paragraph=&quot;&quot;&gt;&lt;b&gt;서버&lt;/b&gt;(Server)는 클라이언트가&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;요청한 데이터를 제공하는 제공자이며 이미지, HTML 파일처럼 파일을 제공하는 서버, 요청 주소에따라 다른 내용을 제공하는 API서버 등 다양하게 있다. HTTP 통신에서는 서버가 제공하는 결과를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;응답&lt;/b&gt;(Response)이라고 한다.&lt;/p&gt;
&lt;p data-selectable-paragraph=&quot;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-selectable-paragraph=&quot;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p id=&quot;80fa&quot; data-selectable-paragraph=&quot;&quot;&gt;&lt;b&gt;HTTP 메시지 구조&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; srcset=&quot;https://miro.medium.com/max/276/1*91Ev719hSFgDvozDDrdEGw.png 276w, https://miro.medium.com/max/552/1*91Ev719hSFgDvozDDrdEGw.png 552w, https://miro.medium.com/max/640/1*91Ev719hSFgDvozDDrdEGw.png 640w, https://miro.medium.com/max/676/1*91Ev719hSFgDvozDDrdEGw.png 676w&quot; width=&quot;676&quot; height=&quot;476&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zNWLu/btqX1oiQvLm/GgDhtcghfN75p9qqXFJbv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zNWLu/btqX1oiQvLm/GgDhtcghfN75p9qqXFJbv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zNWLu/btqX1oiQvLm/GgDhtcghfN75p9qqXFJbv0/img.png&quot; srcset=&quot;https://miro.medium.com/max/276/1*91Ev719hSFgDvozDDrdEGw.png 276w, https://miro.medium.com/max/552/1*91Ev719hSFgDvozDDrdEGw.png 552w, https://miro.medium.com/max/640/1*91Ev719hSFgDvozDDrdEGw.png 640w, https://miro.medium.com/max/676/1*91Ev719hSFgDvozDDrdEGw.png 676w&quot; width=&quot;676&quot; height=&quot;476&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-selectable-paragraph=&quot;&quot;&gt;요청 메시지와 응답 메시지 구조 첫 줄을빼고는 구조가 똑같다.&lt;/p&gt;
&lt;p id=&quot;3360&quot; data-selectable-paragraph=&quot;&quot;&gt;HTTP통신을 위해 생성되는 메시지를 뜯어보면 크게&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Header&lt;/b&gt;와&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Body&lt;/b&gt;로 나눌수 있다.&lt;/p&gt;
&lt;p id=&quot;454c&quot; data-selectable-paragraph=&quot;&quot;&gt;Header는 General Header, Request header, Response Header, Entity header로 나뉜다.&lt;/p&gt;
&lt;ul&gt;
&lt;li id=&quot;060f&quot; data-selectable-paragraph=&quot;&quot;&gt;General Header : 요청과 응답에서 모두 공통으로 들어가는 Header를 의미한다.&lt;br /&gt;주요 정보들로 Date (HTTP 메시지 생성 시간), Connection (서버와 클라이언트의 연결옵션), Via(메시지가 어느 중개자를 거쳐서 왔는지), Transfer-Encoding (메시지에 적용된 인코딩 값) 등등이 있다.&lt;/li&gt;
&lt;li id=&quot;8432&quot; data-selectable-paragraph=&quot;&quot;&gt;Request Header : 요청시에만 있는 Header이다.&lt;br /&gt;주요 정보들로 Host(서버의 호스트명과 포트), User-Agent (브라우저 및 기기 버전 등 요청자에 관한 정보), Referer(요청을 보낸 URL), Accept(클라이언트가 받을 수 있는 미디어 타입), Accept-Encoding(클라이언트가 받을 수 있는 인코딩), Authorization(서버 인증을 위한 정보) 등등이 있다.&lt;/li&gt;
&lt;li id=&quot;7177&quot; data-selectable-paragraph=&quot;&quot;&gt;Response Header : 응답시에만 있는 Header이다.&lt;br /&gt;주요 정보들로 Server(서버 어플리케이션 이름과 버전), Age(응답이 캐쉬된 시점부터 얼마나 오래 되었는지), Set-Cookie(서버에서 클라이언트에게 설정한 쿠키정보), Allow(서버측에 요청가능한 HTTP 요청방식) 등등이 있다.&lt;/li&gt;
&lt;li id=&quot;ccfc&quot; data-selectable-paragraph=&quot;&quot;&gt;Entity Header: HTTP메시지의 BODY(본문)에 관한 정보가 있는 Header.&lt;br /&gt;주요 정보들로 Content-Encoding(본문에 적용된 인코딩), Content-Length(본문의 크기), Content-Type(본문의 응답이 어떤 타입인지), Content-Location(본문이 실제존재하는 위치), Expires(본문이 캐시되어 유효한 시간), Last-Modified(본문이 마지막으로 갱신된 시간), ETag(본문의 고유 태그, 본문이 수정되면 태그 갱신됨) 등등이 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p id=&quot;ec05&quot; data-selectable-paragraph=&quot;&quot;&gt;Body는 요청시 전달하는 데이터 내용, 응답시 받는 데이터 내용으로 HTTP 문서 마지막에 들어간다. Body는 요청과 응답에 따라 있을수도 없을수도 있으며 Body가 없으면 Entity Header도 없다.&lt;/p&gt;
&lt;p data-selectable-paragraph=&quot;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p id=&quot;2969&quot; data-selectable-paragraph=&quot;&quot;&gt;&lt;b&gt;HTTPS&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p id=&quot;33e6&quot; data-selectable-paragraph=&quot;&quot;&gt;HTTP 통신은 앞서 말한것 처럼 HTTP 메시지(텍스트)를 주고 받으며 통신을 한다. 이 메시지에는 보안 장치가 따로 없다. 누군가 악의적인 목적으로 HTTP 메시지를 통신 중간에 가로채서 HTTP 메시지를 볼 수도 있다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;HTTP 메시지는 암호화없이 평문으로 전송되기 때문에 통신을 가로채면 보낸 내용을 쉽게 볼 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p id=&quot;c258&quot; data-selectable-paragraph=&quot;&quot;&gt;만약 회원가입을 하는 경우에 이런 일이 발생하면 개인정보는 바로 노출되게 된다. 이를 보완하기위해 나온것이 HTTPS(&lt;b&gt;H&lt;/b&gt;yper&lt;b&gt;T&lt;/b&gt;ext&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;T&lt;/b&gt;ransfer&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;P&lt;/b&gt;rotocol over&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;S&lt;/b&gt;ecure Socket Layer)이다. 약자를 보면 Secure라는 단어가 들어가는데, HTTP의 보안적인 단점을 커버한 HTTP 프로토콜의 강화버전이다.&lt;/p&gt;
&lt;p data-selectable-paragraph=&quot;&quot;&gt;&lt;b&gt;결론만 간단하게 말하면 HTTP 메시지가 암호화 되어 통신을 하게 된다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p id=&quot;b1a7&quot; data-selectable-paragraph=&quot;&quot;&gt;&lt;b&gt;HTTPS통신과정&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p id=&quot;2343&quot; data-selectable-paragraph=&quot;&quot;&gt;HTTPS 통신과정을 알기 위해서는 대칭 키,공개 키의 개념을 알아야 한다.&lt;/p&gt;
&lt;p id=&quot;7af0&quot; data-selectable-paragraph=&quot;&quot;&gt;&lt;b&gt;대칭 키&lt;/b&gt;(Symmetric Key)는 정보를 암호화하고 복호화를 할때 같은 값을 이용하는 경우에 사용되는 키이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; srcset=&quot;https://miro.medium.com/max/276/1*DFG6_Hj9xu3c7T_WqXlkYg.gif 276w, https://miro.medium.com/max/521/1*DFG6_Hj9xu3c7T_WqXlkYg.gif 521w&quot; width=&quot;521&quot; height=&quot;229&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b02e7U/btqX1opHkuK/rDMUzOw9S3laNHxaCzYf2k/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b02e7U/btqX1opHkuK/rDMUzOw9S3laNHxaCzYf2k/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b02e7U/btqX1opHkuK/rDMUzOw9S3laNHxaCzYf2k/img.gif&quot; srcset=&quot;https://miro.medium.com/max/276/1*DFG6_Hj9xu3c7T_WqXlkYg.gif 276w, https://miro.medium.com/max/521/1*DFG6_Hj9xu3c7T_WqXlkYg.gif 521w&quot; width=&quot;521&quot; height=&quot;229&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p id=&quot;f629&quot; data-selectable-paragraph=&quot;&quot;&gt;예를들어 ABCD라는 문자를 1111이라는 값으로 암호화를 하고&lt;br /&gt;암호화된 문자를 1111이라는 값으로 풀어서 ABCD를 볼 수 있다면&lt;br /&gt;1111이 대칭 키가 되는 것이다.&lt;/p&gt;
&lt;p id=&quot;eabf&quot; data-selectable-paragraph=&quot;&quot;&gt;대칭 키는 암호화, 복호화가 간단한 방법이다. 하지만 대칭 키를 다른 사람이 알게 되면 그 사람도 암호화된 문자를 생성하고 풀 수 있기 때문에 대칭 키가 노출되는 경우에는 보안에 부정적인 영향이 발생 할 수 있다.&lt;/p&gt;
&lt;p id=&quot;0560&quot; data-selectable-paragraph=&quot;&quot;&gt;&lt;b&gt;공개 키&lt;/b&gt;(Public Key) 방식은 암호화에 사용하는 키와 복호화에 사용되는 키를 분리하는 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; srcset=&quot;https://miro.medium.com/max/276/1*6gB_yj-L3UFUdmtXa7JxHw.gif 276w, https://miro.medium.com/max/521/1*6gB_yj-L3UFUdmtXa7JxHw.gif 521w&quot; width=&quot;521&quot; height=&quot;225&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMfIDK/btqX1opHkv3/k09qJUJ4VWGDigD4i68jb0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMfIDK/btqX1opHkv3/k09qJUJ4VWGDigD4i68jb0/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMfIDK/btqX1opHkv3/k09qJUJ4VWGDigD4i68jb0/img.gif&quot; srcset=&quot;https://miro.medium.com/max/276/1*6gB_yj-L3UFUdmtXa7JxHw.gif 276w, https://miro.medium.com/max/521/1*6gB_yj-L3UFUdmtXa7JxHw.gif 521w&quot; width=&quot;521&quot; height=&quot;225&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p id=&quot;e17b&quot; data-selectable-paragraph=&quot;&quot;&gt;암호화를 할때는 공개 키를 이용해 암호화를 하고 복호화를 할 때는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;비밀 키&lt;/b&gt;(private key)를 이용한다. 이렇게 되면 공개 키가 노출 되더라도 복호화를 위해 필요한 비밀 키를 모르면 복호화를 할 수가 없다.&lt;/p&gt;
&lt;p id=&quot;33e7&quot; data-selectable-paragraph=&quot;&quot;&gt;공개 키 방식은 대칭 키 방식의 보안 문제를 해결한 방법이지만 컴퓨터 자원이 더 많이 들어가는 단점이 있다.&lt;/p&gt;
&lt;p id=&quot;4624&quot; data-selectable-paragraph=&quot;&quot;&gt;추가로&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;SSL인증서&lt;/b&gt;는 클라이언트가 접속한 서버가 신뢰할수 있는 서버라는걸 입증해 주는 역할을 하고, SSL 통신에 필요한 공개키를 클라이언트에게 제공한다.(서비스 정보 &amp;amp; 공개 키에 관한 내용이 있음.)&lt;/p&gt;
&lt;p id=&quot;3d01&quot; data-selectable-paragraph=&quot;&quot;&gt;&lt;b&gt;CA&lt;/b&gt;(Certificate Authority)는 SSL인증서를 보증해주는 외부 기관들이다.&lt;/p&gt;
&lt;p id=&quot;a218&quot; data-selectable-paragraph=&quot;&quot;&gt;HTTPS 통신 과정을 간단히(??) 정리해보면.&lt;/p&gt;
&lt;ol&gt;
&lt;li id=&quot;4953&quot; data-selectable-paragraph=&quot;&quot;&gt;서버는 CA기관으로 사이트 정보와 공개 키를 전달함.&lt;/li&gt;
&lt;li id=&quot;3075&quot; data-selectable-paragraph=&quot;&quot;&gt;CA기관에서 해당 사이트를 검증하고 나서 사이트 정보와 공개 키를 인증기관의 개인 키로 암호화 하여 SSL 인증서를 제작함.&lt;/li&gt;
&lt;li id=&quot;ae4c&quot; data-selectable-paragraph=&quot;&quot;&gt;해당 사이트에 SSL인증서를 발급 함.&lt;/li&gt;
&lt;li id=&quot;69b1&quot; data-selectable-paragraph=&quot;&quot;&gt;CA 기관은 브라우저에게 CA기관의 공개 키를 제공함.&lt;/li&gt;
&lt;li id=&quot;2c4b&quot; data-selectable-paragraph=&quot;&quot;&gt;클라이언트가 서버로 접속시, 서버로 random 값과 클라이언트 측에서 사용가능한 암호화 기법을 서버로 전송. (Client Hello)&lt;/li&gt;
&lt;li id=&quot;e73b&quot; data-selectable-paragraph=&quot;&quot;&gt;서버에서 random 값과 서버에서 처리가능한 암호화(동일한 암호화 알고리즘을 사용하기 위해 협상 하는 단계) 기법과 SSL인증서를을 함께 클라이언트에게 전송. (Server Hello)&lt;/li&gt;
&lt;li id=&quot;f100&quot; data-selectable-paragraph=&quot;&quot;&gt;브라우저에 내장된 CA 리스트 정보로 부터 CA가 제공한 공개 키를 이용해 SSL인증서를 복호화 함. 복호화가 성공한다면 인증된 서버임이 확인되고, 공개 키를 클라이언트가 얻게 됨. 서버는 비밀 키를 가지고 있음.&lt;/li&gt;
&lt;li id=&quot;6dc9&quot; data-selectable-paragraph=&quot;&quot;&gt;클라이언트는 클라이언트 측 random 값과 서버로 부터 받은 random 값을이용해서 대칭 키 생성함. 이 대칭 키는 실제 데이터를 주고 받을때 사용됨.&lt;/li&gt;
&lt;li id=&quot;de04&quot; data-selectable-paragraph=&quot;&quot;&gt;클라이언트는 SSL인증서 안에있는 공개 키를 이용해 생성한 대칭 키를 암호화 시켜 서버로 전송함. 이때 전송된 내용은 암호화 됨.&lt;/li&gt;
&lt;li id=&quot;af91&quot; data-selectable-paragraph=&quot;&quot;&gt;서버는 대칭 키를 비밀 키를 이용해 복호화함. 이제 클라이언트와 서버 모두 대칭 키를 가지고 있음.(5~10번까지의 과정을 handshake라고 함.)&lt;/li&gt;
&lt;li id=&quot;b825&quot; data-selectable-paragraph=&quot;&quot;&gt;이후 부터는 클라이언트와 서버는 대칭 키를 이용해 데이터를 암호화, 복호화를 하며 요청과 응답을 처리함.&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>자기계발 일지</category>
      <category>HTPPS</category>
      <category>HTTP</category>
      <author>silverbell</author>
      <guid isPermaLink="true">https://sbell92.tistory.com/87</guid>
      <comments>https://sbell92.tistory.com/87#entry87comment</comments>
      <pubDate>Mon, 22 Feb 2021 11:40:48 +0900</pubDate>
    </item>
    <item>
      <title>[API 개발] POST MAN 사용법 및 개념 (feat. REST, payload)</title>
      <link>https://sbell92.tistory.com/86</link>
      <description>&lt;p&gt;운영하던 쇼핑몰을 종합쇼핑몰에 제휴하기 위한 API개발을 진행하기 위해 POSTMAN을 사용하게 되었습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;페이로드 란?&lt;/h3&gt;
&lt;p&gt;페이로드(payload)는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;전송되는 데이터&lt;/b&gt;를 의미합니다. 데이터를 전송할 때, 헤더와 메타데이터, 에러 체크 비트 등과 같은 다양한 요소들을 함께 보내어, 데이터 전송의 효율과 안정성을 높히게 됩니다. 이 때, 보내고자 하는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;데이터 자체&lt;/b&gt;&lt;/span&gt;를 의미하는 것이 바로 페이로드입니다. 우리가 택배 배송을 보내고 받을 때, 택배 물건이 페이로드이고, 송장이나 박스, 뾱뾱이와 같은 완충재 등등은 부가적인 것이기 때문에 페이로드가 아닙니다.&lt;/p&gt;
&lt;p&gt;추가적으로 위키피디아에 아주 이해하기 좋은 예시가 아래와 같이 나와있어서 첨부합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;페이로드(payload)라는 단어는 운송업에서 비롯하였는데,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;지급(pay)&lt;/b&gt;해야 하는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;적화물(load)&lt;/b&gt;을 의미합니다. 예를 들어, 유조선 트럭이 20톤의 기름을 운반한다면 트럭의 총 무게는 차체, 운전자 등의 무게 때문에 그것보다 더 될 것이다. 이 모든 무게를 운송하는데 비용이 들지만, 고객은 오직 기름의 무게만을 지급(pay)하게 된다. 그래서 &amp;lsquo;pay-load&amp;rsquo;란 말이 나온 것이다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;json으로 보는 실제 데이터에서의 payload는 아래의 json에서 &amp;ldquo;&lt;b&gt;data&lt;/b&gt;&amp;rdquo;입니다. 그 이외의 데이터들은 전부 통신을 하는데 있어 용이하게 해주는 부차적인 정보들입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;&lt;/span&gt;&lt;span style=&quot;color: #a6bc00;&quot;&gt;&lt;b&gt;status&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;&lt;/span&gt;&lt;span style=&quot;color: #a6bc00;&quot;&gt;&lt;b&gt;from&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #a6bc00;&quot;&gt;&lt;b&gt;localhost&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;&lt;/span&gt;&lt;span style=&quot;color: #a6bc00;&quot;&gt;&lt;b&gt;to&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&quot;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;a href=&quot;http://melonicedlatte.com/chatroom/1&quot;&gt;&lt;span&gt;http&lt;/span&gt;&lt;span&gt;://silverbell&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;com&lt;/span&gt;&lt;span&gt;/sbell92&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;&lt;/span&gt;&lt;span style=&quot;color: #a6bc00;&quot;&gt;&lt;b&gt;method&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #a6bc00;&quot;&gt;&lt;b&gt;GET&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;&lt;/span&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;data&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;:{&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #a6bc00;&quot;&gt;&lt;b&gt;message&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #a6bc00;&quot;&gt;&lt;b&gt;There is a my Bang!&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h1 data-selectable-paragraph=&quot;&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;p&gt;REST란 말을 많이 들어봤을거 같아요. API 개발할때 요구사항이 &lt;b&gt;RESTFUL하게 &lt;/b&gt;였으니, REST가 뭔지 알아봤습니다.&lt;/p&gt;
&lt;h1 id=&quot;8b74&quot; data-selectable-paragraph=&quot;&quot;&gt;REST 란 ?&lt;/h1&gt;
&lt;p id=&quot;fdc0&quot; data-selectable-paragraph=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;REST&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;란&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;ldquo;Representational State Transfer&amp;rdquo; 의 약자이다. 월드 와이드 웹과 같은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;분산 하이퍼미디어 시스템을 위한 소프트웨어 아키텍처의 한 형식&lt;/b&gt;이다.&lt;/p&gt;
&lt;p id=&quot;e6d9&quot; data-selectable-paragraph=&quot;&quot;&gt;REST란, &amp;ldquo;웹에 존재하는 모든 자원(이미지, 동영상, DB 자원)에 고유한 URI를 부여해 활용&lt;b&gt;&amp;rdquo;&lt;/b&gt;하는 것으로, 자원을 정의하고 자원에 대한 주소를 지정하는 방법론을 의미한다고 한다.&lt;/p&gt;
&lt;p id=&quot;ebfa&quot; data-selectable-paragraph=&quot;&quot;&gt;이런 REST의 형식을 따른 시스템을 RESTful 이라고 부른다.&lt;/p&gt;
&lt;p id=&quot;4659&quot; data-selectable-paragraph=&quot;&quot;&gt;HTTP URI 를 통해 자원을 명시하고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;HTTP Method를 통해&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;해당 자원의 대한&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;CRUD Operation을 적용&lt;/b&gt;한다.&lt;/p&gt;
&lt;p data-selectable-paragraph=&quot;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt;
&lt;h2 id=&quot;f21e&quot; data-selectable-paragraph=&quot;&quot;&gt;CRUD Operation , HTTP Method&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;638a&quot; data-selectable-paragraph=&quot;&quot;&gt;Create :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;POST&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(자원 생성)&lt;/li&gt;
&lt;li id=&quot;3556&quot; data-selectable-paragraph=&quot;&quot;&gt;Read :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;GET&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;(자원의 정보 조회)&lt;/li&gt;
&lt;li id=&quot;0c86&quot; data-selectable-paragraph=&quot;&quot;&gt;Update :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;PUT&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(자원의 정보 업데이트)&lt;/li&gt;
&lt;li id=&quot;40ab&quot; data-selectable-paragraph=&quot;&quot;&gt;Delete :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;DELETE&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(자원 삭제)&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;REQUEST&lt;/h2&gt;
&lt;p&gt;POSTMAN으로 API의 데이터를 확인할때 2가지를 Request 했습니다.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Request URL :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;[HTTP Method] URL&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Request body :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Request-payload&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;저 같은 경우는 개발서버, 운영서버 2가지의 Request URL을 사용했어야 했으므로&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;URL 부분을 전역변수로 사용&lt;/b&gt;&lt;/span&gt;했습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;b&gt;[참고] POSTMAN 전역변수 사용방법&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Environments 탭에 key-value 형식으로 mapping하여,&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;Send&lt;/b&gt;&lt;/span&gt;버튼을 눌러 Request를 요청하기전 toggle 버튼으로 url을 변경하였습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #a6bc00;&quot;&gt;&lt;b&gt;Request&lt;/b&gt;&lt;/span&gt;를 보내고 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;Response&lt;/b&gt;&lt;/span&gt;를 받아오는 화면은 전체적으로 다음과 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxB51y/btqXrChtUgJ/FgpBsGU3NhF39oO7Ttnkf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxB51y/btqXrChtUgJ/FgpBsGU3NhF39oO7Ttnkf0/img.png&quot; data-alt=&quot;POSTMAN을 통해 Request하고 Response를 받아오는 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxB51y/btqXrChtUgJ/FgpBsGU3NhF39oO7Ttnkf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxB51y%2FbtqXrChtUgJ%2FFgpBsGU3NhF39oO7Ttnkf0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;POSTMAN을 통해 Request하고 Response를 받아오는 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>spring/project</category>
      <category>API</category>
      <category>postman</category>
      <category>Rest</category>
      <category>RESTful</category>
      <category>제휴</category>
      <author>silverbell</author>
      <guid isPermaLink="true">https://sbell92.tistory.com/86</guid>
      <comments>https://sbell92.tistory.com/86#entry86comment</comments>
      <pubDate>Mon, 15 Feb 2021 11:03:16 +0900</pubDate>
    </item>
    <item>
      <title>[모던자바 인액션]#2 동작 파라미터화 코드 전달</title>
      <link>https://sbell92.tistory.com/85</link>
      <description>&lt;p&gt;&lt;span&gt;&lt;b&gt;# chapter 2. 동작 파라미터화 코드 전달하기&amp;nbsp;&amp;nbsp;&lt;/b&gt; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;-. 동작파라미터화 : 어떻게 실행할 것인지 결정하지 않은 코드 블록&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 이 코드블록은 나중에 프로그램에서 호출. 즉, 코드 블록의 실행은 나중으로 미뤄진다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; why)) 변화하는 요구사항에 대응하기 위해&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; how)) 나중에 실행될 메서드의 인수로 코드블록을 전달할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;example) 룸메이트에게 빵, 치즈, 와인등의 식료품을 사달라 부탁&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;작업 수행 메서드 : go&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;원하는 동작&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: go 메서드의 인수&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;[step 1]&amp;nbsp;&lt;/b&gt;interfaca 객체를 parameter로 설정&lt;/p&gt;
&lt;p&gt;interface ApplePredicate {&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;boolean test(Apple a);&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;&lt;b&gt;[step 2]&amp;nbsp;&lt;/b&gt;원하는 조건을 넣어 interface를 구현(implements)하여 클래스 정의&lt;/p&gt;
&lt;p&gt;static class AppleRedAndHeavyPredicate implements ApplePredicate {&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public boolean test(Apple apple) {&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return apple.getColor() == Color.RED &amp;amp;&amp;amp; apple.getWeight() &amp;gt; 150;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;&lt;b&gt;[step 3]&amp;nbsp;&lt;/b&gt;메서드 사용시 parameter로 구현된 class를 new 로 생성&lt;/p&gt;
&lt;p&gt;List&amp;lt;Apple&amp;gt; redAndHeavyApples = filter(inventory, new AppleRedAndHeavyPredicate());&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;=&amp;gt; 이렇게 되면 &lt;span&gt;step2&lt;/span&gt;와 같이 로직과 상관없는 소스들이 많아질 수 있다.&amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; then, JAVA는 익명클래스를 제공&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;익명클래스 :&lt;/b&gt;&amp;nbsp;클래스의 선언과 인스턴스화를 동시에 수행.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;익명 클래스를 사용하면 &lt;span&gt;step2&lt;/span&gt; 와 &lt;span&gt;step3&lt;/span&gt; 단계를 합칠 수 있다.&lt;/p&gt;
&lt;p&gt;List&amp;lt;Apple&amp;gt; redAndHeavyApples = filter(inventory, &lt;b&gt;new ApplePredicate() {&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; public boolean test(Apple apple) {&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return apple.getColor() == Color.RED &amp;amp;&amp;amp; apple.getWeight() &amp;gt; 150;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; }&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;}&lt;/b&gt;);&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;가독성이 떨어진다.. 이 부분을 &lt;span&gt;람다&lt;/span&gt;로 해결 가능&lt;/p&gt;
&lt;p&gt;List&amp;lt;Apple&amp;gt; redAndHeavyApples =&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;filter(inventory, &lt;b&gt;(Apple apple) -&amp;gt; apple.getColor() == Color.RED &amp;amp;&amp;amp; apple.getWeight() &amp;gt; 150&lt;/b&gt; );&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;# chapter 3. 람다 표현식&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;why use)) 동작 파라미터를 이용할 때 익명 클래스 등 판에 박힌 코드를 구현할 필요가 없다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;ex1) 커스텀 Comparator 객체&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Comparater&amp;lt;Apple&amp;gt; nyWeight = new Comparator&amp;lt;Apple&amp;gt;() {&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; public int comparator(Apple a1, Apple a2) {&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ruturn a1.getWeight().comparator(a2.getWeight());&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;
&lt;p&gt;};&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;ex2) 람다 표현식&lt;/b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p&gt;Comparater&amp;lt;Apple&amp;gt; nyWeight = &lt;b&gt;(Apple a1, Apple a2)&lt;/b&gt; &lt;b&gt;-&amp;gt;&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;b&gt;a1.getWeight().comparator(a2.getWeight());&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &lt;b&gt;-.&amp;nbsp;&lt;/b&gt;&lt;b&gt;(Apple a1, Apple a2) &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;: 람다 파라미더&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &lt;b&gt;-.&lt;/b&gt;&amp;nbsp;&lt;b&gt;-&amp;gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;: 화살표&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; -.&amp;nbsp;a1.getWeight().comparator(a2.getWeight()) : 람다바디&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;함수형 인터페이스 란)&lt;/span&gt; 정확히 하나의 추상메서드를 지정하느 인터페이스다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>언어/java</category>
      <author>silverbell</author>
      <guid isPermaLink="true">https://sbell92.tistory.com/85</guid>
      <comments>https://sbell92.tistory.com/85#entry85comment</comments>
      <pubDate>Wed, 13 Jan 2021 15:47:45 +0900</pubDate>
    </item>
    <item>
      <title>[모던자바 인액션]#3 람다 표현식</title>
      <link>https://sbell92.tistory.com/84</link>
      <description>&lt;p&gt;&lt;b&gt;&lt;span&gt;#chapter 3. 람다 표현식&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;-. 람다 표현식 : 메서드로 전달할 수 있는 익명함수를 단순화한 것&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;[example]&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Comparator&amp;lt;Apple&amp;gt; byWeight = new Comparator&amp;lt;Apple&amp;gt;() {&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; public int compare(Apple a1, Apple a2) {&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; return a1.getWeight().compareTo(a2.getWeight());&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;
&lt;p&gt;};&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;[람다 이용]&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Comparator&amp;lt;Apple&amp;gt; byWeight =&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; (Apple a1, Apple a2) -&amp;gt; a1.getWeight().compareTo(a2.getWeight());&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 람다 파라미터&amp;nbsp; &amp;nbsp;화살표&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 람다 바디&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;[람다 포멧]&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;-. (parameters) -&amp;gt; expression&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;-. (parameters) -&amp;gt; {expression;}&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;-. 함수형 인터페이스&amp;nbsp; : 정확히 하나의 추상메서드를 지정하는 인터페이스&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;public interface Comparator&amp;lt;T&amp;gt; {&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; boolean test(T t);&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;?) 많은 디폴트 메서드가 있더라도 &lt;b&gt;추상 메서드가 오직 하나&lt;/b&gt;면 함수형 인터페이스다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;디포트 메서드 : 인터페이스의 메서드를 구현하지 않은 클래스를&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;@FunctionalInterface&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;해당 어노테이션을 쓰면&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;???) 함수형 인터페이스로 뭘 할 수 있을까?&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;람다 표현식으로 함수형 인터페이스의 추상 메서드 구현을 직접 전달할 수 있으므로 &lt;span&gt;전체 표현식을 함수형 인터&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;페이스의 인스턴스로 취급&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;자바8 설계자들은&lt;/span&gt; &lt;span&gt;java.util.function.*&lt;/span&gt; &lt;span&gt;패키지로 여러가지 새로운&lt;/span&gt; &lt;span&gt;함수형 인터페이스&lt;/span&gt;&lt;span&gt;를 제공.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span&gt;-. Predicate&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;test 라는 추상 메서드를 정의하며, test는 제네릭형식의 T의 객체를 인수로 받아 &lt;span&gt;불리언&lt;/span&gt;을 반환한다.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;[java.util.function.Predicate]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@FunctionalInterface&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public interface &lt;b&gt;Predicate&lt;/b&gt;&amp;lt;T&amp;gt; {&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;boolean&lt;/b&gt; &lt;b&gt;test&lt;/b&gt;(T t);&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;[Predicate 예제]&lt;/b&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public &amp;lt;T&amp;gt; List&amp;lt;T&amp;gt; &lt;b&gt;filter&lt;/b&gt;(List&amp;lt;T&amp;gt; list, Predicate&amp;lt;T&amp;gt; p) {&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;List&amp;lt;T&amp;gt; results = new ArrayList&amp;lt;&amp;gt;();&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;for (T t:list) {&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(p.test(t)) {&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;results.add(t);&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return results;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;Predicate&amp;lt;String&amp;gt; nonEmptyStringPredicate = (String s) -&amp;gt; !s.isEmpty();&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;List&amp;lt;String&amp;gt; nonEmpty = filter(listOfStrings, &lt;b&gt;nonEmptyStringPredicate&lt;/b&gt;);&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span&gt;-. Comsumer&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;accept 라는 추상 메서드를 정의하며, accept는 제네릭형식의 T의 객체를 인수로 받아 &lt;span&gt;void&lt;/span&gt;를 반환한다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;[java.util.function.Consumer]&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@FunctionalInterface&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public interface Consumer&amp;lt;T&amp;gt; {&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;void accept(T t);&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/p&gt;
&lt;p&gt;&lt;b&gt;[Comsumer 예제]&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; public &amp;lt;T&amp;gt; void &lt;b&gt;foreach&lt;/b&gt;(List&amp;lt;T&amp;gt; list, Consumer&amp;lt;T&amp;gt; c) {&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;for (T t: list) {&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c.accept(t);&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private void forEach() {&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Arrays.asList(1, 2, 3, 4, 5),&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;(Integer i) -&amp;gt; System.out.println(i)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span&gt;-. Function&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;java.util.function.Function&amp;lt;&lt;span&gt;T&lt;/span&gt;, &lt;span&gt;R&lt;/span&gt;&amp;gt; 인터페이스는 제네릭 형식 T를 &lt;span&gt;인수&lt;/span&gt;로 받아서 제네릭 형식 R객체를 &lt;span&gt;반환&lt;/span&gt;하는 추상메서드 apply를 정의한다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;[java.util.function.Function]&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@FunctionalInterface&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public interface &lt;b&gt;Function&lt;/b&gt;&amp;lt;&lt;b&gt;T&lt;/b&gt;, &lt;b&gt;R&lt;/b&gt;&amp;gt; {&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;R&lt;/b&gt; &lt;b&gt;apply&lt;/b&gt;(&lt;b&gt;T t&lt;/b&gt;);&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/p&gt;
&lt;p&gt;&lt;b&gt;[Function 예제]&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public &amp;lt;T,R&amp;gt; List&amp;lt;R&amp;gt; &lt;b&gt;map&lt;/b&gt;(List&amp;lt;T&amp;gt; list, Function&amp;lt;T, R&amp;gt; f) {&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;List&amp;lt;R&amp;gt; result = new ArrayList&amp;lt;&amp;gt;();&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;for (T t: list) {&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result.add(f.apply(t));&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return result;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;List&amp;lt;&lt;b&gt;Integer&lt;/b&gt;&amp;gt; l = map(&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Arrays.asList(&quot;lamdas&quot;, &quot;in&quot;, &quot;action&quot;),&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;(String s) -&amp;gt; s.length()&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;);&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;cf&amp;gt; java의 형식&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;참조형 : Byte, Integer, Object, List&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;기본형 : int, double, byte, char&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;-. 박싱&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: 기본형 -&amp;gt; 참조형 으로 형 변환&lt;/p&gt;
&lt;p&gt;-. 언박싱&amp;nbsp; &amp;nbsp; &amp;nbsp;: 참조형 -&amp;gt; 기본형 으로 형 변환&lt;/p&gt;
&lt;p&gt;-. 오토박싱 : 박싱과 언박싱이 자유롭게 이뤄짐&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;람다로 함수형 인터페이스의 인스턴스를 만들수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;[형식검사 문제] 다음 코드를 컴파일할 수 없는 이유는?&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Object o = () -&amp;gt; { System.out.println(&quot;Eun example&quot;); };&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;(solution)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;람다 표현식의 콘텍스트 = Object(대상형식)&amp;nbsp;이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;하지만 Object는 함수형 인터페이스가 아니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;따라서 ()-&amp;gt; void 형식의 함수 디스크립터를 갖는 Runnable로 대상 형식을 바꿔서 문제를 해결할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &lt;b&gt;sol)&lt;/b&gt;&amp;nbsp;Object o = &lt;b&gt;(Runnable)&lt;/b&gt; () -&amp;gt; { System.out.println(&quot;Eun example&quot;); };&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;(추가)&lt;/b&gt; 예를 들어 &lt;b&gt;execute (() -&amp;gt; {})&lt;/b&gt;라는 람다 표현식이 있다면 Runnable과 Action의 함수 디스크립터가 같으므로 누구를 가리키는지가 명확하지 않다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;public void &lt;b&gt;excute&lt;/b&gt;(Runnable runnable) {&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; runnable.run();&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;public void &lt;b&gt;excute&lt;/b&gt;(Action&amp;lt;T&amp;gt; action) {&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; action.act();&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;@FunctionlInterface&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;interface &lt;b&gt;Action&lt;/b&gt; {&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; void &lt;b&gt;act&lt;/b&gt;();&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; sol)&lt;/b&gt;&amp;nbsp;execute ( &lt;b&gt;(Action)&lt;/b&gt; () -&amp;gt; {})&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span&gt;-. 형식추론&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;자바 컴파일러&lt;/span&gt;는 람다표현식이 사용된 콘텍스트(대상 형식)를 이용해서 람다 표현식과 관련된 함수형 인터페이스를 추론한다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;[Comparator 객체 예제]&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Comparator&amp;lt;Apple&amp;gt; c = &lt;b&gt;(Apple a1, Apple a2)&lt;/b&gt; -&amp;gt; a1.getWeight().compareTo(a2.getWeight());&amp;nbsp; &amp;nbsp; &lt;b&gt;// 형식을 추론하지 않음.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Comparator&amp;lt;Apple&amp;gt; c = &lt;b&gt;(a1, a2)&lt;/b&gt; -&amp;gt; a1.getWeight().compareTo(a2.getWeight());&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;b&gt;// 형식을 추론함&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;=&amp;gt; 개발자 스스로 어떤 코드가 가독성을 향상 시킬 수 있는지 결정해야 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span&gt;-. 지역변수 사용&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;람다 캡쳐링&lt;/span&gt; :&amp;nbsp; 람다 표현식에서는 익명 함수가 하는 것처럼 &lt;span&gt;자유변수&lt;/span&gt;를 활용할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; cf&amp;gt;&amp;nbsp;자유변수란) 파라미터로 넘겨진 변수가 아닌 외부에서 정의된 변수&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;[Question]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;int portNumber = 1337;&lt;/p&gt;
&lt;p&gt;Runnable r = () -&amp;gt; System.out.println(portNumber);&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; // 컴파일 ERROR 발생&lt;/p&gt;
&lt;p&gt;portNumber = 31337;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;(solution)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2번째 줄에서 컴파일에러 발생,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;b&gt;why?) 자유변수의 사용에도 약간의 제약이 있다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;지역변수는 final로 선언되어 있어야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;final&lt;/b&gt; int portNumber = 1337;&lt;/p&gt;
&lt;p&gt;Runnable r = () -&amp;gt; System.out.println(portNumber);&lt;/p&gt;
&lt;p&gt;portNumber = 31337;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; // 컴파일 ERROR 발생(final 변수를 수정했으므로)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;[자유변수 사용에 제약이 생긴 이유?]&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;(저장공간)&lt;/p&gt;
&lt;p&gt;인스턴스변수 =&amp;gt; 힙&lt;/p&gt;
&lt;p&gt;지역 변수&amp;nbsp; &amp;nbsp; =&amp;gt; 스택&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;람다에서 지역변수에 바로 접근할 수 있다는 가정하에 람다가 스레드에서 실행된다면 변수를 할당한 스레드가 사라져서 변수 할당이 해제되었는데도 람다를 실행하는 스레드에서는&lt;/p&gt;
&lt;p&gt;해당 변수에 접근하려 할 수 있다. 따라서 자바 구현에서는 원래 변수에 접근을 허용하는것이 아닌 자유 지역 변수의 &lt;b&gt;복사본을 제공&lt;/b&gt;한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;따라서 &lt;b&gt;복사본의 값이 바뀌지 않아야 하므로&amp;nbsp;&lt;/b&gt;&lt;b&gt;지역 변수에서는 한 번만 값을 할당해야 한다는 제약이 생긴것이다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span&gt;-. 메서드 참조&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;메서드 참조를 사용함으로써 가독성을 높일 수 있고, 간결하게 구현할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;[예제]&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;inventory.sort((Apple a1, Apple a2) -&amp;gt; a1.getWeight().compareTo(a2.getWeight()));&lt;/p&gt;
&lt;p&gt;inventory.sort(comparing&lt;b&gt;(Apple::getWeight)&lt;/b&gt;);&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;b&gt;=&amp;gt; Apple클래스에 정의된 getWeight의 메서드 참조.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;생성자, 배열 생성자, super 호출&lt;/span&gt; 등에 사용할 수 있는 특별한 형식의 메서드 참조도 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;1) 기존의 메서드 구현을 재활용해서 메서드 참조를 만드는 방법&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;[예제] List에 포함된 문자열을 대,소문자를 구분하지 않고 정렬하는 프로그램.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;List&amp;lt;String&amp;gt; str = Arrays.asList(&quot;a&quot;, &quot;b&quot;, &quot;A&quot;, &quot;B&quot;);&lt;/p&gt;
&lt;p&gt;&lt;s&gt;str.sort(&lt;b&gt;(s1, s2) -&amp;gt; s1.compareToIgnoreCase(s2)&lt;/b&gt;);&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;str.sort(&lt;b&gt;String::compareToIgnoreCase&lt;/b&gt;);&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;2) 생성자 참조 (ClassName::new)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Supplier&lt;/b&gt;&amp;lt;Apple&amp;gt; c1 = Apple::new;&lt;/p&gt;
&lt;p&gt;Apple a1 = c1.get();&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;// &lt;b&gt;Supplier&lt;/b&gt;의 get메서드를 호출해서 새로운 Apple 객체를 만들 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Function&lt;/b&gt;&amp;lt;Integer, Apple&amp;gt; c2 = &lt;b&gt;Apple::new;&lt;/b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; // &lt;b&gt;(weight) -&amp;gt; new Apple(weight)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Apple a2 = c2.apply(110);&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt; // &lt;b&gt;Function&lt;/b&gt;의 get메서드를 호출해서 새로운 Apple 객체를 만들 수 있다.&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;119 ~ 131 페이지&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;생성자 참조~ 부터는 다음에 한번 더 보기! (이해가 잘 안감)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>언어/java</category>
      <author>silverbell</author>
      <guid isPermaLink="true">https://sbell92.tistory.com/84</guid>
      <comments>https://sbell92.tistory.com/84#entry84comment</comments>
      <pubDate>Wed, 13 Jan 2021 15:46:51 +0900</pubDate>
    </item>
  </channel>
</rss>