<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>시옹리옹</title>
    <link>https://sr-dev.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Fri, 3 Jul 2026 19:12:57 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>시옹리옹</managingEditor>
    <image>
      <title>시옹리옹</title>
      <url>https://tistory1.daumcdn.net/tistory/4760522/attach/7d36a8649d294ec59a252b82a0da4be2</url>
      <link>https://sr-dev.tistory.com</link>
    </image>
    <item>
      <title>[프로그래머스] 정수 삼각형 - 자바 Java + 접근 방식</title>
      <link>https://sr-dev.tistory.com/28</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1172&quot; data-origin-height=&quot;1746&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYFD7o/btsBB8U9LEK/4CiK4HKC2j8za8wpWSdOQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYFD7o/btsBB8U9LEK/4CiK4HKC2j8za8wpWSdOQK/img.png&quot; data-alt=&quot;프로그래머스 -&amp;amp;nbsp; https://school.programmers.co.kr/learn/courses/30/lessons/43105&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYFD7o/btsBB8U9LEK/4CiK4HKC2j8za8wpWSdOQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYFD7o%2FbtsBB8U9LEK%2F4CiK4HKC2j8za8wpWSdOQK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;433&quot; height=&quot;645&quot; data-origin-width=&quot;1172&quot; data-origin-height=&quot;1746&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;프로그래머스 -&amp;nbsp; https://school.programmers.co.kr/learn/courses/30/lessons/43105&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dynamic Programming 문제이고 아래 칸으로 아래로 내려가면서 거쳐간 숫자의 최댓값을 구하는 문제입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;접근 방식&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크게 맨 왼쪽 값, 중간 값, 맨 오른쪽 구하는 식으로 구성되어있고 answer 를 업데이트하면서 현재까지 계산된 최대 합을 저장합니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;doodle-91 3.jpg&quot; data-origin-width=&quot;1668&quot; data-origin-height=&quot;2157&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQ7YmN/btsBxXtRMLU/Z4LzGScPQAWexRwhym8r2k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQ7YmN/btsBxXtRMLU/Z4LzGScPQAWexRwhym8r2k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQ7YmN/btsBxXtRMLU/Z4LzGScPQAWexRwhym8r2k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQ7YmN%2FbtsBxXtRMLU%2FZ4LzGScPQAWexRwhym8r2k%2Fimg.jpg&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; loading=&quot;lazy&quot; width=&quot;1668&quot; height=&quot;2157&quot; data-filename=&quot;doodle-91 3.jpg&quot; data-origin-width=&quot;1668&quot; data-origin-height=&quot;2157&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1701957439730&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.*;

