<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>new-pow</title>
        <link>https://velog.io/</link>
        <description>저는 블로그 이사를 갔습니다</description>
        <lastBuildDate>Wed, 09 Nov 2022 09:59:46 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>new-pow</title>
            <url>https://velog.velcdn.com/images/woozu-in/profile/33bfbe4e-06f3-4e33-9239-ded4f2d1f014/social_profile.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. new-pow. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/woozu-in" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[CodingTest: programmers 64061 크레인 인형뽑기 게임]]></title>
            <link>https://velog.io/@woozu-in/CodingTest-programmers-64061-%ED%81%AC%EB%A0%88%EC%9D%B8-%EC%9D%B8%ED%98%95%EB%BD%91%EA%B8%B0-%EA%B2%8C%EC%9E%84</link>
            <guid>https://velog.io/@woozu-in/CodingTest-programmers-64061-%ED%81%AC%EB%A0%88%EC%9D%B8-%EC%9D%B8%ED%98%95%EB%BD%91%EA%B8%B0-%EA%B2%8C%EC%9E%84</guid>
            <pubDate>Wed, 09 Nov 2022 09:59:46 GMT</pubDate>
            <description><![CDATA[<h1 id="👿-문제">👿 문제</h1>
<h2 id="문제-설명">문제 설명</h2>
<blockquote>
<p>...
게임 화면의 격자의 상태가 담긴 2차원 배열 board와 인형을 집기 위해 크레인을 작동시킨 위치가 담긴 배열 moves가 매개변수로 주어질 때, 크레인을 모두 작동시킨 후 터트려져 사라진 인형의 개수를 return 하도록 solution 함수를 완성해주세요.</p>
</blockquote>
<h2 id="제한-사항">제한 사항</h2>
<ul>
<li><p>board 배열은 2차원 배열로 크기는 &quot;5 x 5&quot; 이상 &quot;30 x 30&quot; 이하입니다.</p>
</li>
<li><p>board의 각 칸에는 0 이상 100 이하인 정수가 담겨있습니다.</p>
<ul>
<li>0은 빈 칸을 나타냅니다.</li>
<li>1 ~ 100의 각 숫자는 각기 다른 인형의 모양을 의미하며 같은 숫자는 같은 모양의 인형을 나타냅니다.</li>
</ul>
</li>
<li><p>moves 배열의 크기는 1 이상 1,000 이하입니다.</p>
</li>
<li><p>moves 배열 각 원소들의 값은 1 이상이며 board 배열의 가로 크기 이하인 자연수입니다.</p>
</li>
<li><p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/64061">크레인 인형뽑기 게임</a></p>
</li>
</ul>
<h1 id="🔍-접근-방법">🔍 접근 방법</h1>
<h2 id="첫-번째-시도">첫 번째 시도</h2>
<p> 보자마자 일단 어려운 문제구나 싶었지만🥲 문제를 읽을 수록 구현할 기능만 정리 잘 하면 되겠구나 싶었다. 효율적인 방식은 그 이후에 고민하기로 하하.. 2차원 배열을 탐색해야하며, 재귀함수를 통해 지금 탐색부분의 값이 없다면 더 깊에 탐색해 들어가야한다.
 일단 첫 번째 인상에서 필요한 기능은 다음과 같다.</p>
<ol>
<li>카운트 할 변수를 생성한다.</li>
<li>크레인이 move크기만큼 인형을 뽑는다.<ol>
<li>바구니(2차원 배열)에서 정해진 move 배열에 있는 수를 위(0)에서부터 탐색한다.<ol start="2">
<li>값이 0이라면 다음 배열에서 탐색한다.</li>
<li>값이 0이 아니라면 뽑은 인형 int를 반환한다.</li>
<li>만약 끝까지 탐색했는데 모두 0이라면 0을 반환한다. </li>
</ol>
</li>
</ol>
</li>
<li>뽑은 인형이 0이 아니라면 작은 바구니(int[])에 담는다.<ol>
<li>만약 바구니에 있는 마지막 값과 넣는 값이 같다면 둘다 터져서 없어진다.<ul>
<li>터진 갯수 카운트</li>
</ul>
</li>
<li>만약 같지 않다면 배열에 쌓인다.</li>
</ol>
</li>
<li>카운트를 출력한다.</li>
</ol>
<h2 id="의사-코드">의사 코드</h2>
<ul>
<li><p>인형 뽑기 메서드</p>
<pre><code class="language-java">public int 인형뽑기(int[][] board, int move, int deep) {
  탐색할 것 = board[deep][move];
  if (0이 아니라면) {
      해당 값을 뽑는다.
      그 자리는 0이 된다.
  }
  if (0이고 최대 깊이라면) {
      return 0
  }
  if (0이라면) {
      인형뽑기(더 깊이 가자);
  }
  return 인형
}</code></pre>
</li>
<li><p>인형 담기 메서드</p>
<pre><code class="language-java">// 인형이 0이 아니라면 실행한다.
public Stack&lt;Integer&gt; 인형담기(Stack&lt;integer&gt; 바구니, int 인형) {
  if (바구니 제일 위에 있는 것 == 인형) {
      // 바구니에서 빼버린다.
      바구니.pop()
  }
  if (바구니 제일 위에 있는 것 != 인형) {
      // 바구니에 넣는다.
      바구니.push()
  }
  return 바구니
}</code></pre>
</li>
<li><p>메인</p>
<pre><code class="language-java">class Solution {
  public int solution(int[][] board, int[] moves) {
      // 변수 선언

      for (move만큼 돌기) {
          인형뽑기();
          if(인형이 0이 아니라면) {
              인형담기();
          }
      }

      int answer = 담겨있는 인형 배열 길이;
      return answer;
  }
}</code></pre>
</li>
</ul>
<h2 id="첫-번째-시도-결과">첫 번째 시도 결과</h2>
<pre><code class="language-java">import java.util.*;

class Solution {
    public int solution(int[][] board, int[] moves) {
        Stack&lt;Integer&gt; basket = new Stack&lt;Integer&gt;();
        int count = 0;

        for (int move : moves) {
            int doll = getDoll(board, move-1, 0);
            if (doll != 0) {
                putDoll(basket, doll, count);
            }
        }

        int answer = count;

        return answer;
    }

    public static int getDoll(int[][] board, int move, int deep) {
        int search=0;
        while (search==0) {
            search = board[deep][move];
            if (search!=0) {
                board[deep][move] = 0;
                break;
            } else if (search==0 &amp;&amp; deep==board.length-1) {
                break;
            } else if (search==0) {
                deep ++;
            }
        }
        return search;
    }

    public static void putDoll(Stack&lt;Integer&gt; basket, int doll, int count) {
        if (basket.peek()==doll) {
            basket.pop();
            count++;
        }
        if (basket.peek()!=doll) {
            basket.add(doll);
        }
    }
}</code></pre>
<p> 위 코드는 에러가 났는데, 맨 처음 바구니가 비었을 때를 처리하지 못했기 때문이다.</p>
<pre><code class="language-java">Exception in thread &quot;main&quot; java.util.EmptyStackException
    at java.base/java.util.Stack.peek(Stack.java:101)
    at Solution.putDoll(Unknown Source)
    at Solution.solution(Unknown Source)
    at SolutionTest.lambda$main$0(Unknown Source)
    at SolutionTest$SolutionRunner.run(Unknown Source)
    at SolutionTest.main(Unknown Source)</code></pre>
<p> 결국은 IDE에서 디버깅해가면서 알아냈다. 아직 내 실력으로는 IDE 없이는 디버깅 하기 힘든 것 같다. 거기다 중간중간 자잘하게 잘못된 값을 출력하는 등의 오류가 있었다.
 심지어 중간에 문제를 잘 못 읽은 것을 깨달아서 (터진 횟수가 아니라 터진 갯수를 출력하는 문제였다.) 추가 삽질을 더해야 했다.</p>
<h1 id="💪-제출-결과">💪 제출 결과</h1>
<pre><code class="language-java">import java.util.*;

class Solution {
        public static int solution(int[][] board, int[] moves) {
        Stack&lt;Integer&gt; basket = new Stack&lt;&gt;();
        int count = 0;

        for (int move : moves) {
            int doll = getDoll(board, move-1, 0);
            if (doll != 0) {
                count = putDoll(basket, doll, count);
            }
        }

        return count;
    }

    public static int getDoll(int[][] board, int move, int deep) {
        int search=0;
        while (search==0) {
            search = board[deep][move];
            if (search!=0) {
                board[deep][move] = 0;
                break;
            } else if (search==0 &amp;&amp; deep==board.length-1) {
                break;
            } else if (search==0) {
                deep ++;
            }
        }
        return search;
    }

    public static int putDoll(Stack&lt;Integer&gt; basket, int doll, int count) {
        if (basket.isEmpty()) {
            basket.push(doll);
        } else if (basket.peek()==doll) {
            basket.pop();
            count += 2;
        } else if (basket.peek()!=doll) {
            basket.add(doll);
        }
        return count;
    }
}</code></pre>
<pre><code class="language-text">테스트 1 〉    통과 (0.13ms, 71.1MB)
테스트 2 〉    통과 (0.20ms, 74.2MB)
테스트 3 〉    통과 (0.15ms, 72.9MB)
테스트 4 〉    통과 (1.44ms, 74.6MB)
테스트 5 〉    통과 (0.14ms, 71MB)
테스트 6 〉    통과 (0.19ms, 73.9MB)
테스트 7 〉    통과 (0.23ms, 65.8MB)
테스트 8 〉    통과 (0.59ms, 77.8MB)
테스트 9 〉    통과 (0.46ms, 73.7MB)
테스트 10 〉    통과 (0.77ms, 79.7MB)
테스트 11 〉    통과 (1.01ms, 74.3MB)</code></pre>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[CodingTest: programmers 120910 나누어 떨어지는 숫자 배열]]></title>
            <link>https://velog.io/@woozu-in/CodingTest-programmers-120910-%EB%82%98%EB%88%84%EC%96%B4-%EB%96%A8%EC%96%B4%EC%A7%80%EB%8A%94-%EC%88%AB%EC%9E%90-%EB%B0%B0%EC%97%B4</link>
            <guid>https://velog.io/@woozu-in/CodingTest-programmers-120910-%EB%82%98%EB%88%84%EC%96%B4-%EB%96%A8%EC%96%B4%EC%A7%80%EB%8A%94-%EC%88%AB%EC%9E%90-%EB%B0%B0%EC%97%B4</guid>
            <pubDate>Wed, 09 Nov 2022 08:10:02 GMT</pubDate>
            <description><![CDATA[<h1 id="👿-문제">👿 문제</h1>
<h2 id="문제-설명">문제 설명</h2>
<pre><code class="language-text">array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요.
divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.</code></pre>
<h2 id="제한-사항">제한 사항</h2>
<pre><code class="language-text">arr은 자연수를 담은 배열입니다.
정수 i, j에 대해 i ≠ j 이면 arr[i] ≠ arr[j] 입니다.
divisor는 자연수입니다.
array는 길이 1 이상인 배열입니다.</code></pre>
<hr>
<h1 id="🔍-접근-방법">🔍 접근 방법</h1>
<h2 id="첫-시도">첫 시도</h2>
<p> 문제를 보자마자 이것은 출력하는 방식을 어떻게 하느냐가 중요한 문제라는 생각이 들었다. 배열은 리사이징이 불가능하기 때문에 연산할 때마다 배열을 카피해서 만들어주는 불상사를 겪고 싶지 않았다. 따라서 두개의 장치를 추가함으로써 첫번째 구현을 해볼까한다.</p>
<ol start="2">
<li><code>int cound</code> 변수로 나눠 떨어지는 숫자를 구한다.</li>
<li><code>int[] arr</code>를 한바퀴 체크한 후, 새로운 정답 배열을 만든다.</li>
<li>정답 배열을 정리한다.</li>
</ol>
<h3 id="의사코드">의사코드</h3>
<ul>
<li><p>아마도 시간 복잡도 최악의 경우 O(n^2)(<code>.sort</code>를 사용하기 때문에), 최선의 경우 O(n 될 것같다.</p>
<pre><code class="language-java">class Solution {
  public int[] solution(int[] arr, int divisor) {
      // 1. 변수 생성
      int count = 0;

      // 2. divisor로 나눠떨어지는 숫자 체크
      for (i가 arr크기만큼돌기) {
          if(나눠떨어지는가?) {
              boolean[i] = true; count ++;
          }
      }

      // 3-1. 만약 count가 0이라면 처리

      // 3-2. 0이 아니라면 정답 배열 생성
      int[] answer = new int[count];

      // 4. 정답 배열 채우기
      for (i가 arr크기만큼 돌기) {
          if(boolean[i]) {
              arr[i] 저장 
          }
      }

      // 5. 정렬하기

</code></pre>
</li>
</ul>
<pre><code>    return answer;
}</code></pre><p>}</p>
<pre><code>### 제출 결과
```java
import java.util.*;

class Solution {
    public int[] solution(int[] arr, int divisor) {
        int count = 0;
        int[] answer;

        for (int i=0; i&lt;arr.length; i++) {
            if (arr[i]%divisor==0) {
                count++;
            }
        }

        if (count==0) {
            answer = new int[1];
            answer[0] = -1;
        } else {
            answer = new int[count];
            int inputCount = 0;
            for (int i=0; i&lt;arr.length; i++) {
                if (arr[i]%divisor==0) {
                    answer[inputCount] = arr[i];
                    inputCount ++;
                }
            }

            Arrays.sort(answer);
        }

        return answer;
    }
}</code></pre><pre><code class="language-text">테스트 1 〉    통과 (0.41ms, 78.4MB)
테스트 2 〉    통과 (0.38ms, 74.8MB)
테스트 3 〉    통과 (0.37ms, 73.3MB)
테스트 4 〉    통과 (0.48ms, 74.6MB)
테스트 5 〉    통과 (0.39ms, 77.1MB)
테스트 6 〉    통과 (1.29ms, 80.7MB)
테스트 7 〉    통과 (0.09ms, 74.1MB)
테스트 8 〉    통과 (0.03ms, 77.9MB)
테스트 9 〉    통과 (0.65ms, 72.6MB)
테스트 10 〉    통과 (0.64ms, 72.3MB)
테스트 11 〉    통과 (0.36ms, 72.6MB)
테스트 12 〉    통과 (0.40ms, 72.9MB)
테스트 13 〉    통과 (0.17ms, 80MB)
테스트 14 〉    통과 (0.66ms, 77MB)
테스트 15 〉    통과 (0.55ms, 82.8MB)
테스트 16 〉    통과 (0.47ms, 76.7MB)</code></pre>
<hr>
<h2 id="두-번째-고민">두 번째 고민</h2>
<p> 위와 같이 제출 후 1점밖에 안올랐다..🥲 다들 얼마나 효율적으로 짰길래? 다른 사람들의 풀이를 염탐하러 갔다.</p>
<p>가장 충격적인 코드는 <code>Arrays.stream</code>와 람다를 활용한 간단한 한 줄짜리 코드였는데.. 속도면에서 효율은 떨어지는 것 같으나, 내가 모르던 메서드를 공부하는 의미로 조만간 추가로 정리해보기로!</p>
<blockquote>
<p><strong>👀 참고자료</strong></p>
<ul>
<li><a href="https://laugh4mile.tistory.com/175">[JAVA] 정렬에 대한 고찰 (Arrays.sort() 와 Collections.sort())</a></li>
<li><a href="https://hbase.tistory.com/171">[Java] 자바 스트림(Stream) 사용법 및 예제</a></li>
</ul>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[CodingTest: programmers 120806 두 수의 나눗셈]]></title>
            <link>https://velog.io/@woozu-in/CodingTest-programmers-120806-%EB%91%90-%EC%88%98%EC%9D%98-%EB%82%98%EB%88%97%EC%85%88</link>
            <guid>https://velog.io/@woozu-in/CodingTest-programmers-120806-%EB%91%90-%EC%88%98%EC%9D%98-%EB%82%98%EB%88%97%EC%85%88</guid>
            <pubDate>Wed, 09 Nov 2022 06:54:26 GMT</pubDate>
            <description><![CDATA[<p> 최근 프로그래머스 lv0이 새로 업데이트 되고 나서, 야금야근 풀어보고 있는 중이다.
 이 문제는 프로그래머스 lv0 중에서도 쉬운 문제라고 생각해서, 계획도 안세우고 자신있게 코드를 적어 실행했다. 돌아온건 차가운 에러 메시지 🥲...
 자바 기초 문법이 부족한 탓이라고 생각이 들어서 이 문제는 정리해보기로 한다.</p>
<h1 id="문제">문제</h1>
<ul>
<li>문제 설명<pre><code class="language-text">정수 num1과 num2가 매개변수로 주어질 때,
num1을 num2로 나눈 값에 1,000을 곱한 후
정수 부분을 return 하도록 soltuion 함수를 완성해주세요.</code></pre>
</li>
<li>제한 사항<pre><code class="language-text">0 &lt; num1 ≤ 100
0 &lt; num2 ≤ 100</code></pre>
</li>
<li>link : <a href="https://school.programmers.co.kr/learn/courses/30/lessons/120806">두 수의 나눗셈
</a></li>
</ul>
<h1 id="🔍-접근-방향">🔍 접근 방향</h1>
<p><strong>1. 나눗셈 연산의 데이터 타입은 double로</strong>
 문제를 보자마자 나눗셈 연산이 들어있으므로 <code>num1</code>을 <code>double</code>로 변환하여 풀기를 시도했다. 테스트 코드 실행하여 결과값을 얻었지만, 예상한 값과 도출된 값이 전혀 달랐다. <code>int answer</code> 변수에 저장하려면 다시 <code>int</code>로 형변환을 해야하는데, 그 변환 시점이 틀렸구나 싶어 다시 시도했다.</p>
<pre><code class="language-java">// 최초에 제출한 코드
class Solution {
    public int solution(int num1, int num2) {
        int answer = (int)((double)num1/num2) * 1000;
        return answer;
    }
}</code></pre>
<ol start="2">
<li>변수 따로 저장하지 않고 한줄로 구현했다.</li>
</ol>
<pre><code class="language-java">// 최종 제출한 답변
class Solution {
    public int solution(int num1, int num2) {
        int answer = (int)((double)num1/num2 * 1000);
        return answer;
    }
}</code></pre>
<h1 id="📝-추가-공부-사항">📝 추가 공부 사항</h1>
<h2 id="java-형변환">Java 형변환</h2>
<p> Java에는 다음 두 종류의 데이터 타입이 있다.</p>
<ol>
<li>Primitive Type<ul>
<li>자바에서 지원하는 기본 타입<ul>
<li>byte, short, int, long, float, double, boolean, char</li>
<li>클래스가 아니고, 상속으로 재가공이 불가능하다.</li>
</ul>
</li>
</ul>
</li>
<li>Reference Type<ul>
<li>클래스로 만들어지는 객체<ul>
<li>String, Wrapper class들.. 직접 만든 클래스들...</li>
</ul>
</li>
</ul>
</li>
</ol>
<p>그 중 Primitive Type에 대한 형 변환에 대해 추가로 공부해보고자 한다.</p>
<h2 id="primitive-type-casting">Primitive Type Casting</h2>
<p> Java의 Primitive Type들은 각각 표현할 수 있는 데이터의 크기가 다르다.
 따라서, 형변환 시 데이터가 손실되거나 손실되지 않을 수 있다.</p>
<table>
<thead>
<tr>
<th>종류</th>
<th>크기</th>
</tr>
</thead>
<tbody><tr>
<td>byte</td>
<td>8bit</td>
</tr>
<tr>
<td>short</td>
<td>16bit</td>
</tr>
<tr>
<td>int</td>
<td>32bit</td>
</tr>
<tr>
<td>long</td>
<td>64bit</td>
</tr>
<tr>
<td>float</td>
<td>32bit</td>
</tr>
<tr>
<td>double</td>
<td>64bit</td>
</tr>
<tr>
<td>char</td>
<td>16bit</td>
</tr>
</tbody></table>
<h3 id="더-큰-타입-👉-더-작은-타입">더 큰 타입 👉 더 작은 타입</h3>
<ul>
<li>(변환할타입)을 앞에 붙여 캐스팅을 해야한다.<pre><code class="language-java">int intNum = (int) floatNum;</code></pre>
</li>
</ul>
<h3 id="더-작은-타입-👉-더-큰-타입">더 작은 타입 👉 더 큰 타입</h3>
<ul>
<li>데이터가 손실되지 않으므로 그냥 할당할 수 있다.<pre><code class="language-java">float floatNum = intNum;</code></pre>
</li>
</ul>
<blockquote>
<p><strong>👀 참고</strong>
자바의 정석</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[OCI 배포 : 4. CentOS에 JDK 설치]]></title>
            <link>https://velog.io/@woozu-in/OCI-%EB%B0%B0%ED%8F%AC-4.-CentOS%EC%97%90-JDK-%EC%84%A4%EC%B9%98</link>
            <guid>https://velog.io/@woozu-in/OCI-%EB%B0%B0%ED%8F%AC-4.-CentOS%EC%97%90-JDK-%EC%84%A4%EC%B9%98</guid>
            <pubDate>Wed, 09 Nov 2022 04:13:27 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>M1 macOS Ventura 13.0 환경에서 작성되었습니다.</p>
</blockquote>
<h1 id="jdk가-없다니🥲">JDK가 없다니🥲</h1>
<p> 네이버 클라우드 플랫폼(이하 ncp)에서는 기본으로 JDK 1.8 버전과 Jenkins를 미리 설치를 해준다. 이것을 다른 서버를 사용하기로 하면서 여기서부터 새로 설치해줘야한다는 것을 처음 알고 멘붕이었다. Terminus로 접속한 서버 SSH에서부터 시작한다.
 <strong>만약 권한이 없다는 오류메시지가 뜬다면 앞에 <code>sudo</code>를 붙여 관리자 권한으로 실행한다.</strong></p>
<br>

<h1 id="jdk-설치">JDK 설치</h1>
<h2 id="설치-가능-버전-확인">설치 가능 버전 확인</h2>
<pre><code class="language-shell">sudo yum list java*jdk-devel</code></pre>
<p><em>약간 시간이 걸린다.</em>
<img src="https://velog.velcdn.com/images/woozu-in/post/5589b8ab-dce3-4349-882e-c125443c6ee0/image.png" alt=""></p>
<h2 id="특정-버전-설치">특정 버전 설치</h2>
<ul>
<li>여기서는 11로 설치했다.<pre><code class="language-shell">yum install java-11-openjdk-devel // 혹은
yum install java-11-openjdk-devel.x86_64</code></pre>
</li>
<li>중간에 설치여부 y/N를 확인하는 구간이 있다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/woozu-in/post/dd939e07-4e15-46a4-9b11-8b171cac1efc/image.png" alt=""></p>
<h3 id="설치된-버전-확인">설치된 버전 확인</h3>
<pre><code class="language-shell">java -version</code></pre>
<h3 id="자바-버전-교체">자바 버전 교체</h3>
<pre><code class="language-shell">sudo alternatives --config java // 이후 사용하려는 버전 번호를 누르고 Enter
sudo alternatives --config java // 기본 javac 버전 변경</code></pre>
<h2 id="java_home-환경-변수-설정">JAVA_HOME 환경 변수 설정</h2>
<pre><code class="language-shell">// javac 명령어 위치 확인
which javac

// 실제 경로 확인
readlink -f [javac 명령어 위치]
readlink -f /usr/bin/javac

// 파일 수정
sudo vi /etc/profile

// 맨 밑에 추가
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.15.0.10-3.el8.x86_64
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar

// 변경사항 적용
source /etc/profile

// 확인
echo $JAVA_HOME
$JAVA_HOME/bin/javac -version</code></pre>
<hr>
<h1 id="참고">참고</h1>
<ul>
<li><a href="https://anatolinicolae.com/failed-loading-plugin-osmsplugin-no-module-named-librepo/">에러메시지 ‘Failed loading plugin &quot;osmsplugin&quot;: No module named &#39;librepo’’의 경우</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[DataStructure: Tree]]></title>
            <link>https://velog.io/@woozu-in/DataStructure-Tree</link>
            <guid>https://velog.io/@woozu-in/DataStructure-Tree</guid>
            <pubDate>Tue, 08 Nov 2022 16:40:51 GMT</pubDate>
            <description><![CDATA[<h1 id="트리-tree">트리 Tree</h1>
<ul>
<li>부모 자식이 있는 구조</li>
<li>계층이 있고, 그룹이 있다.</li>
<li>더이상 자식이 없는 마지막 노드를 <code>leaf</code>라고 부른다.</li>
</ul>
<h2 id="🌳-트리의-종류">🌳 트리의 종류</h2>
<h3 id="⭐️-이진트리-binary-tree"><a href="https://velog.io/@woozu-in/DataStructure-Binary-Tree">⭐️ 이진트리 Binary Tree</a></h3>
<ul>
<li>자식 노드가 최대 2개까지만 붙는 트리</li>
<li>3개씩 붙는 트리 (Ternary tree), 4개씩 붙는 트리도 있다.</li>
<li>다른 노드 조건없음.</li>
</ul>
<h3 id="이진-탐색-트리-binary-search-tree">이진 탐색 트리 Binary Search Tree</h3>
<ul>
<li>왼쪽 노드와 그 이하 자식 노드들은 오른쪽 노드보다 더 작아야 한다.
<img src="https://velog.velcdn.com/images/woozu-in/post/51bec753-c9af-42f9-a95f-d3d4af76e938/image.png" alt=""></li>
</ul>
<h3 id="balaced--unbalanced">Balaced / Unbalanced</h3>
<ul>
<li>왼쪽 오른쪽 노드의 분포가 너무 한쪽으로 쏠리지 않았다면, Balaced</li>
<li>red-black tree</li>
<li>AVL tree</li>
</ul>
<h3 id="완전-이진-트리-complete-binary-tree">완전 이진 트리 Complete Binary Tree</h3>
<ul>
<li>모든 노드들이 레벨별로 왼쪽부터 채워져 있으면 완전 이진 트리</li>
<li>마지막 레벨을 제외한 모든 레벨이 다 채워져있고, 마지막 레벨은 왼쪽부터 채우기</li>
</ul>
<h3 id="full-binary-tree">Full Binary Tree</h3>
<ul>
<li>노드의 자식이 있다면 하나의 자식만 있으면 안된다. 자식이 둘 이거나 0이거나.</li>
</ul>
<h3 id="perfect-binary-tree">Perfect Binary Tree</h3>
<ul>
<li>완벽한 피라비드 형태의 이진 트리</li>
<li>레벨이 n일 때, 노드가 2^n-1개 있다.</li>
</ul>
<h2 id="🎄-트리-만들기">🎄 트리 만들기</h2>
<h3 id="노드-node">노드 Node</h3>
<ul>
<li>2진 트리 노드<pre><code class="language-java">class Node {
  int data;
  Node left; // 자식노드 왼쪽
  Node right; // 자식노드 오른쪽
}</code></pre>
</li>
</ul>
<h3 id="트리-tree-1">트리 Tree</h3>
<pre><code class="language-java">class Tree {
    public Node root; // 시작점
    public Node makeNode(Node left, int data, Node right) {
        Node node = new Node();
        node.data = data;
        node.left = left;
        node.right = right;
        return node;
    }
}</code></pre>
<h3 id="그래프-그리기">그래프 그리기</h3>
<ul>
<li>밑에서부터 그리자<pre><code class="language-java">Tree t = new Tree();
Node n4 = t.makeNode(null, 4, null);
Node n5 = t.makeNode(null, 5, null);
Node n2 = t.makeNode(n4, 2, n5);
Node n3 = t.makeNode(null, 3, null);
Node n1 = t.makeNode(n2, 1, n3);
t.setRoot(n1);</code></pre>
</li>
</ul>
<hr>
<h1 id="👿-관련-문제">👿 관련 문제</h1>
<hr>
<h1 id="🖇️-참고">🖇️ 참고</h1>
<ul>
<li><a href="https://www.youtube.com/watch?v=LnxEBW29DOw&amp;ab_channel=%EC%97%94%EC%A7%80%EB%8B%88%EC%96%B4%EB%8C%80%ED%95%9C%EB%AF%BC%EA%B5%AD">[자료구조 알고리즘] Tree의 종류</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[DataStructure: Binary Tree]]></title>
            <link>https://velog.io/@woozu-in/DataStructure-Binary-Tree</link>
            <guid>https://velog.io/@woozu-in/DataStructure-Binary-Tree</guid>
            <pubDate>Tue, 08 Nov 2022 16:23:29 GMT</pubDate>
            <description><![CDATA[<h1 id="이진-트리binary-tree">이진 트리(Binary Tree)</h1>
<blockquote>
<p>가계도와 같은 계층적인 구조를 표현할 때 사용할 수 있는 자료 구조</p>
</blockquote>
<h2 id="👀-특징">👀 특징</h2>
<ul>
<li>기본적으로 가장 많이 사용되는 비선형 자료구조</li>
<li>왼쪽과 오른쪽으로만 자식 트리가 구성되는 경우</li>
<li>데이터의 탐색 속도 증진을 위해 사용한다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/woozu-in/post/bfd055be-0971-40b2-a206-19a37c542afb/image.png" alt="">
<em>보통 이렇게 생겼다. 물론 매번 완전한 이진트리가 아닐 수도 있다.</em></p>
<h2 id="🔨-데이터를-탐색하는-방법">🔨 데이터를 탐색하는 방법</h2>
<ul>
<li>포인터를 사용하여 왼쪽 자식과 오른쪽 자식을 가리킬 수 있도록 했다.</li>
<li>포인터를 이용하면 완전 이진트리가 아니더라도 안정적으로 탐색이 가능하다.</li>
</ul>
<h3 id="전위-순회-preorder-traversal">전위 순회 Preorder Traversal</h3>
<ol>
<li>자기 자신을 처리</li>
<li>왼쪽 자식을 방문</li>
<li>오른쪽 자신을 방문<pre><code class="language-java">public void Preorder(Node node) {
 if (node!=null) {
     System.out.println(node.data);
     preorder(node.left); // 왼쪽 재귀함수
     preorder(node.right); // 오른쪽 재귀함수
 }
}</code></pre>
</li>
</ol>
<h3 id="중위-순회-inorder-traversal">중위 순회 Inorder Traversal</h3>
<ol>
<li>왼쪽 자식 방문</li>
<li>자기 자신 처리</li>
<li>오른쪽 자식 방문<pre><code class="language-java">public void inorder(Node node) {
 if (node!=null) {
     inorder(node.left); // 왼쪽 재귀함수
     System.out.println(node.data);
     inorder(node.right); // 오른쪽 재귀함수
 }
}</code></pre>
</li>
</ol>
<h3 id="후위-순회-postorder-traversal">후위 순회 Postorder Traversal</h3>
<blockquote>
<p>계산기와 같이 수식이 있고, 컴퓨터가 이를 처리할 때 주로 사용</p>
</blockquote>
<ol>
<li>왼쪽 자식 방문</li>
<li>오른쪽 자식 방문</li>
<li>자기 자신 처리<pre><code class="language-java">public void Postorder(Node node) {
 if (node!=null) {
     postorder(node.left); // 왼쪽 재귀함수
     postorder(node.right); // 오른쪽 재귀함수
     System.out.println(node.data);
 }
}</code></pre>
</li>
</ol>
<h1 id="👿-관련-문제">👿 관련 문제</h1>
<ul>
<li><a href="https://www.acmicpc.net/problem/1991">백준: 1991 트리 순회</a></li>
</ul>
<h1 id="🖇️-참고-자료">🖇️ 참고 자료</h1>
<ul>
<li>이것이 취업을 위한 코딩테스트다</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Java: TreeSet]]></title>
            <link>https://velog.io/@woozu-in/Java-TreeSet</link>
            <guid>https://velog.io/@woozu-in/Java-TreeSet</guid>
            <pubDate>Tue, 08 Nov 2022 15:59:44 GMT</pubDate>
            <description><![CDATA[<h1 id="treeset-클래스">TreeSet 클래스</h1>
<h2 id="👀-특징">👀 특징</h2>
<ul>
<li>객체의 정렬에 사용되는 클래스</li>
<li>중복을 허용하지 않으며(set) 오름차순이나 내림차순으로 객체를 정렬한다.</li>
<li>이진 검색 트리(binary search tree)로 구현되어 있다.</li>
<li>객체 비교를 위해 <code>Comparable</code> 이나 <code>Comparator</code> 인터페이스를 구현해야 한다.</li>
</ul>
<hr>
<h2 id="🔨-생성과-주요-메소드">🔨 생성과 주요 메소드</h2>
<h3 id="생성">생성</h3>
<pre><code class="language-java">Treeset&lt;String&gt; treeSet = new TreeSet&lt;String&gt;();</code></pre>
<h3 id="요소-추가">요소 추가</h3>
<pre><code class="language-java">treeSet.add(str); // 추가</code></pre>
<h3 id="요소-제거">요소 제거</h3>
<pre><code class="language-java">treeSet.remove(0);</code></pre>
<h3 id="요소-정렬">요소 정렬</h3>
<h4 id="comparable"><code>Comparable</code></h4>
<ul>
<li><p>주의!! 클래스로 새로 정의된 객체의 경우 어떻게 비교해서 넣을지 구현을 같이 해주어야 한다.</p>
</li>
<li><p>기본 자료형에는 <code>Comparable</code> 가 이미 구현되어 있다.</p>
<pre><code class="language-java">public class Member implements Comparable&lt;Member&gt; {

@Override
public int compareTo(Member member){
    // 기존 것과 비교할 것을 구현해주면 된다.
    return (this.memberId - member.memberId);
}

}</code></pre>
</li>
<li><p>return 값이</p>
<ul>
<li>양수 = <code>memberId</code>를 기준으로 오름차순 정렬</li>
<li>음수 = <code>memberId</code>를 기준으로 내림차순 정렬</li>
</ul>
</li>
</ul>
<h4 id="comparator"><code>Comparator</code></h4>
<ul>
<li>보통은 <code>Comparable</code>을 사용하지만... 그래도 정리해두기!</li>
<li>주의! 사용 전에 생성자에 <code>Default Construcktor</code> 만들어두어야 한다.</li>
</ul>
<pre><code class="language-java">Treeset&lt;Member&gt; treeSet = new TreeSet&lt;Member&gt;(new Member());
// 혹은 다른 compare가 있는 클래스도 가능

public class Member implements Comparator&lt;Member&gt; {

  @Override
  public int compare(Member member1, Member member2){
      // member1 == 기존 것
      // member2 == 새로 들어온 것
      // 기존 것과 비교할 것을 구현해주면 된다.
      return (member1.memberId - member2.memberId);
  }

 }</code></pre>
<ul>
<li>return 값이<ul>
<li>양수 = <code>memberId</code>를 기준으로 오름차순 정렬</li>
<li>음수 = <code>memberId</code>를 기준으로 내림차순 정렬</li>
</ul>
</li>
</ul>
<hr>
<h1 id="👿-관련-문제">👿 관련 문제</h1>
<ul>
<li><a href="https://www.acmicpc.net/problem/1991">백준1991: 트리 순회
</a></li>
</ul>
<hr>
<h1 id="🖇️-참고-자료">🖇️ 참고 자료</h1>
<ul>
<li>Do it! 자바 프로그래밍 입문</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[OCI 배포 : 3. Terminus를 활용한 SSH 접속]]></title>
            <link>https://velog.io/@woozu-in/OCI-%EB%B0%B0%ED%8F%AC-3.-Terminus%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-SSH-%EC%A0%91%EC%86%8D</link>
            <guid>https://velog.io/@woozu-in/OCI-%EB%B0%B0%ED%8F%AC-3.-Terminus%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-SSH-%EC%A0%91%EC%86%8D</guid>
            <pubDate>Sat, 29 Oct 2022 13:23:17 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>M1 macbook 환경을 기준으로 작성되었습니다.</p>
</blockquote>
<h1 id="ssh란">SSH란?</h1>
<ul>
<li>AWS, OCI같은 클라우드 서비스에서 서버를 생성하다보면 &#39;키 페어&#39;를 생성하는 과정을 거친다.</li>
<li>이 것은 외부의 보안 위협으로부터 보호해주는 SSH 보안 방식이 적용된 서버에서 필요한 과정이다.</li>
</ul>
<h2 id="ssh--secure-shell">SSH == Secure Shell</h2>
<ul>
<li>원격 호스트에 접속하기 위해 사용되는 보안 프로토콜.</li>
<li>이전에 <code>Telnet</code> 방식을 사용했는데, 암호화를 제공하지 않기 때문에 보안상 취약하다는 단점이 있었다.</li>
<li>이 때문에 key를 암호화하는 SSH 기술이 등장했고, 이는 현재 기본적으로 거치는 원격 접속 보안 과정이 되었다.</li>
</ul>
<h3 id="비대칭키-방식">비대칭키 방식</h3>
<ul>
<li>공개키 (Public Key)와 개인키(Private Key)가 한 쌍을 이룬다.</li>
<li>공개키는 다른사람들에게 공개된 키로, 개인키는 외부에 공개하지 않는다.</li>
<li>공개키로 암호화하여 개인키로 복호화할 수도 있고(SSH에 사용됨), 반대로 개인키로 암호화하고 공개키로 복호화할수도 있다. (전자 서명에 사용됨)<ul>
<li>Public Key로 암호화 : Data 보안에 중점</li>
<li>Private Key로 암호화 : 인증 과정에 중점</li>
</ul>
</li>
</ul>
<h3 id="더-공부할만한-키워드">더 공부할만한 키워드</h3>
<ul>
<li>대칭키 방식</li>
<li>혼합형 암호 체계</li>
</ul>
<hr>
<h1 id="terminus-설치">Terminus 설치</h1>
<ul>
<li>App Store 혹은 <a href="https://termius.com/download/macos"><code>Terminus</code> 웹페이지</a>에서 설치가 가능하다.</li>
</ul>
<hr>
<h1 id="ssh-접속">SSH 접속</h1>
<h2 id="이전에-확인할-것">이전에 확인할 것</h2>
<ul>
<li><p>클라우드 서비스에서 SSH를 사용할 수 있도록 본인 IP에 혹은 공개(0.0.0.0/0)로 열려있는지 미리 체크
<img src="https://velog.velcdn.com/images/woozu-in/post/f84bdefa-5368-4e11-aed2-870b4b432236/image.png" alt=""></p>
</li>
<li><p>공용 IP 복사해두기</p>
<ul>
<li><code>Compute</code> - <code>Instances</code>
<img src="https://velog.velcdn.com/images/woozu-in/post/c7187997-9cbd-43fb-8689-866bf2fcc618/image.png" alt=""></li>
</ul>
</li>
</ul>
<h2 id="hosts-추가">Hosts 추가</h2>
<ol>
<li><p><code>Hosts</code> - <code>Add</code> - <code>New Host</code> 클릭
 <img src="https://velog.velcdn.com/images/woozu-in/post/a227ed62-841a-4351-adca-f54eb41e363e/image.png" alt=""></p>
</li>
<li><p>정보 기입</p>
<ul>
<li><p><code>Label</code> : 해당 SSH 접속을 알아볼 수 있도록 간단히 이름 적기</p>
</li>
<li><p><code>Address</code>* : public IP 입력</p>
</li>
<li><p><code>Port</code> : 지정한 포트 입력 (지정하지 않았다면 기본 22)</p>
</li>
<li><p><code>Username</code>* : (OCI의 경우) opc</p>
</li>
<li><p><code>key</code> : 아래 <a href="##-Key-%EC%A0%80%EC%9E%A5">Key 저장</a> 참고</p>
<p><img src="https://velog.velcdn.com/images/woozu-in/post/a3bf42dd-10dd-4a9a-b25d-54b33c910577/image.png" alt=""></p>
</li>
</ul>
</li>
</ol>
<h2 id="key-저장">Key 저장</h2>
<ol>
<li><code>Set a Key</code> 클릭 후 <code>+New</code> 클릭</li>
<li><code>Import from key file</code>에서 아까 다운 받았던 <code>.ppk</code> 혹은 <code>.pem</code> 파일 import</li>
<li><code>save</code> 클릭<ul>
<li>알아보기 쉽도록 Label을 지정해두자.
<img src="https://velog.velcdn.com/images/woozu-in/post/c79d0968-af8c-4908-b26f-1e4a66dab67b/image.png" alt=""></li>
</ul>
</li>
</ol>
<h2 id="연결">연결</h2>
<ol>
<li>다시 돌아와서 좌측 상단에 연결 버튼 클릭</li>
<li>다음의 메시지가 뜰 경우 <code>Add and contine</code>
<img src="https://velog.velcdn.com/images/woozu-in/post/cfb52b05-03cc-47f3-addb-d2808214e2fc/image.png" alt=""></li>
<li>연결 확인
<img src="https://velog.velcdn.com/images/woozu-in/post/2c979ff9-3d82-4fbe-9484-d5bdf47b990d/image.png" alt=""></li>
</ol>
<hr>
<h1 id="참고">참고</h1>
<ul>
<li><a href="https://blog.naver.com/chodahi/221406287669">암호화 기법 (대칭키, 비대칭키)</a> (2018)</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[OCI 배포 : error. Tomcat 오류 DB 연결에 실패한 경우]]></title>
            <link>https://velog.io/@woozu-in/OCI-%EB%B0%B0%ED%8F%AC-error.-Tomcat-%EC%98%A4%EB%A5%98-DB-%EC%97%B0%EA%B2%B0%EC%97%90-%EC%8B%A4%ED%8C%A8%ED%95%9C-%EA%B2%BD%EC%9A%B0</link>
            <guid>https://velog.io/@woozu-in/OCI-%EB%B0%B0%ED%8F%AC-error.-Tomcat-%EC%98%A4%EB%A5%98-DB-%EC%97%B0%EA%B2%B0%EC%97%90-%EC%8B%A4%ED%8C%A8%ED%95%9C-%EA%B2%BD%EC%9A%B0</guid>
            <pubDate>Thu, 27 Oct 2022 04:57:22 GMT</pubDate>
            <description><![CDATA[<h1 id="프로젝트-빌드-중-tomcat-오류-failed-to-configure-a-datasource-url-attribute-is-not-specified-and-no-embedded-datasource-could-be-configured-">프로젝트 빌드 중 Tomcat 오류 &#39;Failed to configure a DataSource: &#39;url&#39; attribute is not specified and no embedded datasource could be configured. &#39;</h1>
<p><img src="https://velog.velcdn.com/images/woozu-in/post/ea8cca43-f1cc-4591-8d8e-49c8ede572c7/image.png" alt=""></p>
<h2 id="❌-error">❌ error!!</h2>
<ul>
<li><p>상황 : jenkins로 프로젝트 구성 후, 첫 빌드를 시작.</p>
<ul>
<li>Tomcat까지 실행에 성공하였다. 그러나 그 후 <code>Deplying</code> 과정에서 에러가 자꾸 났다.</li>
</ul>
</li>
<li><p>에러메시지</p>
<pre><code class="language-text">Tomcat started.
[DeployPublisher][INFO] Attempting to deploy 1 war file(s)
[DeployPublisher][INFO] Deploying /var/lib/jenkins/workspace/spring_project/target/project-0.0.1-SNAPSHOT.war to container Tomcat 9.x Remote with context /
Redeploying [/var/lib/jenkins/workspace/spring_project/target/project-0.0.1-SNAPSHOT.war]
Undeploying [/var/lib/jenkins/workspace/spring_project/target/project-0.0.1-SNAPSHOT.war]
Deploying [/var/lib/jenkins/workspace/spring_project/target/project-0.0.1-SNAPSHOT.war]
ERROR: Build step failed with exception
org.codehaus.cargo.container.ContainerException: Failed to deploy [/var/lib/jenkins/workspace/spring_project/target/project-0.0.1-SNAPSHOT.war]
  at org.codehaus.cargo.container.tomcat.internal.AbstractTomcatManagerDeployer.deploy(AbstractTomcatManagerDeployer.java:104)
  at org.codehaus.cargo.container.tomcat.internal.AbstractTomcatManagerDeployer.redeploy(AbstractTomcatManagerDeployer.java:172)
  at hudson.plugins.deploy.CargoContainerAdapter.deploy(CargoContainerAdapter.java:81)
  at hudson.plugins.deploy.CargoContainerAdapter$DeployCallable.invoke(CargoContainerAdapter.java:167)
  at hudson.plugins.deploy.CargoContainerAdapter$DeployCallable.invoke(CargoContainerAdapter.java:136)
  at hudson.FilePath.act(FilePath.java:1192)
  at hudson.FilePath.act(FilePath.java:1175)
  at hudson.plugins.deploy.CargoContainerAdapter.redeployFile(CargoContainerAdapter.java:133)
  at hudson.plugins.deploy.PasswordProtectedAdapterCargo.redeployFile(PasswordProtectedAdapterCargo.java:95)
  at hudson.plugins.deploy.DeployPublisher.perform(DeployPublisher.java:113)
  at jenkins.tasks.SimpleBuildStep.perform(SimpleBuildStep.java:123)
  at hudson.tasks.BuildStepCompatibilityLayer.perform(BuildStepCompatibilityLayer.java:80)
  at hudson.tasks.BuildStepMonitor$3.perform(BuildStepMonitor.java:47)
  at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:816)
  at hudson.model.AbstractBuild$AbstractBuildExecution.performAllBuildSteps(AbstractBuild.java:765)
  at hudson.model.Build$BuildExecution.post2(Build.java:179)
  at hudson.model.AbstractBuild$AbstractBuildExecution.post(AbstractBuild.java:709)
  at hudson.model.Run.execute(Run.java:1924)
  at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:44)
  at hudson.model.ResourceController.execute(ResourceController.java:107)
  at hudson.model.Executor.run(Executor.java:449)
Caused by: org.codehaus.cargo.container.tomcat.internal.TomcatManagerException: The Tomcat Manager responded &quot;FAIL - Deployed application at context path [/] but context failed to start
&quot; instead of the expected &quot;OK&quot; message
  at org.codehaus.cargo.container.tomcat.internal.TomcatManager.invoke(TomcatManager.java:721)
  at org.codehaus.cargo.container.tomcat.internal.TomcatManager.deployImpl(TomcatManager.java:767)
  at org.codehaus.cargo.container.tomcat.internal.TomcatManager.deploy(TomcatManager.java:312)
  at org.codehaus.cargo.container.tomcat.internal.AbstractTomcatManagerDeployer.deploy(AbstractTomcatManagerDeployer.java:99)
  ... 20 more
org.codehaus.cargo.container.tomcat.internal.TomcatManagerException: The Tomcat Manager responded &quot;FAIL - Deployed application at context path [/] but context failed to start
&quot; instead of the expected &quot;OK&quot; message
  at org.codehaus.cargo.container.tomcat.internal.TomcatManager.invoke(TomcatManager.java:721)
  at org.codehaus.cargo.container.tomcat.internal.TomcatManager.deployImpl(TomcatManager.java:767)
  at org.codehaus.cargo.container.tomcat.internal.TomcatManager.deploy(TomcatManager.java:312)
  at org.codehaus.cargo.container.tomcat.internal.AbstractTomcatManagerDeployer.deploy(AbstractTomcatManagerDeployer.java:99)
  at org.codehaus.cargo.container.tomcat.internal.AbstractTomcatManagerDeployer.redeploy(AbstractTomcatManagerDeployer.java:172)
  at hudson.plugins.deploy.CargoContainerAdapter.deploy(CargoContainerAdapter.java:81)
  at hudson.plugins.deploy.CargoContainerAdapter$DeployCallable.invoke(CargoContainerAdapter.java:167)
  at hudson.plugins.deploy.CargoContainerAdapter$DeployCallable.invoke(CargoContainerAdapter.java:136)
  at hudson.FilePath.act(FilePath.java:1192)
  at hudson.FilePath.act(FilePath.java:1175)
  at hudson.plugins.deploy.CargoContainerAdapter.redeployFile(CargoContainerAdapter.java:133)
  at hudson.plugins.deploy.PasswordProtectedAdapterCargo.redeployFile(PasswordProtectedAdapterCargo.java:95)
  at hudson.plugins.deploy.DeployPublisher.perform(DeployPublisher.java:113)
  at jenkins.tasks.SimpleBuildStep.perform(SimpleBuildStep.java:123)
  at hudson.tasks.BuildStepCompatibilityLayer.perform(BuildStepCompatibilityLayer.java:80)
  at hudson.tasks.BuildStepMonitor$3.perform(BuildStepMonitor.java:47)
  at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:816)
  at hudson.model.AbstractBuild$AbstractBuildExecution.performAllBuildSteps(AbstractBuild.java:765)
  at hudson.model.Build$BuildExecution.post2(Build.java:179)
  at hudson.model.AbstractBuild$AbstractBuildExecution.post(AbstractBuild.java:709)
  at hudson.model.Run.execute(Run.java:1924)
  at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:44)
  at hudson.model.ResourceController.execute(ResourceController.java:107)
  at hudson.model.Executor.run(Executor.java:449)
Build step &#39;Deploy war/ear to a container&#39; marked build as failure
Finished: FAILURE</code></pre>
</li>
<li><p>서치 해 본 결과, 해당 단계에서 tomcat 비밀번호를 틀렸다든가 하는 사례들이 몇몇 있었다. 하지만 나의 경우에는 다른 것들은 다 틀림이 없이 구성을 해놓았었다.</p>
</li>
</ul>
<hr>
<h2 id="파악">파악</h2>
<ol>
<li>Tomcat log 파일을 뒤져보았다.</li>
</ol>
<pre><code class="language-shell"># log 파일 경로로 이동
cd /usr/local/tomcat9/logs

# 파일 열기 (이름이 다를 수 있으므로 ls로 확인하고 열자)
vi catalina.out</code></pre>
<ol start="2">
<li>문제 상황 확인</li>
</ol>
<pre><code class="language-shell">***************************
APPLICATION FAILED TO START
***************************

Description:

Failed to configure a DataSource: &#39;url&#39; attribute is not specified and no embedded datasource could be configured.

Reason: Failed to determine a suitable driver class


Action:

Consider the following:
        If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
        If you have database settings to be loaded from a particular profile you may need to activate it (the profiles aws are currently active).

        ...
        (후략)
        ...</code></pre>
<ul>
<li>위와 같은 메시지가 기록되어있다. DB와 연결이 안되었다는 뜻이며, url부터 지정해주어야 한다.</li>
</ul>
<ol start="3">
<li>원인 보안탓에 DB 정보를 github에 올라가지 않게 막아두고, 별도의 properties에 옮겨놓았는데.. 깜빡 잊고 서버에 추가를 안했었다🥹 이게 원인이었다니 허무하다..!</li>
</ol>
<hr>
<h2 id="해결">해결</h2>
<ol>
<li>프로젝트 경로로 이동<pre><code class="language-shell"># 현재 위치 파악
pwd
</code></pre>
</li>
</ol>
<h1 id="프로젝트-경로로-이동">프로젝트 경로로 이동</h1>
<h1 id="위의-오류-메시지에-기록되어-있음">위의 오류 메시지에 기록되어 있음.</h1>
<p>cd /opc/var/lib/jenkins/workspace</p>
<pre><code>
2. properties 파일 위치로 이동

3. `application.properties` 파일 생성
```shell
sudo vi aplication-oci.properties

# DB 정보 입력 (mySql)
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/{스키마}?autoReconnect=true spring.datasource.username={DB ID}
spring.datasource.password={DB Pw}
spring.datasource.driver-class-name=com.mysql.jdbc.Driver</code></pre><h1 id="참고">참고</h1>
<ul>
<li><a href="https://fntg.tistory.com/193">Spring Boot 최초 실행 시 &#39;Failed to configure a DataSource: &#39;url&#39; attribute is not specified and no embedded datasource could be configured. &#39;</a> (2019)</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[OCI 배포 : 2. Instance 생성]]></title>
            <link>https://velog.io/@woozu-in/OCI-%EB%B0%B0%ED%8F%AC-2.-Instance-%EC%83%9D%EC%84%B1</link>
            <guid>https://velog.io/@woozu-in/OCI-%EB%B0%B0%ED%8F%AC-2.-Instance-%EC%83%9D%EC%84%B1</guid>
            <pubDate>Wed, 26 Oct 2022 05:56:49 GMT</pubDate>
            <description><![CDATA[<h2 id="인스턴스-생성">인스턴스 생성</h2>
<ol>
<li><p>메인메뉴 - <code>Compute</code> - <code>Instances</code> - <code>Create instance</code></p>
</li>
<li><p>이름 변경<br><img src="https://velog.velcdn.com/images/woozu-in/post/9d29ca9e-c9f8-476d-9c87-3a4e8a668bd8/image.png" alt=""></p>
</li>
</ol>
<ol start="3">
<li><p><code>Image and shape</code> - <code>Change image</code></p>
<ul>
<li>CentOS 선택
  <img src="https://velog.velcdn.com/images/woozu-in/post/4798aa72-a2c1-4a22-9378-c9ded5c9d978/image.png" alt=""></li>
</ul>
</li>
<li><p><code>Add SSH keys</code> - <code>Generate a key pair for me</code></p>
<ol>
<li><code>Save private key</code></li>
</ol>
</li>
<li><p><code>Boot volume</code></p>
<ol>
<li><p><code>Use in-transit encryption</code></p>
<p><img src="https://velog.velcdn.com/images/woozu-in/post/fb1aea08-ea50-45e1-aaf2-8d48b2e28838/image.png" alt=""></p>
</li>
</ol>
</li>
<li><p><code>Create</code></p>
</li>
<li><p>빌드 될때까지 기다리기
 <img src="https://velog.velcdn.com/images/woozu-in/post/84f9d9ee-973b-45e0-9fa7-84087e70ec1c/image.png" alt=""></p>
</li>
</ol>
<hr>
<h2 id="예약된-ip로-바꾸기">예약된 IP로 바꾸기</h2>
<ol>
<li><p>스크롤하면 VNICs 설정 메뉴</p>
<ul>
<li><code>Attatched VNICs</code></li>
</ul>
</li>
<li><p>방금 생성된 것 클릭
   <img src="https://velog.velcdn.com/images/woozu-in/post/7a8e1e31-8e7e-4a9d-9655-09cdcf23dc59/image.png" alt=""></p>
</li>
<li><p><code>IPv4 Addresses</code> - 상세메뉴 누르기(점 3개) - <code>Edit</code><br>  <img src="https://velog.velcdn.com/images/woozu-in/post/594706d9-fc68-4ba7-98be-d95d67648131/image.png" alt=""></p>
</li>
<li><p><code>Public IP Type</code> - <code>No public IP</code> 선택 - <code>Update</code></p>
</li>
<li><p>다시 편집 모드 들어가서</p>
</li>
<li><p><code>Reserved public IP</code> 선택 - 예약해둔 IP 선택 - <code>Update</code></p>
<pre><code>![](https://velog.velcdn.com/images/woozu-in/post/a0d16127-f5b4-4e04-926b-f41ae3ddee32/image.png)</code></pre></li>
<li><p><code>Instance</code>에서 바뀐 Public IP 확인 가능</p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[OCI 배포 : 1. VCN 생성]]></title>
            <link>https://velog.io/@woozu-in/OCI-%EB%B0%B0%ED%8F%AC-VCN-%EC%83%9D%EC%84%B1</link>
            <guid>https://velog.io/@woozu-in/OCI-%EB%B0%B0%ED%8F%AC-VCN-%EC%83%9D%EC%84%B1</guid>
            <pubDate>Tue, 25 Oct 2022 08:34:06 GMT</pubDate>
            <description><![CDATA[<h1 id="가상-클라우드-네트워크-생성-vcn">가상 클라우드 네트워크 생성 VCN</h1>
<ul>
<li>필요한 게이트웨이, 공용 서브넷, 전용 서브넷, 경로 지정 테이블 및 보안 목록으로 VCN를 설정할 수 있다.</li>
</ul>
<h2 id="생성">생성</h2>
<ol>
<li><p>좌측 상단 메인메뉴</p>
<ul>
<li><code>Networking</code> - <code>Overview</code> 클릭
<img src="https://velog.velcdn.com/images/woozu-in/post/0b2e2c23-6ee8-433a-b1ce-4b1668d631a3/image.png" alt=""></li>
</ul>
</li>
<li><p><code>Start VCN Wizard</code> 시작
<img src="https://velog.velcdn.com/images/woozu-in/post/a18684f0-1c08-40c1-b271-c49cbd75eb9c/image.png" alt=""></p>
</li>
<li><p>내용 작성</p>
<ul>
<li>Name 작성</li>
<li><code>Configure VCN and Subnets</code> 내용 확인<ul>
<li>아래 대역대로 기본 네트워크가 구성된다.
<img src="https://velog.velcdn.com/images/woozu-in/post/c889cb13-38eb-448c-b660-97b642785148/image.png" alt=""></li>
</ul>
</li>
<li><code>Next</code> - <code>Create</code><ul>
<li>실패한다면, 재시도</li>
</ul>
</li>
<li>성공시 <code>View Virtual Cloud Network</code> 클릭</li>
</ul>
</li>
</ol>
<hr>
<h2 id="수신-규칙-추가">수신 규칙 추가</h2>
<ol>
<li><p><code>Security Lists</code> 를 통해 방화벽 정책을 구성하게 된다.</p>
</li>
<li><p>생성된 VCN을 확인하는 화면에서</p>
</li>
<li><p><code>Security Lists</code> - <code>Default Security List for 이름</code></p>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/woozu-in/post/a32804ac-c289-4466-9e33-522eeba6e6d2/image.png" alt=""></p>
<ol start="3">
<li><code>Ingress Rules</code> - <code>Add Ingress Rules</code><ul>
<li>원하는 수신 포트 추가
<img src="https://velog.velcdn.com/images/woozu-in/post/98115925-16d2-410e-88a0-c67191d8ab24/image.png" alt=""></li>
</ul>
</li>
</ol>
<hr>
<h2 id="reserved-public-ip">Reserved Public IP</h2>
<ul>
<li>Instance를 생성하기 전에 미리 지속적으로 사용할 공인 IP를 배정받는다.</li>
<li>Compute Instance를 생성하게되면 기본적으로 Public IP가 부여된다.</li>
<li>이 Public IP는 Instance를 종료하고 시작할 때마다 새로 부여되어 바뀌게 되는데, 도메인에 특정 IP 주소로 연결한 후에 이 Public IP가 변경되면 매번 DNS 서버를 통해 바꾸어줘야 한다.</li>
<li>이를 방지하기 위해 고정 IP가 필요한데, 이 기능을 제공하는 것이 Reserved Public IP이다.</li>
<li>VCN을 생성했으니 Reserved Public IP 가 잘 배정되었는지 확인해보자.</li>
</ul>
<h3 id="확인">확인</h3>
<ol>
<li><p><code>Networking</code> - <code>Reserved Public IPs</code>
 <img src="https://velog.velcdn.com/images/woozu-in/post/1c80c08e-a6df-45e7-a669-404ddc2ee8a3/image.png" alt=""></p>
</li>
<li><p><code>Reserve Public IP Address</code>
 <img src="https://velog.velcdn.com/images/woozu-in/post/1d18673a-2628-4352-b4a0-ea8e8a60c823/image.png" alt=""></p>
</li>
</ol>
<hr>
<h1 id="참고">참고</h1>
<ul>
<li>MLP 수업 자료</li>
<li><a href="https://juyong.kr/m/5">[오라클 클라우드] 2. 인스턴스 사전작업</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Oracle Cloud 배포 시작]]></title>
            <link>https://velog.io/@woozu-in/Oracle-Cloud-%EB%B0%B0%ED%8F%AC-%EC%8B%9C%EC%9E%91</link>
            <guid>https://velog.io/@woozu-in/Oracle-Cloud-%EB%B0%B0%ED%8F%AC-%EC%8B%9C%EC%9E%91</guid>
            <pubDate>Mon, 24 Oct 2022 05:32:22 GMT</pubDate>
            <description><![CDATA[<h1 id="🏃서버를-찾아서">🏃서버를 찾아서</h1>
<p> 국비교육이 끝나고 학원측은 칼같이 다음 월요일에 프로젝트 서버를 종료시켜 버렸다. 이덕에 우리의 프로젝트 결과물은 어디에도 담기지 못하고 붕 떠버렸다🥲 그래서 생각한 것이 서버를 이사하는 것.
 이전에 사용했던 서버는 NCP(네이버 클라우드 플랫폼)이었는데, 그래서 좋은 환경에서 서버를 처음 접할 수 있었지만... 친절한 만큼 요금이 비싸다는 단점이 있었다. 우리 조는 간단한 상의하에 반으로 나뉘어 2명은 NCP API를 교체하는 작업과 README작성을 2명은 서버 이전을 조사하고 공부하는 작업을 하기로 진행했다.</p>
<p> 같이 시작한 동료분은 시도 3일차만에 성공했지만, 저는 이것저것 에러 발생을 참 다채롭게도 겪었다. (늘 그렇듯이...)
 그 시도를 기록해 둔다.</p>
<hr>
<h1 id="oci-선택한-이유">OCI 선택한 이유</h1>
<blockquote>
<p>OCI(Oracle Cloud Infrastructure)</p>
</blockquote>
<p>사실상 AWS 사용 비중이 월등한 것 같지만 굳이굳이 OCI를 선택했다.
가장 큰 이유는 역시 무료 인스턴스...😎 취준생에게는 한줄기 빛 그잡채..</p>
<p>AWS는 괴담처럼 요금 폭탄 썰이 돌길래 약간 무서운 것도 있었다. 하지만 어쨌든 경험하고 공부해보아야 하겠다는 생각이 들어 이 다음 토이 프로젝트는 AWS로 배포해보려고 한다.</p>
<h2 id="장점">장점</h2>
<ul>
<li><strong>프리티어로 인스턴스를 2개 무료 사용 가능</strong> (✨결정적인 이유)</li>
<li>AWS 사용하며 해킹 등의 이유로 요금 폭탄을 받는 경우가 더러 있는데, OCI의 경우에는 결제 단계를 하나 더 거쳐야 과금이 되는 구조</li>
<li>클라우드 관리 콘솔 페이지 안에서 shell 환경 접속을 지원하기 때문에 관리하기 편리</li>
</ul>
<h2 id="단점">단점</h2>
<ul>
<li>무료 오라클 DB의 경우 일정시간 접속이 없으면 꺼지는 구조. 로그인해서 다시 켜야한다.<ul>
<li>이정도 번거로움은 무료서비스 감당 가능!<ul>
<li>그리고 mySQL 쓰려고한다.</li>
</ul>
</li>
</ul>
</li>
<li>VM으로 생성하는 리눅스가 오라클 리눅스7로 설치된다. 레드헷 계열이지만 오라클용으로 약간 최적화되면서 다른 부분이 있다.<ul>
<li>원래 CentOS를 배웠으므로 방해될 것이 없음.</li>
</ul>
</li>
</ul>
<hr>
<h1 id="oci-배포-시작해-봅시다">OCI 배포 시작해 봅시다</h1>
<p> 약간 생각치 못했던 복병으로는.. 학습 자료가 AWS처럼 많지 않다는 점..
 그래서 AWS를 학습을 하고 이를 OCI 에 적용하여 진행하는 순서로 잡았다. MLP에서 제공해준 수업자료도 매우 활용도가 높았다.
 OCI로 적용할 때에는 구글링의 힘을 많이 빌렸는데, 그 중 가장 정리가 잘 되고 개념 설명이 충실한 블로그를 첨부해 두었다.</p>
<h2 id="시작하기-전-🏃-필수절차--계정-생성">시작하기 전 🏃 필수절차 : 계정 생성</h2>
<ul>
<li><a href="https://thekoguryo.github.io/oci/chapter02/1/">Oracle Cloud Free Tier 계정 생성</a></li>
</ul>
<hr>
<h1 id="참고">참고</h1>
<ul>
<li><a href="https://www.leafcats.com/48">[Linux] Redhat, CentOS, Fedora 리눅스의 차이와 역사</a> (2016)</li>
<li><a href="https://blogpack.tistory.com/935">오라클 클라우드로 평생 무료로 서버와 DB 운영하기
</a> (2021)</li>
<li><a href="https://thekoguryo.github.io/oci/chapter02/1/">Oracle Cloud Free Tier 계정 생성</a> (2022) 추천 블로그⭐️</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[포트를 사용중인 프로세스 확인하고 kill]]></title>
            <link>https://velog.io/@woozu-in/%ED%8F%AC%ED%8A%B8%EB%A5%BC-%EC%82%AC%EC%9A%A9%EC%A4%91%EC%9D%B8-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%ED%99%95%EC%9D%B8%ED%95%98%EA%B3%A0-kill</link>
            <guid>https://velog.io/@woozu-in/%ED%8F%AC%ED%8A%B8%EB%A5%BC-%EC%82%AC%EC%9A%A9%EC%A4%91%EC%9D%B8-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%ED%99%95%EC%9D%B8%ED%95%98%EA%B3%A0-kill</guid>
            <pubDate>Fri, 21 Oct 2022 15:11:54 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>참고로 저는 M1 macbook을 사용 중입니다.
교육 도중 거의 처음 만난 오류로, 가장 많이 쓰는 에러 고치는 명령어가 되었다.</p>
</blockquote>
<h1 id="포트-프로세스-확인-후-kill">포트 프로세스 확인 후 kill</h1>
<h2 id="🚧-오류현상">🚧 오류현상</h2>
<ul>
<li>상황1_ 이클립스에서 톰캣 서버 중에 오류 발생<ul>
<li>[Server at localhost are already in use ...]</li>
</ul>
</li>
<li>상황2_ 알 수 없는 이유로 프로그램 응답없음<ul>
<li>이후, 프로젝트를 다시 실행하면 이미 사용중이라는 위의 메시지가 발생</li>
<li>작업관리자로 해결되지 않는다.</li>
</ul>
</li>
<li>상황3_ <code>Web server failed to start. Port 8080 was already in use</code><ul>
<li>포트가 이미 실행 중일 때 스프링 Run하면 실행되는 에러</li>
</ul>
</li>
</ul>
<pre><code class="language-shell">  Web server failed to start. Port 3000 was already in use.
Action:
Identify and stop the process that&#39;s listening on port 3000 or configure this application to listen on another port.
2019-11-06 22:00:06.094  INFO 8996 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Shutting down ExecutorService &#39;applicationTaskExecutor&#39;</code></pre>
<h2 id="🔨-해결방안">🔨 해결방안</h2>
<ol>
<li><p>터미널 열기</p>
</li>
<li><p>다음의 명령어를 입력하여 어떤 프로세스가 포트를 점유 중인지 확인할 수 있다.</p>
</li>
</ol>
<pre><code class="language-shell">$ sudo lsof -i:[PORT NUMBER]
$ sudo lsof -i:8080</code></pre>
<ol start="3">
<li>방법은 다음 중 택 1하여 해결한다.</li>
</ol>
<h3 id="임시-방편으로-포트-번호-바꾸기">임시 방편으로 포트 번호 바꾸기</h3>
<h3 id="프로세스-pid-kill">프로세스 PID kill</h3>
<pre><code class="language-shell">kill [PID NUMBER]
&gt; kill 4712</code></pre>
<hr>
<h2 id="참조">참조</h2>
<ul>
<li><a href="https://velog.io/@todak/Mac-%ED%8F%AC%ED%8A%B8%EB%A5%BC-%EC%82%AC%EC%9A%A9%EC%A4%91%EC%9D%B8-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EB%A5%BC-%ED%99%95%EC%9D%B8%ED%95%98%EA%B3%A0-%EC%A2%85%EB%A3%8C%ED%95%B4%EB%B3%B4%EC%9E%90">[Mac] 포트를 사용중인 프로세스를 확인하고 종료해보자 (20-01-01)</a></li>
<li><a href="https://studyingazae.tistory.com/54">[Tomcat] 이미 실행 중인 process kill (21-09-16)</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Algorithm : 구간 합]]></title>
            <link>https://velog.io/@woozu-in/Algorithm-%EA%B5%AC%EA%B0%84-%ED%95%A9</link>
            <guid>https://velog.io/@woozu-in/Algorithm-%EA%B5%AC%EA%B0%84-%ED%95%A9</guid>
            <pubDate>Fri, 21 Oct 2022 08:16:13 GMT</pubDate>
            <description><![CDATA[<h1 id="구간-합">구간 합</h1>
<blockquote>
<p>배열을 이용하여 시간 복잡도를 더 줄이기 위해 사용하는 특수한 목적의 알고리즘</p>
</blockquote>
<h2 id="합-배열-s">합 배열 S</h2>
<pre><code class="language-java">// A[0]부터 A[i]까지의 합
S[i] = A[0]+A[1]+A[2]+...+A[i-1]+A[i]</code></pre>
<ul>
<li>기존 배열을 전처리한 배열</li>
<li>미리 합배열을 구해두면 <strong>시간 복잡도가 O(N)에서 O(1)로 감소</strong>하게 된다.</li>
<li>적재적소에 잘 활용해보자.</li>
</ul>
<pre><code class="language-java">// 합배열 S
S[i] = S[i-1]+A[i]</code></pre>
<h2 id="구간합">구간합</h2>
<pre><code class="language-java">S[j]-S[i-1] // i에서 j까지 구간 합</code></pre>
<h2 id="관련-문제">관련 문제</h2>
<ul>
<li><a href="https://www.acmicpc.net/problem/11659">구간 합 구하기 4</a><ul>
<li>런타임 관리가 조금 어려웠다.</li>
</ul>
</li>
<li><a href="https://www.acmicpc.net/problem/11660">구간 합 구하기 5</a><ul>
<li>배열로 확장하여 생각하느라 두 번 더하거나 빼지는 영역을 알아차리는 것이 힘들었다.</li>
</ul>
</li>
<li><a href="https://www.acmicpc.net/problem/10986">나머지 합 구하기</a><ul>
<li>자꾸 시간초과가 떠서 고민하던 와중에, &#39;나머지 배열&#39;이라는 아이디어를 얻었다.</li>
</ul>
</li>
</ul>
<h2 id="참고">참고</h2>
<ul>
<li>Do it! 알고리즘</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Java : 문자-숫자 형변환]]></title>
            <link>https://velog.io/@woozu-in/Java-%EB%AC%B8%EC%9E%90-%EC%88%AB%EC%9E%90-%ED%98%95%EB%B3%80%ED%99%98</link>
            <guid>https://velog.io/@woozu-in/Java-%EB%AC%B8%EC%9E%90-%EC%88%AB%EC%9E%90-%ED%98%95%EB%B3%80%ED%99%98</guid>
            <pubDate>Fri, 21 Oct 2022 06:08:08 GMT</pubDate>
            <description><![CDATA[<h1 id="java--문자-숫자-형변환">Java : 문자-숫자 형변환</h1>
<blockquote>
<p>String to number &amp; number to String</p>
</blockquote>
<h2 id="string---int">String - int</h2>
<h3 id="str-👉-int">Str 👉 int</h3>
<pre><code class="language-java">int i = Integer.parseInt(str);
int i = Integer.valueOf(str);</code></pre>
<h3 id="str-👈-int">Str 👈 int</h3>
<pre><code class="language-java">String i = String.valueOf(i);
String i = Integer.toString(str);</code></pre>
<h2 id="stirng---doble">Stirng - doble</h2>
<h3 id="str-👉-doble">Str 👉 doble</h3>
<pre><code class="language-java">double d = Double.parseDouble(str);
double d = Double.valueOf(str);</code></pre>
<h3 id="str-👈-doble">Str 👈 doble</h3>
<pre><code class="language-java">String str = String.valueOf(d);
String str = Double.toString(d);</code></pre>
<h2 id="stirng---float">Stirng - float</h2>
<h3 id="str-👉-float">Str 👉 float</h3>
<pre><code class="language-java">float f = Float.parseFloat(str);
float f = Float.valueOf(str);</code></pre>
<h3 id="str-👈-float">Str 👈 float</h3>
<pre><code class="language-java">String str = String.valueOf(f);
String str = Float.toString(f);</code></pre>
<h2 id="stirng---long">Stirng - long</h2>
<h3 id="str-👉-long">Str 👉 long</h3>
<pre><code class="language-java">long l= Long.parseLong(str);
long l = Long.valueOf(str);</code></pre>
<h3 id="str-👈-long">Str 👈 long</h3>
<pre><code class="language-java">String str = String.valueOf(f);
String str = Long.toString(f);</code></pre>
<h2 id="stirng---short">Stirng - short</h2>
<h3 id="str-👉-short">Str 👉 short</h3>
<pre><code class="language-java">short s = Short.parseShort(str);
short s = Short.valueOf(str);</code></pre>
<h3 id="str-👈-short">Str 👈 short</h3>
<pre><code class="language-java">String str = String.valueOf(s);
String str = Short.toString(s);</code></pre>
<h2 id="char---int">char - int</h2>
<h3 id="char-👉-int">char 👉 int</h3>
<ul>
<li>아스키코드에서 같은 의미의 문자와 숫자 코드 값 차이는 48인 것을 이해해야 사용 가능하다.<pre><code class="language-java">char ch1 = &#39;1&#39;;
// 방법1
int num1 = ch1 - &#39;0&#39;;
// 방법2
int num1 = ch1 - 48;</code></pre>
</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>