class Solution {
    public int solution(int[][] triangle) {
        int answer = 0;
        int[][] temp = new int[triangle.length][triangle.length];
        temp[0][0] = triangle[0][0];
        
        for(int i = 1; i &amp;lt; triangle.length; i++) {
            temp[i][0] = temp[i - 1][0] + triangle[i][0];
            
            
            for(int j = 1; j &amp;lt;= i; j++) {
                temp[i][j] = Math.max(temp[i - 1][j], temp[i - 1][j - 1]) + triangle[i][j];
                answer = Math.max(answer, temp[i][j]);
            }
            
            temp[i][i] = temp[i - 1][i - 1] + triangle[i][i];
        }
           
        return answer;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>문제/프로그래머스</category>
      <category>java</category>
      <category>동적계획법(Dynamic Programming)</category>
      <category>레벨3</category>
      <category>정수삼각형</category>
      <category>프로그래머스</category>
      <author>시옹리옹</author>
      <guid isPermaLink="true">https://sr-dev.tistory.com/28</guid>
      <comments>https://sr-dev.tistory.com/28#entry28comment</comments>
      <pubDate>Thu, 7 Dec 2023 22:59:56 +0900</pubDate>
    </item>
    <item>
      <title>[백준] 분해합 2231번 - 자바 Java + 접근 방식</title>
      <link>https://sr-dev.tistory.com/27</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;완전 탐색(Brute-force&lt;span&gt;&amp;nbsp;&lt;/span&gt;Search) 문제입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2366&quot; data-origin-height=&quot;1594&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VjwAo/btsA9VWglyo/KcybDZ9W58aXvGc1kyBAp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VjwAo/btsA9VWglyo/KcybDZ9W58aXvGc1kyBAp0/img.png&quot; data-alt=&quot;백준&amp;amp;nbsp;https://www.acmicpc.net/problem/2231&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VjwAo/btsA9VWglyo/KcybDZ9W58aXvGc1kyBAp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVjwAo%2FbtsA9VWglyo%2FKcybDZ9W58aXvGc1kyBAp0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;2366&quot; height=&quot;1594&quot; data-origin-width=&quot;2366&quot; data-origin-height=&quot;1594&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;백준&amp;nbsp;https://www.acmicpc.net/problem/2231&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;접근 방식&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1701248818363&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;

class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        //입력받은 숫자를 문자열로 받는다.
        String numberString = br.readLine();
        //입력받은 숫자의 길이
        int numberLength = numberString.length();
        //문자열을 int로 변환
        int number = Integer.parseInt(numberString);
        //결과값
        int result = 0;
        //분해합은 N과 각 자릿수 값의 합이므로 최솟값은 역으로 N에서 더할 수 있는 최대의 자릿수 값들을 빼주면 됩니다. 
        //각 자릿수의 최대값은 9입니다. 9의 자릿수를 곱해서 빼주면 최솟값을 구할 수 있습니다.
        //ex) 216은 3자리입니다. 
        //216 - (3 * 9) = 189 가 최솟값이 됩니다. 
        for(int i = (number - (numberLength * 9)); i &amp;lt; number; i++) {
            int sum = 0; //각 자릿수 합 변수
            int j = i; //한자리씩 구하기 위한 변수
            while (j != 0) {
                sum += j % 10; //각 자릿수 더하기
                j /= 10;
            }
            
            //각 자릿수 누적합과 i가 같을 경우 
            //ex) 18 + 198 == 216
            if(sum + i == number) {
                result = i;
                break;
            } 
        }

        System.out.println(result);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;div id=&quot;gtx-trans&quot; style=&quot;position: absolute; left: 159px; top: 684.891px;&quot;&gt;
&lt;div class=&quot;gtx-trans-icon&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;</description>
      <category>문제/백준</category>
      <category>2231</category>
      <category>java</category>
      <category>백준</category>
      <author>시옹리옹</author>
      <guid isPermaLink="true">https://sr-dev.tistory.com/27</guid>
      <comments>https://sr-dev.tistory.com/27#entry27comment</comments>
      <pubDate>Wed, 29 Nov 2023 18:08:22 +0900</pubDate>
    </item>
    <item>
      <title>[백준] 일곱 난쟁이 2309번 - 자바 Java + 접근 방식</title>
      <link>https://sr-dev.tistory.com/26</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;완전 탐색(Brute-force Search) 문제입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2368&quot; data-origin-height=&quot;2098&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PSAK8/btsA7zF8azI/gFgQqVs5qxoMcRNrS2KWvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PSAK8/btsA7zF8azI/gFgQqVs5qxoMcRNrS2KWvk/img.png&quot; data-alt=&quot;백준&amp;amp;amp;nbsp;https://www.acmicpc.net/problem/2309&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PSAK8/btsA7zF8azI/gFgQqVs5qxoMcRNrS2KWvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPSAK8%2FbtsA7zF8azI%2FgFgQqVs5qxoMcRNrS2KWvk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;2368&quot; height=&quot;2098&quot; data-origin-width=&quot;2368&quot; data-origin-height=&quot;2098&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;백준&amp;amp;nbsp;https://www.acmicpc.net/problem/2309&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가짜 난쟁이 2명을 제외한 키 합이 100이 되는 일곱 난쟁이의 키를 출력하는 문제입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;접근 방식&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1701231043269&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;

class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        //난쟁이 9명 배열 생성
        int[] dwarfs = new int[9];
        //난쟁이들 키 총합
        int totalHeight = 0;
       
        for(int i = 0; i &amp;lt; 9; i++) {
            int height = Integer.parseInt(br.readLine()); //각 난쟁이 키
            dwarfs[i] = height; //각 난쟁이 키를 배열에 저장
            totalHeight += dwarfs[i]; //전체 키를 합산한 값          
        }
        //오름차순으로 난쟁이들 키 정렬     
        Arrays.sort(dwarfs);
        
        //가짜 난쟁이 두명
        int spyA = 0, spyB = 0;
        
        //두개의 값을 체크해야하기 때문에 맨 마지막 값은 안쪽 for문이 처리한다.
        for(int i = 0; i &amp;lt; dwarfs.length- 1; i++) { //dwarfs.lengt-1 == 8
            for(int j = i+1; j &amp;lt; dwarfs.length; j++) { //dwarfs.lengt == 9
                if(totalHeight - dwarfs[i] - dwarfs[j] == 100) {
                    spyA = i;
                    spyB = j;
                    break;
                }
            }
        }
        
        //가짜 난쟁이를 제외한 난쟁이(진)들 키 출력
        for(int i = 0; i &amp;lt; dwarfs.length; i++) {
            //가짜 난쟁이 키 제외 출력
            if(i != spyA &amp;amp;&amp;amp; i != spyB) {
                System.out.println(dwarfs[i]);
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>문제/백준</category>
      <category>2309</category>
      <category>java</category>
      <category>백준</category>
      <category>일곱 난쟁이</category>
      <author>시옹리옹</author>
      <guid isPermaLink="true">https://sr-dev.tistory.com/26</guid>
      <comments>https://sr-dev.tistory.com/26#entry26comment</comments>
      <pubDate>Wed, 29 Nov 2023 14:28:58 +0900</pubDate>
    </item>
    <item>
      <title>[Java]짧게 훑어보는 Java 간단 지식(오버라이딩&amp;amp;오버로딩, 추상클래스, 인터페이스, SOLID-객체지향의 설계원칙)</title>
      <link>https://sr-dev.tistory.com/25</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;오버라이딩(Overriding) &amp;amp; 오버로딩(Overloading)&lt;/u&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;오버라이딩(Overriding)은 상위 클래스에 있는 메소드를 하위 클래스에서 재정의 하는 것입니다.&lt;/li&gt;
&lt;li&gt;오버로딩(Overloading)은 매개변수의 타입이나 개수를 다르게 하여 같은 이름의 메소드를 여러 개 정의하는 것입니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;추상클래스(Abstract&amp;nbsp;Class) &amp;amp; 인터페이스(Interface)&lt;/u&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;추상클래스(Abstract&amp;nbsp;Class)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스 내에 추상 메소드가 하나 이상 포함되거나 abstract로 정의된 경우를 말합니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;상속받는 클래스들의 공통적인 로직을 추상화 시키고 기능 확장을 위해 사용합니다.&lt;/li&gt;
&lt;li&gt;다중상속이 불가능하지만 인터페이스는 다중상속이 가능합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;인터페이스(Interface)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 메소드가 추상 메소드로만 이루어져 있는 것을 말합니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;클래스가&amp;nbsp;인터페이스를&amp;nbsp;구현하면&amp;nbsp;인터페이스에&amp;nbsp;선언된&amp;nbsp;모든&amp;nbsp;메소드를&amp;nbsp;구현해야&amp;nbsp;합니다.&lt;/li&gt;
&lt;li&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;있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;공통점
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;new 연산자로 인스턴스 생성 불가능합니다.&lt;/li&gt;
&lt;li&gt;사용하기 위해서는 하위 클래스에서 확장/구현 해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;객체지향의 설계원칙(SOLID)&lt;/u&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SRP - 단일 책임 원칙 : 한 클래스는 하나의 책임만 가져야 하는 원칙입니다.&lt;/li&gt;
&lt;li&gt;OCP - 개방-폐쇄 원칙 : 확장에는 열려있고, 수정에는 닫혀있어야 하는 원칙합니다.&lt;/li&gt;
&lt;li&gt;LSP - 리스코프 치환 원칙 : 하위 타입은 항상 상위 타입을 대체 할 수 있어야 합니다.&lt;/li&gt;
&lt;li&gt;ISP - 인터페이스 분리 원칙 : 인터페이스 내에 메소드는 최소한 일수록 좋다. (하나의 일반적인 인터페이스보다 여러 개의 구체적인 인터페이스가 낫습니다.) SRP와 같은 문제에 대한 두 가지 다른 해결책입니다.&lt;/li&gt;
&lt;li&gt;DIP - 의존관계 역전 원칙 : 구체적인 클래스보다 상위 클래스, 인터페이스, 추상클래스와 같이 변하지 않을 가능성이 높은 클래스와 관계를 맺는 것입니다. DIP 원칙을 따르는 가장 인기 있는 방법은 의존성 주입(DI)입니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>리뷰노트/Java</category>
      <category>java</category>
      <category>Solid</category>
      <category>오버라이딩</category>
      <category>오버로딩</category>
      <category>인터페이스</category>
      <category>추상클래스</category>
      <author>시옹리옹</author>
      <guid isPermaLink="true">https://sr-dev.tistory.com/25</guid>
      <comments>https://sr-dev.tistory.com/25#entry25comment</comments>
      <pubDate>Wed, 29 Nov 2023 13:01:05 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스]자연수 뒤집어 배열로 만들기 - 자바 Java + 접근 방식</title>
      <link>https://sr-dev.tistory.com/24</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1074&quot; data-origin-height=&quot;914&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxMsM3/btsA4T4DyYu/8iD1yUH8wHdSaHQZ7GOMu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxMsM3/btsA4T4DyYu/8iD1yUH8wHdSaHQZ7GOMu1/img.png&quot; data-alt=&quot;프로그래머스&amp;amp;amp;nbsp;https://school.programmers.co.kr/learn/courses/30/lessons/12932&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxMsM3/btsA4T4DyYu/8iD1yUH8wHdSaHQZ7GOMu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxMsM3%2FbtsA4T4DyYu%2F8iD1yUH8wHdSaHQZ7GOMu1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;594&quot; height=&quot;506&quot; data-origin-width=&quot;1074&quot; data-origin-height=&quot;914&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;프로그래머스&amp;amp;nbsp;https://school.programmers.co.kr/learn/courses/30/lessons/12932&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴하는 문제입니다.&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;접근 방식&lt;/b&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;주어진 자연수 n을 &lt;u&gt;문자열로 변환&lt;/u&gt;합니다. Long.toString(n);&lt;/li&gt;
&lt;li&gt;변환한 문자열을 역순으로 반복하면서 각 &lt;u&gt;문자를 숫자로 변환&lt;/u&gt;합니다.&amp;nbsp; numStr.charAt(i) - '0' ( 여기서&amp;nbsp;'0'을&amp;nbsp;빼는&amp;nbsp;이유는&amp;nbsp;문자에서&amp;nbsp;숫자로&amp;nbsp;변환하기&amp;nbsp;위함입니다.)&lt;/li&gt;
&lt;li&gt;변환한 숫자들을 배열에 저장합니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;최종적으로 이 배열을 반환합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1701086185493&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.ArrayList;
import java.util.List;

class Solution {
    public int[] solution(long n) {
        String numStr = Long.toString(n);
        List&amp;lt;Integer&amp;gt; list = new ArrayList&amp;lt;&amp;gt;();
        
        for(int i = numStr.length() - 1; i &amp;gt;= 0; i--) {
            list.add(numStr.charAt(i) - '0');
        }
        
        int[] answer = new int[list.size()];
        for(int i = 0; i &amp;lt; list.size(); i++) {
            answer[i] = list.get(i);
        }
        
        return answer;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>문제/프로그래머스</category>
      <category>자바</category>
      <category>접근방식</category>
      <category>프로그래머스</category>
      <author>시옹리옹</author>
      <guid isPermaLink="true">https://sr-dev.tistory.com/24</guid>
      <comments>https://sr-dev.tistory.com/24#entry24comment</comments>
      <pubDate>Mon, 27 Nov 2023 21:03:35 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스]나머지가 1이 되는 수 찾기 - 자바 Java + 접근 방식</title>
      <link>https://sr-dev.tistory.com/23</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1118&quot; data-origin-height=&quot;1648&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMYo7L/btsA2sNsPqZ/c7M8TYkFgZasU8PJiYyAO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMYo7L/btsA2sNsPqZ/c7M8TYkFgZasU8PJiYyAO1/img.png&quot; data-alt=&quot;프로그래머스&amp;amp;amp;nbsp;https://school.programmers.co.kr/learn/courses/30/lessons/87389&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMYo7L/btsA2sNsPqZ/c7M8TYkFgZasU8PJiYyAO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMYo7L%2FbtsA2sNsPqZ%2Fc7M8TYkFgZasU8PJiYyAO1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;536&quot; height=&quot;790&quot; data-origin-width=&quot;1118&quot; data-origin-height=&quot;1648&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;프로그래머스&amp;amp;nbsp;https://school.programmers.co.kr/learn/courses/30/lessons/87389&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;'n을 x로 나눈 나머지가 1이 되도록하는 가장 작은 자연수 x'&lt;/u&gt;를 구하는 문제입니다.&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;접근 방식&lt;/b&gt;&amp;nbsp;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt; x는 1보다 큰 자연수여야 합니다. n을 1로 나누면 나머지가 항상 0이기 때문입니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;x를 2부터 시작하여 n보다 작은 동안 반복합니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;각 반복에서 n%x가 1이 되는지 확인합니다. 만약 1이라면 그 x가 result 입니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;n%x가 1이 되는 가장 작은 자연수 x을 반환합니다.&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1701079922891&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public int solution(int n) {
        for(int x = 2; x &amp;lt; n; x++) {
            if(n % x == 1) {
                return x;
            }
        }
        return n - 1;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>문제/프로그래머스</category>
      <category>프로그래머스</category>
      <author>시옹리옹</author>
      <guid isPermaLink="true">https://sr-dev.tistory.com/23</guid>
      <comments>https://sr-dev.tistory.com/23#entry23comment</comments>
      <pubDate>Mon, 27 Nov 2023 19:17:47 +0900</pubDate>
    </item>
    <item>
      <title>[네트워크]간단한 TCP/IP 4계층 설명</title>
      <link>https://sr-dev.tistory.com/22</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;TCP/IP 4계층 모델&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터넷 프로토콜 스위트(internet protocol suite)는 인터넷에서 컴퓨터들이 서로 정보를 주고받는 데 쓰이는 프로토콜의 집합이며 이를 TCP/IP 4계층 모델로 설명하거나 OSI 7 계층 모델로 설명하기도 합니다. &lt;u&gt;TCP/IP 4계층&lt;/u&gt; 모델에 대해서 적어볼까 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 계층 모델은 &lt;u&gt;네트워크에서 사용되는 통신 프로토콜의 집합&lt;/u&gt;으로 계층들은 프로토콜의 네트워킹 범위에 따라 네 개의 추상화 계층으로 구성됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;계층 구조&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;418&quot; data-origin-height=&quot;429&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IwPAD/btsAWkazx4P/tEi7bk0c8JHkWVpTchXMXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IwPAD/btsAWkazx4P/tEi7bk0c8JHkWVpTchXMXk/img.png&quot; data-alt=&quot;계층 구조 made by 시옹리옹&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IwPAD/btsAWkazx4P/tEi7bk0c8JHkWVpTchXMXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIwPAD%2FbtsAWkazx4P%2FtEi7bk0c8JHkWVpTchXMXk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;505&quot; height=&quot;518&quot; data-origin-width=&quot;418&quot; data-origin-height=&quot;429&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;계층 구조 made by 시옹리옹&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;애플리케이션(Application) 계층&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;FTP : 장치와 장치 간의 파일을 전송하는 데 사용되는 표준 통신 프로토콜&lt;/li&gt;
&lt;li&gt;HTTP : World Wide Web을 위한 데이터 통신의 기초이자 웹 사이트를 이용하는 데 쓰는 프로토콜&amp;nbsp;&lt;/li&gt;
&lt;li&gt;SSH : 보안되지 않은 네트워크에서 네트워크 서비스를 안전하게 운영하기 위한 암호화 네트워크 프로토콜&lt;/li&gt;
&lt;li&gt;SMTP : 전자 메일 전송을 위한 인터넷 표준 통신 프로토콜&lt;/li&gt;
&lt;li&gt;DNS : 도메인 이름과 IP 주소를 매핑해주는 서버, 예를 들어 www.naver.com에 DNS 쿼리가 오면 &lt;br /&gt;Root DNS -&amp;gt; .com DNS -&amp;gt; .naver DNS -&amp;gt; .www DNS 과정을 거쳐 완벽한 주소를 찾아 IP 주소를 매핑합니다.&amp;nbsp;&lt;br /&gt;이를 통해 IP 주소가 바귀어도 사용자들에게 똑같은 도메인 주소로 서비스할 수 있습니다. 예를 들어 www.naver.com의 IP 주소가 222.111.222.111에서 222.111.222.122로 바뀌었음에도 똑같은 www.naver.com이라는 주소로 서비스가 가능합니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;등.. 애플리케이션 계층은 응용 프로그램이 사용되는 프로토콜 계층이며 웹 서비스, 이메일 등 서비스를 실질적으로 사람들에게 제공하는 층입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;전송(Transport) 계층&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;송신자와 수신자를 연결하는 통신 서비스를 제공하며 연결 지향 데이터 스트림 지원, 신뢰성, 흐름 제어를 제공할 수 있으며 애플리케이션과 인터넷 계층 사이의 데이터가 전달될 때 중계 역할을 합니다. 대표적으로 TCP와 UDP가 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TCP는 패킷 사이의 순서를 보장하고 연결지향 프로토콜을 사용해서 연결을 하여 신뢰성을 구축해서 수신 여부를 확인하며 '가상회선 패킷 교환 방식'을 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UDP는 순서를 보장하지 않고 수신 여부를 확인하지 않으며 단순히 데이터만 주는 '데이터그램 패킷 교환 방식'을 사용합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;인터넷(Internet) 계층&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장치로부터 받은 네트워크 패킷을 IP주소로 지정된 목적지로 전송하기 위해 사용되는 계층입니다. IP, ARP, ICMP 등이 있으며 패킷을 수신해야 할 상대의 주소를 지정하여 데이터를 전달합니다. 상대방이 제대로 받앗는지에 대해 보장하지 않는 비연결형적인 특징을 가지고 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;링크(Link) 계층&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전선, 광섬유, 무선 등으로 실질적으로 데이터를 전달하며 장치 간에 신호를 주고받는 '규칙'을 정하는 계층입니다. 참고로 네트워크 접근 계층이라고도 합니다. 이를 물리 계층과 데이터 링크 계층으로 나누기도 하는데 물리 계층은 무선 LAN과 유선LAN을 통해 0과 1로 이루어진 데이터를 보내는 계층을 말하며, 데이터 링크 계층은 '이더넷 프레임'을 통해 에러 확인, 접근 제어를 담당하는 계층을 말합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;유선 LAN(IEEE802.3) : 유선 LAN을 이루는 이더넷은 IEEE802.3이라는 프로토콜을 따르며 전이중화 통신을 씁니다.&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전이중화(Full duplex) 통신 : 양쪽 장치가 동시에 송수신할 수 있는 방식을 말합니다. 이는 송신로와 수신로로 나눠서 데이터를 주고받으며 현대의 고속 이더넷은 이 방식을 기반으로 통신하고 있습니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;무선 LAN(IEEE802.11) : 무선 LAN 장치는 수신과 송신에 같은 채널을 사용하기 때문에 반이중화 통신을 사용합니다.&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;반이중화(Half duplex) 통신 : 양쪽 장치는 서로 통신할 수 있지만 동시에는 통신할 수 없으며 한 번에 한 방향만 통신할 수 있는 방식을 말합니다. 일반적으로 장치가 신호를 신하기 시작하면 응답하기 전에 전송이 완료될 때까지 기다려야 합니다. 또한 둘 이상의 장치가 동시에 전송하면 충돌이 발생하여 메시지가 손실되거나 왜곡될 수 있기 때문에 충돌 방지 시스템이 필요합니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>리뷰노트/네트워크</category>
      <category>TCP/IP</category>
      <category>tcp/ip 4계층</category>
      <category>네트워크기초</category>
      <author>시옹리옹</author>
      <guid isPermaLink="true">https://sr-dev.tistory.com/22</guid>
      <comments>https://sr-dev.tistory.com/22#entry22comment</comments>
      <pubDate>Sun, 26 Nov 2023 20:16:24 +0900</pubDate>
    </item>
    <item>
      <title>[네트워크]네트워크의 기초(처리량, 지연 시간, 네트워크 토폴로지, 병목현상)</title>
      <link>https://sr-dev.tistory.com/21</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;네트워크&lt;/u&gt;는 컴퓨터 등의 장치들이 통신 기술을 이용하여 구축하는 연결망을 지칭하는 용어입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;네트워크&lt;/span&gt;란?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;노드(node)와 링크(link)가 서로 연결되어 있으며 리소스를 공유하는 집합을 의미합니다.&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;노드란 서버, 라우터, 스위치 등 네트워크 장치를 의미하고 링크는 유선 또는 무선을 의미합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;처리량&lt;/span&gt;과 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;지연 시간&lt;/span&gt;&amp;nbsp;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;좋은 네트워크란? - 많은 처리량을 처리할 수 있으며 지연 시간이 짧고 장애 빈도가 적으며 좋은 보안을 갖춘 네트워크를 말합니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;u&gt;처리량&lt;/u&gt;&lt;/b&gt;은 링크 내에서 성공적으로 전달된 데이터의 양을 말하며 보통 얼만큼의 트래픽을 처리했는지를 나타냅니다.&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;'많은 트래픽을 처리한다.' == '많은 처리량을 가진다'&lt;/li&gt;
&lt;li&gt;사용자들이 많이 접속할 때마다 커지는 트래픽, 네트워크 장치 간의 대역폭, 네트워크 중간에 발생하는 에러, 장치의 하드웨어 스펙에 많은 영향을 받습니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;트래픽은 특정 시점에 링크 내에 '흐르는' 데이터의 양을 말합니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;트래픽이 많아졌다. == 흐르는 데이터가 많아졌다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;처리량이 많아졌다. == 처리되는 트래픽이 많아졌다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;u&gt;지연 시간&lt;/u&gt;&lt;/b&gt; 이란 요청이 처리되는 시간을 말하며 어떤 메시지가 두 장치 사이를 왕복하는 데 걸리는 시간을 말합니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;지연 시간은 매체 타입(무선, 유선), 패킷 크기, 라우터의 패킷 처리 시간에 영향을 받습니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;네트워크 토폴로지와 병목 현상&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;u&gt;네트워크 토폴로지&lt;/u&gt;&lt;/b&gt;(네트워크 설계 시 고려하는 네트워크 토폴로지)란 노드와 링크가 어떻게 배치되어 있는지에 대한 방식이자 연결 형태를 말합니다.&amp;nbsp;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;트리 토폴로지&lt;/b&gt;란 계층형 토폴로지라고 하며 트리 형태로 배치한 네트워크 구성을 말합니다. &lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;노드의 추가, 삭제가 쉬우며 특정 노드에 트래픽이 집중될 때 하위 노드에 영향을 끼칠 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;버스 토폴로지&lt;/b&gt;란 중앙 통신 회선 하나에 여러 개의 노드가 연결되어 공유하는 네트워크 수성을 말하며 근거리 통신망(LAN)에서 사용합니다. &lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;설치 비용이 적고 신뢰성이 우수하며 중앙 통신 회선에 노드를 추가하거나 삭제하기 쉽습니다. &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;But, &lt;u&gt;스푸핑&lt;/u&gt; 가능한 문제점이 있습니다.&amp;nbsp;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;u&gt;스푸핑&lt;/u&gt;은 LAN상에서 송신부의 패킷을 송신과 관련 없는 다른 호스트에 가지 않도록 하는 스위칭 기능을 마비시키거나 속여서 특정 노드에 해당 패킷이 오도록 처리하는 것을 말합니다. 스푸핑을 적용하면 올바르게 수신부로 가야할 패킷이 악의적인 노드에 전달되게 됩니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;스타 토폴로지&lt;/b&gt;란 &lt;span style=&quot;text-align: left;&quot;&gt;중앙에 있는 노드에 모두 연결된 네트워크 구성을 말합니다. &lt;/span&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;노드를 추가하거나 에러를 탐지하기 쉽고 패킷의 충동 발생 가능성이 적습니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;어떠한 노드에 장애가 발생해도 쉽게 에러를 발견할 수 있으며 장애 노드가 중앙 노드가 아닐 경우 다른 노드에 영향이 끼치는 것이 적습니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;But, 중앙 노드에 장애가 발생하면 전체 네트워크를 사용할 수 없고 설치 비용이 고가입니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;링형 토폴로지&lt;/b&gt;란 각각의 노드가 양 옆의 두 노드와 연결하여 전체적으로 고리처럼 하나의 연속된 길을 통해 통신을 하는 망 구성 방식입니다.&amp;nbsp;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;데이터는 노드에서 노드로 이동을 하게 되며, 각각의 노드는 고리 모양의 길을 통해 패킷을 처리합니다. &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;노드 수가 증가되어도 네트워크상의 손실이 거의 없고 충돌이 발생되는 가능성이 적고 노드의 고장을 쉽게 발생할 수 있습니다. &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;But, 네트워크 구성 변경이 어렵고 회선에 장애가 발생하면 전체 네트워크에 영향을 크게 끼치는 단점이 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;메시 토폴로지&lt;/b&gt;란 망형 토폴로지라고도 하며 그물망처럼 연결되어 있는 구조입니다.&amp;nbsp;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;한 단말 장치에 장애가 발생해도 여러 개의 경로가 존재하므로 네트워크를 계속 사용할 수 있고 트래픽도 분산 처리가 가능합니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;But, 노드의 추가가 어렵고 구축 비용과 운용 비용이 고가인 단점이 있습니다. &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;u&gt;병목(Bottleneck) 현상&lt;/u&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이란 전체 시스템의 성능이나 용량이 하나의 구성 요소로 인해 제한을 받는 현상을 말합니다.&amp;nbsp;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;네트워크의 구조라고도 일컫는 토폴로지가 중요한 이유는 병목 현상을 찾을 때 중요한 기준이 되기 때문입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;예를 들어 서비스를 만들었는데 병목 현상이 일어나서 사용자가 서비스를 이용할 때 지연 시간이 길게 발생하고 관리자가 지연 시간을 짧게 만들기 위해 대역폭을 크게 설정했음에도 성능이 개선되지 않았을 경우&amp;nbsp;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&amp;nbsp;관리자가 네트워크 토폴로지가 어떻게 되어 있는지 확인, 서버와 서버 간 그리고 게이트웨이로 이어지는 회선을 추가해서 병목 현상 해결할 수 있습니다. 네트워크가 어떠 토폴로지를 갖는지, 또한 어떠한 경로로 이루어져 있는지 알아야 병목 현상을 올바르게 해결 할 수 있습니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>리뷰노트/네트워크</category>
      <category>네트워크</category>
      <category>네트워크 기초</category>
      <category>병목현상</category>
      <category>토폴로지</category>
      <author>시옹리옹</author>
      <guid isPermaLink="true">https://sr-dev.tistory.com/21</guid>
      <comments>https://sr-dev.tistory.com/21#entry21comment</comments>
      <pubDate>Fri, 24 Nov 2023 23:48:34 +0900</pubDate>
    </item>
    <item>
      <title>[기술면접리뷰]개발자 면접(기술면접, 기술 외 질문)</title>
      <link>https://sr-dev.tistory.com/20</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;기술면접때 들어본 질문들 정리&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;u&gt;&lt;b&gt;기술면접&lt;/b&gt;&lt;/u&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;Spring WebFlux 란?&lt;/span&gt;&lt;br /&gt;Spring Framework 5에서 도입된 반응형 프로그래밍을 위한 모듈입니다. &lt;u&gt;비동기적&lt;/u&gt;이고 &lt;u&gt;논블로킹&lt;/u&gt; 방식으로 서버 사이드 애플리케이션을 개발할 수 있게 해주며, 더 많은 요청을 더 효율적으로 처리할 수 있도록 설계되었습니다. WebFlux는 Spring의 기존 어노테이션 기반 프로그래밍 모듈과 함수형 스타일의 프로그래밍 모델을 모두 지원합니다.&amp;nbsp;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;[꼬리질문]리액티브 프로그래밍이란? &lt;/span&gt;&lt;br /&gt;비동기 데이터 흐름과 변경의 전파에 중점을 두는 프로그래밍 패러다임입니다. 이는 데이터 스트림과 그 데이터에 의해 발생하는 변화를 쉽게 표현하고 관리할 수 있도록 합니다. 리액티브 프로그래밍은 시스템이 보다 탄력적이고 반응성이 뛰어나며 유지 관리가 용이하도록 돕습니다. 즉, 데이터의 흐름에 초점을 맞춰서 동작하며 리액티브 프로그래밍을 하면서 데이터를 비동기적으로 처리하고 이벤트 기반 아키텍처를 통해 실시간으로 데이터의 변화에 반응할 수 있게 프로그래밍이 가능합니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;사용해 본 가장 낮은 버전 Java?&lt;/li&gt;
&lt;li&gt;사용해 본 DB?&lt;br /&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;[꼬리질문]RDMS, NoSQL 장단점?&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;u&gt;RDMS&lt;/u&gt;(관계형 데이터베이스 시스템) 란&lt;br /&gt;관계형 데이터베이스를 생성, 업데이트, 관리하는 시스템입니다. 관계형 데이터베이스는 데이터를 테이블 형식으로 저장하며 이 테이블들은 행과 열로 구성됩니다. 각 행은 고유한 키를 가지며 서로 다른 테이블 간에는 키를 통해 관계를 맺을 수 있습니다.&amp;nbsp;&lt;br /&gt;&lt;u&gt;장점&lt;/u&gt;은 정규화된 데이터 구조, 복잡한 쿼리와 트랜잭션 지원, 데이터 무결성 보장이 있고&amp;nbsp;&lt;br /&gt;&lt;u&gt;단점&lt;/u&gt;으로는 수평적 확장이 어렵고 대용량 데이터 처리에 한계가 있을 수 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;NoSQL&lt;/u&gt; 란&lt;br /&gt;비관계형 또는 비SQL 데이터베이스를 위한 용어로 관계형 모델을 사용하지 않거나 이와 다른 방식으로 데이터를 저장합니다. NoSQL 데이터베이스는 다양한 데이터 저장 방식을 제공하며 대규모 분산 데이터의 저장과 빠른 쿼리 처리에 적합합니다.&amp;nbsp;&lt;br /&gt;&lt;u&gt;장점&lt;/u&gt;은 빠른 읽기,쓰기 성능 그리고 유연한 데이터 모델과 수평적 확장이 용이합니다.&lt;br /&gt;&lt;u&gt;단점&lt;/u&gt;으로는 표준화된 쿼리 언어 부재 그리고 일부는 트랜잭션 처리가 제한적입니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Oracle 의 SELECT 문의 실행 순서?&amp;nbsp;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;FROM 절&lt;br /&gt;먼저,&amp;nbsp;FROM&amp;nbsp;절이&amp;nbsp;처리됩니다.&amp;nbsp;이&amp;nbsp;단계에서는&amp;nbsp;쿼리에서&amp;nbsp;참조하는&amp;nbsp;테이블이나&amp;nbsp;뷰가&amp;nbsp;결정됩니다.&lt;br /&gt;조인이 있는 경우, 여기서 관련된 테이블 간의 조인이 수행됩니다.&lt;/li&gt;
&lt;li&gt;WHERE 절&lt;br /&gt;WHERE&amp;nbsp;절은&amp;nbsp;FROM&amp;nbsp;절에서&amp;nbsp;지정된&amp;nbsp;테이블의&amp;nbsp;데이터&amp;nbsp;중에서&amp;nbsp;조건에&amp;nbsp;맞는&amp;nbsp;행을&amp;nbsp;필터링합니다.&lt;/li&gt;
&lt;li&gt;GROUP BY 절&lt;br /&gt;GROUP&amp;nbsp;BY&amp;nbsp;절은&amp;nbsp;WHERE&amp;nbsp;절을&amp;nbsp;통과한&amp;nbsp;데이터를&amp;nbsp;특정&amp;nbsp;기준에&amp;nbsp;따라&amp;nbsp;그룹화합니다.&lt;br /&gt;이 단계는 집계 함수(Aggregate Functions)와 함께 사용되어 각 그룹에 대한 합계, 평균 등의 집계 결과를 생성합니다.&lt;/li&gt;
&lt;li&gt;HAVING 절&lt;br /&gt;GROUP&amp;nbsp;BY를&amp;nbsp;통해&amp;nbsp;생성된&amp;nbsp;그룹에&amp;nbsp;대해&amp;nbsp;추가적인&amp;nbsp;필터링을&amp;nbsp;수행합니다.&lt;br /&gt;WHERE 절과 비슷하지만, GROUP BY로 생성된 그룹에 대한 조건을 지정하는 데 사용됩니다.&lt;/li&gt;
&lt;li&gt;SELECT 절&lt;br /&gt;SELECT&amp;nbsp;절은&amp;nbsp;최종적으로&amp;nbsp;출력할&amp;nbsp;컬럼을&amp;nbsp;결정합니다.&lt;br /&gt;이 단계에서는 컬럼 이름이나 출력할 데이터에 대한 계산(예: 컬럼 간의 연산, 문자열 함수 사용 등)이 이루어집니다.&lt;/li&gt;
&lt;li&gt;DISTINCT 절&lt;br /&gt;SELECT 절 다음에 오는 DISTINCT 키워드는 중복된 결과를 제거하여 유니크한 결과만을 출력합니다.&lt;/li&gt;
&lt;li&gt;ORDER BY 절&lt;br /&gt;ORDER&amp;nbsp;BY&amp;nbsp;절은&amp;nbsp;최종&amp;nbsp;결과&amp;nbsp;집합의&amp;nbsp;행을&amp;nbsp;특정&amp;nbsp;컬럼을&amp;nbsp;기준으로&amp;nbsp;정렬합니다.&lt;br /&gt;이는 쿼리의 마지막 단계에서 수행되며, 출력되는 데이터의 순서를 결정합니다.&lt;/li&gt;
&lt;li&gt;OFFSET/FETCH 절&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;사용됩니다.&lt;br /&gt;주로&amp;nbsp;페이징&amp;nbsp;처리에&amp;nbsp;사용됩니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;DI의 장단점?&amp;nbsp;&lt;/span&gt;&lt;br /&gt;장점으로는 객체 간의 의존성이 감소하고 유닛 테스트 용이, 그리고 코드 재사용성 및 유지 보수성 향상이 있습니다.&lt;br /&gt;단점은 오버헤드가 증가하고 디버깅의 복잡성이 증가합니다.&amp;nbsp;&lt;br /&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;u&gt;오버헤드 증가란?&lt;/u&gt;&amp;nbsp;-&amp;gt; DI를 위한 프레임워크는 런타임에 추가적인 오버헤드를 발생시킬 수 있습니다. 의존성 해결, 객체 생성 및 관리 등이 이에 해당됩니다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;디버깅의 복잡성 증가란?&lt;/u&gt; -&amp;gt; 의존성이 외부에서 주입되므로 시스템이 커지고 복잡해질수록 어떤 객체가 어떻게 연결되어 있는지 추적하기 어려워질 수 있습니다.&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;IOC 와 DI 란?
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;u&gt;IOC&lt;/u&gt;(제어의 역전)&lt;br /&gt;제어의 역전(IoC)란 모든 객체에 대한(생성, 라이프사이클 등) 제어권을 개발자가 아닌 IoC 컨테이너에게 넘긴 것을 말합니다.&lt;/li&gt;
&lt;li&gt;&lt;u&gt;DI(Dependency Injection)&lt;/u&gt;&lt;br /&gt;&lt;span&gt;DI는 의존성 주입의 약자로, 객체들 간의 의존성을 줄이기 위해 사용되는 스프링의 IOC 컨테이너의 구체적 구현 방식을&lt;span&gt;&amp;nbsp;&lt;/span&gt;말합니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span&gt;추상클래스와 인터페이스란&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;&lt;u&gt;추상클래스&lt;/u&gt;(Abstract&amp;nbsp;Class)&lt;br /&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;클래스 내에 추상 메소드가 하나 이상 포함되거나 abstract로 정의된 경우를 말합니다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;상속받는 클래스들의 공통적인 로직을 추상화 시키고 기능 확장을 위해 사용합니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;다중상속이 불가능하지만 인터페이스는 다중상속이 가능합니다.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;u&gt;인터페이스&lt;/u&gt;(Interface)&lt;br /&gt;모든 메소드가 추상 메소드로만 이루어져 있는 것을 말합니다.&amp;nbsp;&lt;br /&gt;클래스가&amp;nbsp;인터페이스를&amp;nbsp;구현하면&amp;nbsp;인터페이스에&amp;nbsp;선언된&amp;nbsp;모든&amp;nbsp;메소드를&amp;nbsp;구현해야&amp;nbsp;합니다.&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;있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;사용해 본 프론트 프레임워크?&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;tcp, http 차이점?&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;u&gt;TCP&lt;/u&gt;(Transmission Control Protocol)&lt;br /&gt;전송 계층의 핵심 프로토콜이며 데이터의 정확한 전송을 보장합니다.&amp;nbsp;&lt;br /&gt;그리고 연결 지향적 프로토콜이며 데이터 패킷 손실 시 재전송합니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;u&gt;HTTP&lt;/u&gt;(Hypertext Transfer Protocol)&lt;br /&gt;애플리케이션 계층의 프로토콜이며 웹 데이터 교환 표준입니다.&amp;nbsp;&lt;br /&gt;TCP 위에서 작동하며 주로 웹 브라우저와 서버 간 통신에 사용합니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;u&gt;기술 외 질문&lt;/u&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;지원동기&lt;/li&gt;
&lt;li&gt;개발자라는 직업을 선택한 계기&lt;/li&gt;
&lt;li&gt;일하면서 가장 힘들었던 경험&amp;nbsp;&lt;/li&gt;
&lt;li&gt;자신의 장단점&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>리뷰노트/기술면접</category>
      <category>개발자 기술면접</category>
      <category>기술면접</category>
      <author>시옹리옹</author>
      <guid isPermaLink="true">https://sr-dev.tistory.com/20</guid>
      <comments>https://sr-dev.tistory.com/20#entry20comment</comments>
      <pubDate>Thu, 23 Nov 2023 18:00:22 +0900</pubDate>
    </item>
    <item>
      <title>[Java]짧게 훑어보는 Java 간단 지식(Java란, 컴파일 과정, JVM, GC, 메모리 영역)</title>
      <link>https://sr-dev.tistory.com/19</link>
      <description>&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;*제목 그대로 Java의 기본적인 지식을 짧게 되새김 할려고 합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;Java&lt;/u&gt;&lt;/span&gt; 란&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;객체지향 프로그래밍 언어입니다.&lt;/li&gt;
&lt;li&gt;기본 자료형을 제외한 모든 요소들이 객체로 표현되고, 객체 지향의 특징인 캡슐화, 상속, 다형성이 잘 적용된 언어입니다.&lt;/li&gt;
&lt;li&gt;JVM(자바가상머신) 위에서 동작하기 때문에 운영체제에 독립적이라는 장점을 갖고있습니다. (반대로 JVM 위에서 동작하기 때문에 실행속도가 상대적으로 느리다는 단점을 가지고 있습니다.)&lt;/li&gt;
&lt;li&gt;GC(Garbage Collector)를 통한 자동적인 메모리 관리가 가능합니다.&lt;/li&gt;
&lt;li&gt;다중 상속이나 타입에 엄격하며 제약이 많습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;Java 컴파일 과정&lt;/u&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;개발자가 .java 파일을 생성 후&lt;/li&gt;
&lt;li&gt;build 를 합니다.&lt;/li&gt;
&lt;li&gt;그러면 Java compiler의 javac 명령어를 통해 .class 파일(byte code)이 생성됩니다.&lt;/li&gt;
&lt;li&gt;Class Loader를 통해 JVM 메모리 내로 로드합니다.&lt;/li&gt;
&lt;li&gt;실행엔진을 통해 컴퓨터가 읽을 수 있는 기계어로 해석됩니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;JVM&lt;/u&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스택 기반으로 동작하며 Java Byte Code를 OS에 맞게 해석해주고 GC를 통해 자동적인 메모리 관리를 해줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;GC&lt;/u&gt;&lt;/span&gt;(Garbage Collection)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JVM의 메모리 관리 기법 중 하나로 시스템에서 동적으로 할당됐던 메모리 영역 중에서 필요없어진 메모리 영역을 회수하여 메모리를 관리해주는 기법입니다.&lt;/li&gt;
&lt;li&gt;GC 과정 : JVM이 어플리케이션의 실행을 잠시 멈추고 GC를 실행하는 쓰레드를 제외한 모든 쓰레드를 중단 후 사용하지 않는 메모리를 제거하고 다시 작업이 재개됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;Java의 메모리 영역&lt;/u&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;크게 Method(메소드), Stack(스택), Heap(힙) 영역으로 구분되고 데이터 타입에 따라 할당됩니다.&lt;/li&gt;
&lt;li&gt;&lt;u&gt;Method 영역&lt;/u&gt; : 전역변수와 static변수를 저장하며, Method영역은 프로그램의 시작부터 종료까지 메모리에 남아있습니다.&lt;/li&gt;
&lt;li&gt;&lt;u&gt;Stack 영역&lt;/u&gt; : 지역변수와 매개변수 데이터 값이 저장되는 공간이며, 메소드가 호출될 때 메모리에 할당되고 종료되면 메모리가 해제됩니다. LIFO(Last In First Out) 구조를 갖고 변수에 새로운 데이터가 할당되면 이전 데이터는 지워집니다.&lt;/li&gt;
&lt;li&gt;&lt;u&gt;Heap 영역&lt;/u&gt; : new 키워드로 생성되는 객체(인스턴스), 배열 등이 Heap 영역에 저장되며, 가비지 컬렉션에 의해 메모리가 관리됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>리뷰노트/Java</category>
      <category>gc</category>
      <category>java</category>
      <category>Java 기본지식</category>
      <category>Java 메모리영역</category>
      <category>JAVA란</category>
      <category>JVM</category>
      <author>시옹리옹</author>
      <guid isPermaLink="true">https://sr-dev.tistory.com/19</guid>
      <comments>https://sr-dev.tistory.com/19#entry19comment</comments>
      <pubDate>Tue, 21 Nov 2023 20:39:43 +0900</pubDate>
    </item>
  </channel>
</rss>