<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>oh.log</title>
        <link>https://velog.io/</link>
        <description>안녕하세요 개발하는 알파카입니다. https://github.com/oh-taehyun</description>
        <lastBuildDate>Tue, 15 Aug 2023 16:52:30 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>oh.log</title>
            <url>https://velog.velcdn.com/images/oh-taehyun/profile/92474423-7e72-49db-957f-d1d12669de30/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. oh.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/oh-taehyun" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[JS공부 dataset/ data- 사용자 정의 속성]]></title>
            <link>https://velog.io/@oh-taehyun/JS%EA%B3%B5%EB%B6%80-dataset-data-%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%A0%95%EC%9D%98-%EC%86%8D%EC%84%B1</link>
            <guid>https://velog.io/@oh-taehyun/JS%EA%B3%B5%EB%B6%80-dataset-data-%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%A0%95%EC%9D%98-%EC%86%8D%EC%84%B1</guid>
            <pubDate>Tue, 15 Aug 2023 16:52:30 GMT</pubDate>
            <description><![CDATA[<p>ezweb강의를 들으며 자바스크립트를 이용해 글씨에 마우스를 갖다대면 관련 이미지가 크게 뜨는 
hover효과를 구현해보려 했다.
그런데 구현 도중 html에서 data-를 이용해 사용자 정의 속성을 만드는 것과 
getAttribute와 비슷한 역할을 하는 dataset이 궁금해졌다.</p>
<p>같이 한번 알아보자</p>
<ol>
<li>HTML data- 속성</li>
</ol>
<p>사용방법</p>
<pre><code class="language-html">&lt;태그명 data-*=&quot;값&quot;&gt;&lt;/태그명&gt;</code></pre>
<p>html을 이용해 개발하다보면 속성을 만들어 쓰고 싶을 때가 있다. 
그때 사용할 수 있는 것이 사용자 정의 속성이다.
앞서 말한 hover효과(글씨에 마우스를 갖다대면 배경이 글씨 관련 사진으로 바뀜)를 구현하기 위해서 data-bg라는 속성을 만들어 보았다.</p>
<pre><code class="language-html">&lt;a data-bg=&quot;https://s3-us-west-2.amazonaws.com/s.cdpn.io/485050/freedom.jpg&quot; target=&quot;_blank&quot;&gt;freedom&lt;/a&gt;</code></pre>
<ol start="2">
<li>dataset
사용방법<pre><code class="language-javascript">문서객체선택.dataset.속성명;
문서객체선택.dataset[속성명];</code></pre>
자바스크립트는 dataset 속성을 통해 사용자 정의 속성 값에 쉽게 접근할 수 있게 하였다.
이 메서드를 이용해 이미지를 미리 생성해 놓고, html에 만든 data-bg속성의 값을 새로 생성한 이미지 요소의 src로 지정해보았다. <pre><code class="language-javascript">const links = document.querySelectorAll(&#39;.container a&#39;);
const bg = document.querySelector(&#39;.bg&#39;);
const showClass = &#39;bg-show&#39;;
for(const link of links){
const img = new Image();
img.src = link.dataset.bg;
}</code></pre>
출처</li>
<li>[JS강좌] 30강 dataset : 문서객체 사용자정의속성 - 오쌤의 니가스터디
<a href="https://ossam5.tistory.com/251">https://ossam5.tistory.com/251</a></li>
<li>Javascript 21 [ Hover Animation ] 풀스크린 호버 이펙트 애니메이션, css 변수지정 활용하기, es6
<a href="https://www.youtube.com/watch?v=4yUZF7CTpiI&amp;list=PL-qMANrofLyvzqz2yYzNectJnYo5ZifE7&amp;index=20">https://www.youtube.com/watch?v=4yUZF7CTpiI&amp;list=PL-qMANrofLyvzqz2yYzNectJnYo5ZifE7&amp;index=20</a></li>
</ol>
<p>ps. github에 꾸준히 커밋을 시작한지 83일이 되었다. 처음에는 프로그래머스 문제를 풀며 코드를 기록했었는데, 요즘은 javascript 공부를 하며 코드를 기록하기 시작했다. 이력서도 다시 다듬었으며, 면접 복장을 준비하였다. 이제는 꾸준히 회사를 지원하고, 면접준비와 정처기 실기 준비를 조금씩 하려고 한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[ORA-00905: missing keyword]]></title>
            <link>https://velog.io/@oh-taehyun/ORA-00905-missing-keyword</link>
            <guid>https://velog.io/@oh-taehyun/ORA-00905-missing-keyword</guid>
            <pubDate>Wed, 02 Aug 2023 14:35:01 GMT</pubDate>
            <description><![CDATA[<p>프로그래머스에서 sql문제를 풀던 중 다음과 같은 에러를 발견했다.
먼저 작성한 코드를 보자</p>
<pre><code class="language-sql">SELECT WAREHOUSE_ID, WAREHOUSE_NAME,ADDRESS, CASE WHEN FREEZER_YN IS NULL THEN &#39;N&#39; ELSE FREEZER_YN AS &quot;FREEZER_YN&quot; FROM FOOD_WAREHOUSE WHERE WAREHOUSE_NAME LIKE &#39;%경기%&#39; ORDER BY WAREHOUSE_ID;</code></pre>
<p>이 코드는 경기도에 위치한 식품창고 목록을 출력하는 oracle sql문으로 냉동시설 여부(FREEZER_YN)가 &#39;NULL&#39;인 경우 N을 출력하게 만들어야 한다.
그런데 이 sql문을 그대로 제출할 경우 
<img src="https://velog.velcdn.com/images/oh-taehyun/post/7cce2d84-5bec-4544-96a4-2c6540533b91/image.png" alt="">
다음과 같은 오류가 발생한다.</p>
<p>이 오류는 키워드를 빼먹었을 때 발생하는 에러로 
나는 case when절에서 마지막에 END를 쓰지 않아 에러가 발생했다. 따라서 올바르게 고치면</p>
<pre><code class="language-sql">SELECT WAREHOUSE_ID, WAREHOUSE_NAME,ADDRESS, CASE WHEN FREEZER_YN IS NULL THEN &#39;N&#39; ELSE FREEZER_YN END AS &quot;FREEZER_YN&quot; FROM FOOD_WAREHOUSE WHERE WAREHOUSE_NAME LIKE &#39;%경기%&#39; ORDER BY WAREHOUSE_ID;</code></pre>
<p>이며, 결과는 </p>
<p><img src="https://velog.velcdn.com/images/oh-taehyun/post/9544987c-7c61-4812-b4a0-8bb54b48ad50/image.png" alt="">
아주 잘 나오는 것을 볼 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스]문자열 겹쳐쓰기 substring]]></title>
            <link>https://velog.io/@oh-taehyun/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%EB%AC%B8%EC%9E%90%EC%97%B4-%EA%B2%B9%EC%B3%90%EC%93%B0%EA%B8%B0-substring</link>
            <guid>https://velog.io/@oh-taehyun/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%EB%AC%B8%EC%9E%90%EC%97%B4-%EA%B2%B9%EC%B3%90%EC%93%B0%EA%B8%B0-substring</guid>
            <pubDate>Wed, 07 Jun 2023 13:51:59 GMT</pubDate>
            <description><![CDATA[<p>문제 설명
:문자열 my_string, overwrite_string과 정수 s가 주어집니다. 문자열 my_string의 인덱스 s부터 overwrite_string의 길이만큼을 문자열 overwrite_string으로 바꾼 문자열을 return 하는 solution 함수를 작성해 주세요.</p>
<p>풀이</p>
<pre><code class="language-java">class Solution {
    public String solution(String my_string, String overwrite_string, int s) {
        String answer = &quot;&quot;;
        int left = overwrite_string.length()+s;
        answer=my_string.substring(0,s)+overwrite_string+my_string.substring(left);
        return answer;
    }
}</code></pre>
<p>*substring
: java 사용중 문자열을 원하는 위치에서 잘라야 하는 경우 사용하는 함수</p>
<p>예시
*substring(index)</p>
<pre><code class="language-java">String str=&quot;섭스트링 문자열겹치기&quot;
System.out.println(str.substring(5));</code></pre>
<p>-&gt;&#39;문자열겹치기&#39;가 출력된다.</p>
<p>*substring(int beginIndex, int endIndex)</p>
<pre><code class="language-java"> String str = &quot;섭스트링 문자열겹치기&quot;
 System.out.println(str.substring(2,7));</code></pre>
<p>-&gt;&#39;트링 문자&#39;가 출력된다.</p>
<p>출처
<a href="https://velog.io/@yeji6973/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%EB%AC%B8%EC%9E%90%EC%97%B4-%EA%B2%B9%EC%B3%90%EC%93%B0%EA%B8%B0">https://velog.io/@yeji6973/프로그래머스-코딩테스트-문자열-겹쳐쓰기</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로그래머스 카운트업]]></title>
            <link>https://velog.io/@oh-taehyun/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%B9%B4%EC%9A%B4%ED%8A%B8%EC%97%85</link>
            <guid>https://velog.io/@oh-taehyun/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%B9%B4%EC%9A%B4%ED%8A%B8%EC%97%85</guid>
            <pubDate>Wed, 31 May 2023 14:42:33 GMT</pubDate>
            <description><![CDATA[<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/181920">https://school.programmers.co.kr/learn/courses/30/lessons/181920</a>
문제 설명
정수 start와 end가 주어질 때, start부터 end까지의 숫자를 차례로 담은 리스트를 return하도록 solution 함수를 완성해주세요.</p>
<p>제한사항
0 ≤ start ≤ end ≤ 50</p>
<p>나의 풀이</p>
<pre><code class="language-java">class Solution {
    public int[] solution(int start, int end) {
        int[] answer = new int[end-start+1];
        for(int i=0;i&lt;answer.length;i++){
            answer[i]=start;
            start=start+1;
        }
        return answer;
    }
}</code></pre>
<p>새롭게 알게된 풀이</p>
<pre><code class="language-java">import java.util.stream.IntStream;

class Solution{
    public int[] solution(int start, int end){
        return IntStream.rangeClosed(start,end).toArray();
    }
}</code></pre>
<p>*기본형 특화 스트림
스트림 API는 박싱 비용을 피할 수 있도록 IntStream, DoubleStream, LongStream을 제공한다.</p>
<p>IntStream사용법</p>
<pre><code class="language-java">import java.util.stream.IntStream;
public class IntStreamRange{
    public static void main(String[]args){
        System.out.println(&quot;range:&quot;);
        Intstream.range(0,10).forEach(System.out::println);

        System.out.println(&quot;rangeClosed:&quot;);
        IntStream.rangeClosed(0,10).forEach(System.out::println);

        System.out.println(&quot;sum:&quot;);
        System.out.println(IntStream.range(0,10).sum());

        System.out.println(&quot;max:&quot;);
        System.out.println(IntStream.range(0,10).max());

        System.out.println(&quot;min:);
        System.out.println(IntStream.range(0,10).average());

        System.out.println(&quot;average:&quot;);
        System.out.println(IntStream.range(0,10).average());
    }
}</code></pre>
<p>range()는 종료 값을 포함하지 않으며, rangeClose()는 종료값을 포함한다.</p>
<p>출처
<a href="https://www.devkuma.com/docs/java/stream-api/int-stream/">https://www.devkuma.com/docs/java/stream-api/int-stream/</a>
<a href="https://cornswrold.tistory.com/545">https://cornswrold.tistory.com/545</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로그래머스 자릿수 더하기]]></title>
            <link>https://velog.io/@oh-taehyun/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%9E%90%EB%A6%BF%EC%88%98-%EB%8D%94%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@oh-taehyun/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%9E%90%EB%A6%BF%EC%88%98-%EB%8D%94%ED%95%98%EA%B8%B0</guid>
            <pubDate>Fri, 26 May 2023 07:57:27 GMT</pubDate>
            <description><![CDATA[<p>문제
정수 n이 매개변수로 주어질 때 n의 각 자리 숫자의 합을 return하도록 solution함수를 완성해주세요</p>
<p>풀이방법</p>
<ol>
<li>주어지는 정수 n을 Integer.toString()메서드를 통해 문자화 해 String str참조변수에 저장한다.</li>
<li>int형의 배열 arr객체를 생성한다.</li>
<li>for문을 돌려 stirng타입으로 받은 문자열을 char타입으로 만든뒤 int형으로 바꿔 arr배열에 각각 저장한다.</li>
<li>for문을 돌려 answer에 arr안에 있는 숫자들을 모두 더해준다.</li>
</ol>
<p>답</p>
<pre><code class="language-java">class Solution {
    public int solution(int n) {
        String str = Integer.toString(n);
        int[]arr = new int[str.length()];
        for(int i=0; i &lt;str.length();i++){
            arr[i]=str.charAt(i) -&#39;0&#39;;
        }
        int answer=0;
        for(int i=0;i&lt;arr.length;i++){
            answer=answer+arr[i];
        }

        return answer;
    }
}</code></pre>
<p>*Integer.toString()
가장 많이 사용하는 숫자를 문자로 변환하는 형변환 방법. 
사용법</p>
<pre><code class="language-java">int num = 123;
String str1 = Integer.toString(num);</code></pre>
<p>다른 방법으로는 String.valueOf()를 사용할 수 있다.</p>
<p>*charAt()
String 타입으로 받은 문자열을 char타입으로 한 글자만 받는 함수.
주로 scanner와 같이 응용되어 사용됨</p>
<p>사용법</p>
<ol>
<li><p>문자열 받기</p>
<pre><code class="language-java">public class charat문자받기{
 public static void main(String[] args){

     String str = &quot;Hello&quot;;
     for(int i=0;i&lt;str.length();i++){
         System.out.print(str.charAt(i)+&quot; &quot;);
         }
         System.out.println();

 }
}</code></pre>
</li>
<li><p>숫자 받기
숫자형 문자를 charAt함수로 추출하면 char형이므로 int형으로 변환하려면 아스키코드로 변환된다.
그래서 &#39;0&#39;또는 &#39;48&#39;을 빼줘야 의도대로 계산할 수 있다.</p>
<pre><code class="language-java">public class charat숫자받기{
  public static void main(String[] args){

      String str = &quot;12345&quot;;
      for(int i=0;i&lt;str.length();i++){
          System.out.print((str.charAt(i)-&#39;0&#39;)+&quot; &quot;);
          }
          System.out.println();
  }
}</code></pre>
<p>출처: 
<a href="https://yeoncoding.tistory.com/418">https://yeoncoding.tistory.com/418</a>
<a href="https://gocoder.tistory.com/2412">https://gocoder.tistory.com/2412</a>
<a href="https://crazykim2.tistory.com/412">https://crazykim2.tistory.com/412</a>
<a href="https://junghn.tistory.com/entry/%EC%9E%90%EB%B0%94-int%EB%A5%BC-%EC%9E%90%EB%A6%BF%EC%88%98%EB%B3%84-int-%EB%B0%B0%EC%97%B4%EB%A1%9C-%EB%B6%84%ED%95%A0">https://junghn.tistory.com/entry/자바-int를-자릿수별-int-배열로-분할</a>
<a href="https://school.programmers.co.kr/learn/courses/30/lessons/120906">https://school.programmers.co.kr/learn/courses/30/lessons/120906</a></p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[final 자바 웹project 포트폴리오]]></title>
            <link>https://velog.io/@oh-taehyun/final-%EC%9E%90%EB%B0%94-%EC%9B%B9project-%ED%8F%AC%ED%8A%B8%ED%8F%B4%EB%A6%AC%EC%98%A4</link>
            <guid>https://velog.io/@oh-taehyun/final-%EC%9E%90%EB%B0%94-%EC%9B%B9project-%ED%8F%AC%ED%8A%B8%ED%8F%B4%EB%A6%AC%EC%98%A4</guid>
            <pubDate>Thu, 13 Apr 2023 09:52:50 GMT</pubDate>
            <description><![CDATA[<h3 id="1-프로젝트-소개">1. 프로젝트 소개</h3>
<p>서비스 이름: 묘미
개발기간
1차: 2023년 1월 3일~ 1월 24일
2차: 2023년 1월 31일-2023년 3월 14일</p>
<h3 id="목적">목적:</h3>
<ol>
<li><p>spring data JPA 학습
스프링 Data JPA를 이용한 정기배송 쇼핑몰 서비스를 만들어 보면서 JPA 개발      구조를 익히고자 한다.</p>
</li>
<li><p>한 단계 발전한 정기배송 서비스
기존 정기배송은 샐러드, 도시락, 밀키트 등이 한번에 정기 주문할 수 있는 사이    트를 찾기 힘든데 묘미는 샐러드/도시락/밀키트를 주 단위로 한번에 주문할 수 있    고, 배송비, 적립금, 회원 혜택을 누리며 맛과 혜택을 둘 다 즐길 수 있도록 만들    고자함</p>
</li>
<li><p>웹 프로젝트 설계 과정 학습
프로그램을 구현하기 위해 DB설계, Backend, Frontend 모든 개발 과정에 직접      참여하고 Spring, Bootstrap 등을 이용해 전반적인 웹 사이트 설계 과정을 학      습.</p>
<h3 id="개발환경">개발환경</h3>
<p>● 개발 OS: Windows, MacOS
● DBMS: Oracle 11g
● Web: HTML5, CSS, JavaScript, jQUery, AJAX
● 개발도구: Eclipse 4.26.0, VisualStudio 1.76.1
● 웹서버: Apache Tomcat 9.0
● 데이터베이스 툴 및 모델링 : SQL Developer, eXERD
● 개발 언어 : Java11
● 프레임워크: Spring FrameWork 5.3.25, Springboot 5.7.6, Spring Data                 JPA 5.7.6
● 라이브러리: Web socket5.3.25, Bootstrap 5, amazon s3, queryDSL                      5.0,spring security 5.7.6,spring swagger2-                              2.9.2,spring-security-oauth2 5.7.6, Lombok, Junit
● 협업관리 툴: github
● 프로젝트관리 툴: Notion
팀원: 5명</p>
<p>내가 맡은 기능: 리뷰, 공지사항, 관리자</p>
</li>
</ol>
<p>read me 파일: <a href="https://github.com/oh-taehyun/myomibackend/blob/main/README.md">https://github.com/oh-taehyun/myomibackend/blob/main/README.md</a></p>
<p>기타
<img src="https://velog.velcdn.com/images/oh-taehyun/post/735afd24-fc58-495e-9bbb-3dc1bfbbc9e0/image.png" alt="">
<img src="https://velog.velcdn.com/images/oh-taehyun/post/9df8c68c-f9e0-430b-be6d-663a589ede58/image.png" alt="">
<img src="https://velog.velcdn.com/images/oh-taehyun/post/62005d83-b496-4318-9bc4-f1767cb6bba3/image.png" alt="">
<img src="https://velog.velcdn.com/images/oh-taehyun/post/4b009dae-a266-4b82-a586-1f0256d783ad/image.png" alt="">
<img src="https://velog.velcdn.com/images/oh-taehyun/post/b72f3d08-3020-4dfa-a52e-f290121b61fa/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[면접준비(9)http]]></title>
            <link>https://velog.io/@oh-taehyun/%EB%A9%B4%EC%A0%91%EC%A4%80%EB%B9%8410http</link>
            <guid>https://velog.io/@oh-taehyun/%EB%A9%B4%EC%A0%91%EC%A4%80%EB%B9%8410http</guid>
            <pubDate>Thu, 13 Apr 2023 05:36:22 GMT</pubDate>
            <description><![CDATA[<p>HTTP 프로토콜(HyperText Transfer Protocol): 인터넷상에서 데이터를 주고 받기 위한 서버/클라이언트 모델을 따르는 프로토콜
TCP/IP위에서 작동함</p>
<p>클라이언트에서 요청(request)을 보내면 서버는 요청을 처리해서 응답(response)함</p>
<p>작동방식의 특징
HTTP는 connectionless방식으로 작동함. 서버에 연결하고, 요청해서 응답을 받으면 연결을 끊어버린다. 자원 하나에 대해서 하나의 연결을 만든다.</p>
<p>장점: 불특정 다수를 대상으로 하는 서비스에 적합한 방식. 많은 사람들이 웹 서비스를 사용해도 접속유지는 최소한으로 할 수 있기 때문에, 더 많은 유저의 요청을 처리할 수 있다.</p>
<p>단점: 연결을 끊어버리기 때문에, 클라이언트의 이전 상태를 알 수 없다. 이런 특징을 stateless라고 함. 클라이언트의 이전 상태 정보를 알 수 없게 되면, 웹 서비스를 하는데 문제가 생김. 로그인을 성공해도 로그 정보를 유지할 수 없다. 
-&gt;쿠키를 통해 해결가능</p>
<p>Request Message
공백을 제외하고 3가지 부분으로 나눠짐
startline
headers
body</p>
<p>1.start line
Http Request Message의 시작 라인으로 3가지 부분으로 구성됨</p>
<p>Http method
Request target
HTTP version</p>
<blockquote>
<p>Get/test.html Http/1.1
[Http Method] [Request target] [Http version]</p>
</blockquote>
<p>HTTP method
 -GET, POST, PUT, DELETE 등으로 이뤄져 있음
 GET은 존재하는 자원에 대한 요청을, POST는 새로운 자원을 생성하는 기능을, PUT은   존재하는 자원에 대한 변경을, DELETE는 존재하는 자원에 대한 삭제와 같은 기능을   가지고 있음.
  나중에 더 자세히 다룰 예정 </p>
<p>Request target은 HTTP Request가 전송되는 목표 주소</p>
<p>HTTP version은 version에 따라 Request 메시지 구조나 데이터가 다를 수 있어서 Version을 명시함</p>
<ol start="2">
<li>headers
해당 request에 대한 추가정보를 담고 있는 부분
ex. request 메시지, body의 총길이 등 key:value 형태로 구성됨
header도 크게 3가지로 구분됨. general headers, request headers, entity     headers)<blockquote>
<p>  Host: google.com
Accept: text/html
Accept-Encoding: gzip,deflate
Connection: keep-alive
...</p>
</blockquote>
</li>
</ol>
<p>1)Host: 요청하려는 서버 호스트 이름과 포트번호
2)User-agent: 클라이언트 프로그램 정보. 이 정보를 통해 서버는 클라이언트 프로그램(브라우저)에 맞는 최적의 데이터를 보내줄 수 있음
3)Referer: 바로 직전에 머물렀던 웹 링크 주소
4)Accept: 클라이언트가 처리 가능한 미디어 타입 종류 나열
5)If-modified-Since: 여기에 쓰여진 시간 이후로 변경된 리소스 취득. 페이지가 수정되었으면 최신 페이지로 교체.
6)Authorization: 인증 토큰을 서버로 보낼 때 쓰이는 Header
7)Origin: 서버로 Post요청을 보낼 때 요청이 어느 주소에 시작되었는지 나타내는 값. 이 값으로 요청을 보낸 주소와 받는 주소가 다르면 CORS(Cross-Origin Resource Sharing)에러가 발생함.</p>
<p>참고하면 좋은 자료: 
<a href="https://inpa.tistory.com/entry/WEB-%F0%9F%93%9A-CORS-%F0%9F%92%AF-%EC%A0%95%EB%A6%AC-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95-%F0%9F%91%8F?category=889117">https://inpa.tistory.com/entry/WEB-📚-CORS-💯-정리-해결-방법-👏?category=889117</a>
<a href="https://inpa.tistory.com/entry/AXIOS-%F0%9F%93%9A-CORS-%EC%BF%A0%ED%82%A4-%EC%A0%84%EC%86%A1withCredentials-%EC%98%B5%EC%85%98">https://inpa.tistory.com/entry/AXIOS-📚-CORS-쿠키-전송withCredentials-옵션</a></p>
<p>8)Cookie: 쿠키 값이 key-value로 표현됨</p>
<ol start="3">
<li><p>body
HTTP Request가 전송하는 데이터를 담고 있는 부분
전송하는 데이터가 없다면 body 부분은 비어있음
보통 post 요청인 경우, HTML 폼 데이터가 포함됨</p>
<pre><code class="language-HTTP">POST /test HTTP/1.1
Accept: application/json
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Length:83
Content-Type: application/json
Host: google.com
User-Agent: HTTPie/0.9.3
{
&quot;test_id&quot; : &quot;tmp_12345&quot;,
&quot;order_id: &quot;8237352&quot;
}</code></pre>
</li>
</ol>
<p>Response Message</p>
<p>HTTP Response Message도 request와 동일하게 공백 제외하고 3부분으로 나눠진다.
 Status Line
 Headers
 Body</p>
<ol>
<li><p>Status line
HTTP Response의 상태를 간략하게 나타내주는 부분으로 3가지 부분으로 구성됨</p>
<p>HTTP version, Status Code, Status Text</p>
</li>
</ol>
<pre><code class="language-HTTP">Http/1.1 200 OK
[HTTP version][Status Code][Status Text]</code></pre>
<ol start="2">
<li><p>headers
Request의 headers와 동일함
다만 response에서만 사용되는 header 값들이 있음.
ex. User-Agent 대신에 Server 헤더가 사용됨.</p>
</li>
<li><p>body</p>
</li>
</ol>
<p>Request의 body와 일반적으로 동일함
데이터를 전송할 필요가 없을 경우 body가 비어있게 된다.</p>
<p>http와 https의 차이점
: HTTP는 암호화되지 않은 데이터를 전송함. 즉, 브라우저에서 전송된 정보를 제 3자가 가로채고 읽을 수 있다. 
HTTPS는 HTTP 요청 및 응답을 SSL 및 TLS 기술에 결합함
HTTPS 웹사이트는 독립된 인증 기관에서 SSL/TLS 인증서를 획득해야 함. HTTPS 웹사이트는 신뢰 구축을 위해 데이터를 교환하기 전에 브라우저와 인증서를 공유함. SSL 인증서는 암호화 정보도 포함하므로 서버와 웹 브라우저는 암호화된 데이터나 스크램블 된 데이터를 교환할 수 있다. </p>
<p>HTTP의 버전
-HTTP/1.1이 최초의 HTTP버전. HTTP/2와 HTTP/3은 프로토콜 자체를 업그레이드한 버전. HTTP/2는 텍스트 형식 대신, 바이너리로 데이터를 교환함. 또, 서버가 새 HTTP요청을 기다리는 대신, 클라이언트 캐시에 응답을 사전 전송할 수 있다. HTTP/3은 실시간 스트리밍 및 기타 최신 데이터 전송 요구 사항을 보다 효율적으로 지원하는 목적을 가진 버전.
HTTPS는 HTTP에서 데이터 보안 문제를 우선시함. 최신 시스템은 SSL/TLS와 함께 HTTP/2를 HTTPS로 사용함.  브라우저는 브라우저 주소 표시줄에서 웹 사이트 URL 옆에 있는 자물쇠 아이콘을 배치하여 사용자에게 HTTPS 연결을 표시함
보안적 장점 외에도 HTTPS는 HTTP애플리케이션보다 로드 속도가 더 빠름. 참조 링크도 더 잘 추적함. 추천 트래픽(광고 또는 소셜 미디어 백링크와 같은 서드 파티 소스에서 생성되는 웹 사이트 트래픽)소스도 더 정확하게 식별할 수 있음.</p>
<p>+HTTPS 설정 비용은 다 유료인가?
-&gt;NO! 무료 SSL인증서를 획득할 수있는 많은 출처가 있음
ex. Amazon Web Services에서는 AWS Certificate Manager를 제공함. </p>
<p>http와 https 비교 표(출처: <a href="https://aws.amazon.com/ko/compare/the-difference-between-https-and-http/">https://aws.amazon.com/ko/compare/the-difference-between-https-and-http/</a>)
<img src="https://velog.velcdn.com/images/oh-taehyun/post/d009306c-4b4d-4233-a35a-ef24a42c336e/image.png" alt=""></p>
<p>cache: 자주 사용하는 데이터나 값을 미리 복사해 놓는 임시 장소. 캐시는 저장공간이 작고 비용이 비싼 대신 빠른 성능을 제공함</p>
<p> 캐시를 사용하면 좋은 경우
 -접근 시간에 비해 원래 데이터를 접근하는 시간이 오래 걸리는 경우(서버의 균일한 API 데이터)
 -반복적으로 동일한 결과를 돌려주는 경우(이미지나 썸네일)</p>
<p> 장점: Cache에 데이터를 미리 복사하면 계산이나 접근 시간 없이 더 빠른 속도로 데이터 접근 가능. Enterprise급 애플리케이션에서는 반복적으로 데이터를 불러오는 경우, 지속적으로 DBMS 혹은 서버에 요청하는게 아니라 Memory에 데이터를 저장했다가 불러다 쓸 수 있어서 캐시를 사용하고 있음. </p>
<p> *Cache Hit와 Cache Miss
 원하는 데이터가 캐시에 존재할 경우 해당 데이터를 반환하며, 이러한 상황을 Cache Hit라고 한다.
 하지만 원하는 데이터가 캐시에 존재하지 않을 경우 DBMS 또는 서버에 요청을 해야하며 이를 Cache Miss라고 한다.</p>
<p>Cache-Control
: Cache-Control은 HTTP에서 캐시 메커니즘을 지정하기 위해 사용되는 헤더이다. 많은 디렉티브가 있지만, max-age 라는 디렉티브를 사용하면 캐시의 최대 수명을 설정할 수 있다. max-age의 단위는 초이다.</p>
<pre><code class="language-HTTP">Http/1.1 200 OK
Content-Type: Text/html
Cache-Control: max-age=3600
Content-Length: 157</code></pre>
<p>웹 브라우저가 특정 리소스에 최초로 요청한 경우 서버는 Cache-Control 헤더가 포함된 응답을 보냄. 위의 응답을 받은 웹 브라우저는 응답 결과를 3600초, 1시간 동안 캐시에 저장함.</p>
<p>이후 웹 브라우저가 같은 리소스에 요청을 보낼 시, 실제 웹서버가 아닌 캐시에 저장한 사본 데이터를 사용자에게 제공함.</p>
<p>max-age 디렉티브에 명시한 캐시 유효 시간이 지난 이후 동일 리소스를 요청하면, 그땐 다시 실제 웹 서버에 리소스를 요청함. 이 때, 캐시된 데이터가 유효 시간을 아직 넘기지 않은 경우 신선하다(fresh)라고 표현하며, 캐시시간이 초과된 경우는 신선하지 않다(stale)라고 표현함.</p>
<p>pragma
서버가 캐싱을 처리하는 방식을 제어하는데 사용되는 HTTP/1.0 헤더.
사용 중단된 기능이며, 이 헤더는 Cache-Control HTTP/1.1 헤더가 없는 HTTP/1.0 캐시와의 하위 호환성을 위해 사용됨</p>
<p>문법: pragma: no-cache
Cache-Control:no-cache와 동일함.</p>
<p>cookie와 session</p>
<p>1.cookie
쿠키는 HTTP 통신을 기반으로 하며 브라우저에서 돌아가는 웹사이트나 웹애플리케이션에서 널리 사용됨. 
한마디로 정의하면 서버가 어떤 데이터를 브라우저 측에 저장한 후 다시 그 데이터를 받아오는 기술 또는 그 데이터 자체를 뜻함. 이 때 쿠키의 제대로된 작동을 위해서는 브라우저의 역할이 제일 중요함.</p>
<p>쿠키의 매커니즘: 쿠키 데이터의 모양을 보면 &lt;이름&gt;=&lt;값&gt; 형태를 지니는 문자열임을 볼 수 있음. 서버와 브라우저는 기본적으로 HTTP 메시지 안에 쿠키를 담아서 주고 받음.
클라이언트 서버 모델에서는 서버가 클라이언트의 요청없이 클라이언트로 데이터를 보낼 수 없다. 따라서 이런 쿠키 전달 과정은 서버가 클라이언트 요청에 응답할 때 일어나게 됨. 하나의 Set-Cookie 응답 헤더에는 하나의 쿠키만 담을 수 있어서 여러개의 쿠키를 보낼 땐 아래와 같은 모습이 됨.
Set-Cookie: &lt;이름&gt;=&lt;값&gt;
Set-Cookie: &lt;이름&gt;=&lt;값&gt;
Set-Cookie: &lt;이름&gt;=&lt;값&gt;</p>
<p>서버로 부터 쿠키를 응답받은 브라우저는 해당 쿠키를 클라이언트 컴퓨터의 하드디스크에 저장함. 그리고 브라우저가 동일 서버에 요청을 하면 저장한 쿠키를 Cookie라는 요청 헤더에 실어서 돌려 보냄.
Cookie 요청 헤더에서 여러개의 쿠키를 나열할 때는 ;로구분함</p>
<p>Cookie: &lt;이름&gt;=&lt;값&gt;;&lt;이름&gt;=&lt;값&gt;;&lt;이름&gt;=&lt;값&gt;</p>
<p>서버는 일회성 작업으로 Set-Cookie 헤더를 통해 브라우저로 쿠키를 보내지만, 브라우저가 Cookie 헤더를 통해 서버로 쿠키를 돌려 보내는 것은 일정 시간동안 반복해서 수행되는 작업임.</p>
<p>쿠키는 유효기간이 별도로 명시되지 않으면 세션이 종료될 때 함께 만료됨. 반면, 유효기간이 명시되어있는 영속 쿠키는 특정 기간이나 특정 시점까지 유효함. 
명시 방법은 Set-Cookie 응답 헤더에 Expires 속성이나 Max-Age 속성을 사용하면 됨</p>
<p>Set-Cookie: &lt;쿠키 이름&gt;=&lt;쿠키 값&gt;; Expires=종료 시점
Set-Cookie: &lt;쿠키 이름&gt;=&lt;쿠키 값&gt;; Max-Age=유효기간</p>
<p>쿠키의 한계
1)쿠키는 유실되기 쉽다
2)쿠키는 변조되기 쉽다
3)쿠키는 도난되기 쉽다</p>
<p>그럼에도 쿠키를 사용하는 이유
1)쿠키는 대규모 서비스에서 사용자 기반으로 부하분산(load balancing)이 필요할 때 큰 역할을 함.
쿠키를 활용하면 어렵지 않게 사용자를 고려하여 부하 분산을 할 수 있음. 
  -자세한 건 본 글의 쿠키에 대한 출처 중 하나인 <a href="https://www.daleseo.com/http-session/">https://www.daleseo.com/http-session/</a> 에 나옴.</p>
<p>2)쿠키와 세션은 상호 보완을 함
쿠키의 단점은 브라우저에 저장하기 때문에 유실/변조/도난되기 쉽다.
세션은 이에 비해 서버 측에서 관리 되기 때문에 위와 같은 위험이 적다.
그런데 세션은 서버당 하나만 유지할 수 있고 브라우저가 종료되면 세션데이터가 날아간다는 단점이 있다. 쿠키는 이 단점을 보완해준다.
서버에서 세션을 생성하면 그 세션을 식별할 수 있는 식별자 세션아이디를 얻는데 이 세션 아이디를 쿠키로 브라우저에 응답해주면 브라우저는 매번 요청을 보낼 때마다 세션아이디가 담긴 쿠키를 서버로 돌려보내게 됨. 서버에서는 이 세션 아이디에 해당하는 세션이 존재하는지만 확인해주면 됨.</p>
<p>HTTP 응답
HTTP/1.1 302 Found
Content-Type: text/html
Location: <a href="https://www.test.com/">https://www.test.com/</a>
Set-Cookie: SessionId=a3ee77w34e2</p>
<p>HTTP요청
GET/HTTP/1.1
Host: <a href="http://www.test.com">www.test.com</a>
Cookie: sessionId=a3ee77w34e2</p>
<p>*세션 개념설명</p>
<p>일정 시간(방분자가 웹브라우저를 통해 웹 서버에 접속한 시점으로부터 웹 브라우저를 종료하여 연결을 끝내는 시점)동안 같은 사용자로부터 들어오는 일련의 요구를 하나의 상태로 보고 그 상태를 일정하게 유지시키는 기술. </p>
<p>특징</p>
<ol>
<li>웹 서버에 컨테이너의 상태를 유지하기 위한 정보를 저장함</li>
<li>웹서버에 저장되는 쿠키</li>
<li>브라우저를 닫거나, 서버에서 세션을 삭제했을 때만 삭제가 되므로, 쿠키보다 보안이 좋다</li>
<li>저장 데이터에 제한이 없음</li>
<li>각 클라언트 고유 SessionID를 부여함. Session ID로 클라이언트를 구분해 각 클라언트 요구에 맞는 서비스 제공</li>
</ol>
<p>*세션과 쿠키 비교(출처: <a href="https://velog.io/@seunghwa17/Session%EA%B3%BC-Cookie%EC%9D%98-%EC%B0%A8%EC%9D%B4">https://velog.io/@seunghwa17/Session과-Cookie의-차이</a>)
<img src="https://velog.velcdn.com/images/oh-taehyun/post/bd513284-d254-49d8-943c-022f9fc5b9f1/image.png" alt=""></p>
<p>web storage
: 웹 스토리지는 서버가 아닌, 클라이언트에 데이터를 저장할 수 있도록 지원하는 HTML5의 새로운 기능. 쿠키는 약 4kb까지 밖에 저장 공간을 이용하지 못하는 반면 웹 스토리지는 약 5MB까지 저장공간을 이용할 수 있다.
주의점은 문자형 데이터 타입만 지원한다는 것이다.</p>
<p>웹 스토리지는 로컬 스토리지와 세션 스토리지가 있음</p>
<p>1)로컬스토리지
: 로컬 스토리지는 브라우저에 반영구적으로 데이터를 저장하며, 브라우저를 종료해도 데이터가 유지됨. 그런데 도메인이 다른 경우에는 로컬 스토리지에 접근할 수 없음
사용법: key와 value 저장
localStorage.setItem(key,value);
사용예시</p>
<pre><code class="language-javascript">localStorage.setItem(&#39;item1&#39;,10);
localStorage.setItem(&#39;item2&#39;,&#39;new item&#39;);
localStorage.setItem(&#39;item3&#39;,0.543534);

//불러올 때
localStorage.getItem(&#39;item1&#39;);

//키의 데이터를 삭제할 때
localStorage.removeItem(&#39;item1&#39;);

//모든 키의 데이터 삭제
localStorage.clear();</code></pre>
<p>2)세션 스토리지
세션 스토리지는 각 세션마다 데이터가 개별적으로 저장됨. 브라우저에서 여러개의 탭을 실행하면 탭마다 개별적으로 데이터가 저장되는 것을 볼 수 있다. 로컬스토리지와의 차이점은 세션스토리지는 세션을 종료하면 데이터가 자동으로 제거되면, 같은 도메인이라도 세션이 다르면 데이터에 접근할 수 없다는 것이다. </p>
<p>사용법 : key와 value 저장
sessionStorage.setItem(key,value)</p>
<pre><code class="language-javascript">sessionStorage.setItem(&quot;key1&quot;,10);
var n = sessionStorage.getItem(&quot;key1&quot;);</code></pre>
<p>proxy 서버</p>
<p>1)개념
컴퓨터 네트워크에서 다른 서버 상의 자원을 찾는 클라이언트로부터 요청을 받아 중계하는 서버. 대부분의 프록시는 웹 프록시를 말함. 컴퓨터 네트워크에서 다른 서버로의 자원 요청을 중계하며 분산 시스템 구조를 단순화하여 서비스의 복잡도를 줄일 수 있음.</p>
<p>2)사용목적
(1)익명으로 컴퓨터를 유지할 수 있다.
(2)네트워크 서비스나 콘텐츠로의 접근 정책을 적용하기 위해서 사용(ex. 원치 않는 사이트 차단)
(3)보안 및 통제를 뚫고 나가기 위해 사용할 수 있다. 역으로 IP추적을 당하지 않을 목적으로 사용한다.
(4)캐시를 사용하여 리소스로의 접근을 빠르게 하기 위해. 웹 프록시는 웹 서버로부터 웹 페이지를 캐시로 저장하는데 흔히 쓰임
(5)전달에 앞서 악성 코드를 목적으로 전달된 콘텐츠를 검사하기 위함
(6)밖으로 나가는 콘텐츠를 검사하기 위함(데이터 유출 보호)</p>
<p>3)종류
(1)포워드 프록시
 :프록시 서버가 클라언트와 원격 서버 사이의 네트워크 상 어디에든 위치할 수 있다. 클라이언트는 원격의 목적지 서버의 주소를 기반으로 자원을 요청하고 프록시 서버는 그 주소를 받아 목적지 서버에 연결을 하고 자원을 가져옴. 
(2)리버스 프록시
 :프록시 서버가 사설 네트워크 상의 서버들 바로 앞단의 프론트엔드에 위치하여 서버들을 제어하고 보호함. 클라이언트는 리버스 프록시 서버의 주소를 목적지 서버로 하여 데이터를 요청함.리버스 프록시는 보안이나 암호화를 위해서 사용되기도 하고, 뒷단의 서버들에 대한 요청을 로드밸런싱을 위해 사용되기도 함.</p>
<p> *로드밸런싱? 출처: <a href="https://www.daleseo.com/http-session/">https://www.daleseo.com/http-session/</a>
 수많은 사용자들로 부터 동시에 들어오는 요청을 처리하려면 일반적으로 여러 대의 서버를 운영할 수 밖에 없는데요. 이런 경우 서버 앞 단에 로드 밸런서(load balancer)를 두고 부하가 여러 대의 서버로 골고루 분산될 수 있도록 인프라를 구성합니다.</p>
<p>(3)오픈 프록시
 : 모든 인터넷 사용자가 엑세스 할 수 있는 프록시 서버로 공개 프록시를 사용하면 자신의 IP주소를 남기지 않고 익명으로 활동할 수 있다. </p>
<p>Developer tools&gt; Network
 :Chrome DevTool의 Network tab은 리소스가 올바르게 업로드/다운로드가 되었는지 확인이 필요할 때, 리소스의 HTTP header, 사이즈 등등의 부가적인 metadata를 검사할 때 대표적으로 사용된다.
 Tip 1
 더많은 정보 표시
 : 네트워크 로그 테이블을 우 클릭하고 숨겨져있는데 필요한 정보칸예를 들어 Domain, Connection ID, Path 등을 선택할 수 있음</p>
<p> Tip 2
 느린 네트워크 상황 시뮬레이션
 : 의도적으로 네트워크 상황을 느리게 하여 느린 네트워크 환경에 있는 유저들의 유저경험을 간접적으로 체험/확인할 수 있다.</p>
<p> Tip3
 HAR File: 네트워크로그를 파일형태로 import/export
 HAR 파일은 HTTP 문서의 약자로 웹 사이트의 트래킹 정보에 대해 담고 있는 파일이다. HAR파일은 프론트엔드 개발자가 백엔드 개발자와 대화할 때 가장 유용하게 쓰인다. </p>
<p> Tip4
 페이지 로딩시 로그기록 저장
 f5 눌러서 refresh 해도 로그기록이 날라가지 않게 하려면 preserve log체크박스를 누르면 된다.</p>
<p> Tip 5
 XHR비동기 Request 다시 보내기
 :Request 기록 테이블에서 해당 XHR request를 우-클릭해서 XHR 비동기 request를 다시 보낼 수 있다.</p>
<p> TIP 6 커스텀 정보칸 표시
 Request 테이블의 머릿말을 우클릭 하여 Response Headers&gt;Manager Header Columns 을 선택하면 커스텀 정보칸을 표시할 수 있다.</p>
<p> tip 7
 캐시 로딩
 : devtool을 연상태에서 reload 아이콘을 1초~2초간 누르고 있으면 3가지 로딩 옵션이 가능함. 일반로딩과 하드로딩의 차이점은 캐시의 사용유무에 있음</p>
<p> 일반적으로 F5 누른 로딩이 일반로딩, 자바스크립트 파일, 이미지, 텍스트 등의 resource 등의 캐시 없이 매번 다시 다운로드를 하는게 하드로딩
 이는 유저의 초반 렌더링 속도를 확인하는데 유용하다.</p>
<p>wireshark
-나중에 알아볼 예정</p>
<p>출처:</p>
<ol>
<li>http요약 <a href="https://hahahoho5915.tistory.com/62">https://hahahoho5915.tistory.com/62</a></li>
<li>http와 https 차이점 <a href="https://aws.amazon.com/ko/compare/the-difference-between-https-and-http/">https://aws.amazon.com/ko/compare/the-difference-between-https-and-http/</a></li>
<li>Cache란? <a href="https://mangkyu.tistory.com/69">https://mangkyu.tistory.com/69</a></li>
<li>Http 캐시(Cache-Control,유효성 검증 및 조건부 요청 등)
<a href="https://hudi.blog/http-cache/">https://hudi.blog/http-cache/</a></li>
<li>pragma
<a href="https://runebook.dev/ko/docs/http/headers/pragma">https://runebook.dev/ko/docs/http/headers/pragma</a></li>
<li>쿠키 1부: HTTP로 설명하는 쿠키(cookie)
<a href="https://www.daleseo.com/http-cookies/">https://www.daleseo.com/http-cookies/</a></li>
<li>쿠키 2부: 세션은 쿠키가 필요해~
<a href="https://www.daleseo.com/http-session/">https://www.daleseo.com/http-session/</a></li>
<li>Session과 Cookie의 차이
<a href="https://velog.io/@seunghwa17/Session%EA%B3%BC-Cookie%EC%9D%98-%EC%B0%A8%EC%9D%B4">https://velog.io/@seunghwa17/Session과-Cookie의-차이</a></li>
<li>웹 스토리지 (Web Storage)의 특성과 사용법
<a href="https://untitledtblog.tistory.com/47">https://untitledtblog.tistory.com/47</a></li>
<li>웹 스토리지 사용법
<a href="https://www.daleseo.com/js-web-storage/">https://www.daleseo.com/js-web-storage/</a></li>
<li>세션 스토리지 알고 사용하기
<a href="https://sub0709.tistory.com/55">https://sub0709.tistory.com/55</a></li>
<li>프록시 서버와 사용목적
<a href="https://dany-it.tistory.com/107">https://dany-it.tistory.com/107</a></li>
<li>프록시서버
<a href="https://ko.wikipedia.org/wiki/%ED%94%84%EB%A1%9D%EC%8B%9C_%EC%84%9C%EB%B2%84">https://ko.wikipedia.org/wiki/프록시_서버</a></li>
<li>네트워크 탭을 효율적으로 사용하기 위한 7가지팁
<a href="https://medium.com/%EB%82%B4%EC%9D%BC%EC%9D%98-%EC%9B%B9-%EA%B0%9C%EB%B0%9C/google-chrome-devtool-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%ED%83%AD%EC%9D%84-%ED%9A%A8%EC%9C%A8%EC%A0%81%EC%9C%BC%EB%A1%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-%EC%9C%84%ED%95%9C-7%EA%B0%80%EC%A7%80-%ED%8C%81-8d3166c5e273">https://medium.com/내일의-웹-개발/google-chrome-devtool-네트워크-탭을-효율적으로-사용하기-위한-7가지-팁-8d3166c5e273</a></li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[면접준비(8)쓰레드]]></title>
            <link>https://velog.io/@oh-taehyun/%EB%A9%B4%EC%A0%91%EC%A4%80%EB%B9%849%EC%93%B0%EB%A0%88%EB%93%9C</link>
            <guid>https://velog.io/@oh-taehyun/%EB%A9%B4%EC%A0%91%EC%A4%80%EB%B9%849%EC%93%B0%EB%A0%88%EB%93%9C</guid>
            <pubDate>Tue, 11 Apr 2023 11:21:26 GMT</pubDate>
            <description><![CDATA[<p>출처: 자바의 정석 3판 ch 13 쓰레드 p721~748
프로세스: 실행중인 프로그램, 자원과 쓰레드로 구성
쓰레드: 프로세스 내에서 실제 작업을 수행
       모든 프로세스는 최소한 하나의 쓰레드를 가지고 있다.</p>
<p>싱글 쓰레드프로세스
=자원+쓰레드</p>
<p>멀티 쓰레드 프로세스
=자원+쓰레드+쓰레드+...+쓰레드</p>
<p>멀티쓰레드의 장단점
장점
-시스템 자원을 보다 효율적으로 사용할 수 있다.
-사용자에 대한 응답성이 향상된다.
-작업이 분리되어 코드가 간결해 진다.</p>
<p>단점
-동기화에 주의해야 한다.
-교착상태가 발생하지 않도록 주의해야 한다.
-각 쓰레드가 효율적으로 고르게 실행될 수 있게 해야 한다.
    &quot;프로그래밍 할 때 고려해야 할 사항들이 많다.&quot;</p>
<p>쓰레드의 구현, 실행
구현
1)Thread클래스 상속
자바는 단일 상속이기 때문에 쓰레드를 상속받으면 다른 클래스를 상속받기 어렵다.</p>
<p>2)Runnable 인터페이스를 구현
인터페이스를 구현하면 다른 클래스도 상속 가능하기 때문에 thread클래스를 상속하는 것보다 유연하다.</p>
<pre><code class="language-java">class Main {
   public static void main(String args[]){
   ThreadEx1_1 t1 = new ThreadEx1_1();

   Runnable r = new ThreadEx1_2();
   Thread t2 = new Thread(r);

   t1.start();
   t2.start();
   }
}

class ThreadEx1_1 extends Thread{  //Thread클래스를 상속해서 쓰레드를 구현
    public void run() {
        for(int i=0;i&lt;5;i++){
            System.out.println(getName());//조상인 Thread의 getName()을 호출
        }
    }
}
class ThreadEx1_2 implements Runnable{  //Runnable인터페이스를 구현해서 쓰레드를 구현
  public void run(){
    for(int i=0;i&lt;5;i++){
        //Thread.currnetread()-현재 실행중인 Thread를 반환함
      System.out.println(Thread.currentThread().getName());
    }
  }
}</code></pre>
<p>실행-start()
-쓰레드를 생성한 후에 start()를 호출해야 쓰레드가 작업을 시작한다.
작업 실행 순서는 os스케줄러가 결정함</p>
<p>main쓰레드
-메인 메서드의 코드를 수행하는 쓰레드
-사용자 쓰레드, 데몬쓰레드 두종류가 있음
프로그램은 실행 중인 사용자 쓰레드가 하나도 없을 때 종료됨
ex. main 쓰레드가 있고 사용자 쓰레드 Thread1 Thread2가 있다면 main쓰레드가 종료되어도 사용자 쓰레드가 모두 종료되어야 프로그램이 종료된다.</p>
<p>멀티 쓰레드는 어떤 한 작업이 수행되는 동안 다른 외부적인 요인에 의해 멈춰있을 때도 다른 쓰레드가 작업을 수행할 수 있어서 작업을 효율적으로 빨리 끝낼 수 있다는 장점이 있다(I/O블락킹을 억제함).</p>
<p>쓰레드의 상태
1)New: 쓰레드가 생성되고 아직 start()가 호출되지 않은 상태
2)Runnable: 실행 중 또는 실행 가능한 상태
3)Blocked: 동기화블럭에 의해서 일시정지된 상태
4)Waiting, Timed_Waiting: 쓰레드의 작업이 종료되지는 않았지만 실행가능하지 않은 일시정지상태. Timed_Waiting은 일시정지시간이 지정된 경우를 의미함
5)Terminated: 쓰레드의 작업이 종료된 상태</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[면접준비(7)예외처리]]></title>
            <link>https://velog.io/@oh-taehyun/%EB%A9%B4%EC%A0%91%EC%A4%80%EB%B9%848%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC</link>
            <guid>https://velog.io/@oh-taehyun/%EB%A9%B4%EC%A0%91%EC%A4%80%EB%B9%848%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC</guid>
            <pubDate>Tue, 11 Apr 2023 07:05:21 GMT</pubDate>
            <description><![CDATA[<p>출처: 자바의 정석 3판 ch8예외처리 p 414~434
에러: 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
예외: 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류
둘다 런타임에러</p>
<p>예외처리의 정의와 목적
정의: 프로그램 실행 시 발생할 수 있는 예외의 발생에 대비한 코드를 작성하는 것
목적: 프로그램의 비정상 종료를 막고 정상적인 실행상태를 유지하는 것</p>
<p>처리하기. try-catch문 </p>
<p>try블럭안에는 예외가 발생할 가능성이 있는 문장들을 넣고,
catch(Exception1 e1) 블럭안에는 Exception1이 발생했을 경우, 이를 처리하기 위한 문장들을 넣음</p>
<p>try블럭 내에서 예외가 발생한 경우
-1. 발생한 예외와 일치하는 catch블럭이 있는지 확인
-2.일치하는 catch블럭을 찾게되면, 그 catch블럭 내의 문장들을 수행하고 전체 try-catch문을 빠져나가서 그 다음 문장을 계속해서 수행. 만일 일치하는 catch블럭을 찾지 못하면 예외는 처리되지 못하고 프로그램이 비정상종료됨</p>
<p>try블럭내에서 예외 발생안한경우
-catch블럭을 거치지 않고 전체 try-catch문을 빠져나가서 수행을 계속함</p>
<p>printStackTrace()와 getMessage()</p>
<p>printStackTrace(): 예외 발생 당시의 호출스택에 있었던 메서드의 정보와 예외 메시지를 화면에 출력
getMessage() 발생한 예외클래스의 인스턴스에 저장된 메시지를 얻을 수있다.</p>
<p>멀티 catch블럭
catch블럭안의 내용이 같을 경우 하나로 합침</p>
<pre><code class="language-java">try{
...
}catch(ExcepitonA e){
 e.printStackTrace();
 }catch(ExceptionB e2){
     e2.printStackTrace();
    }
    //하나로 합치면
    try{
    ...
    }catch(ExceptionA | ExceptionB e){
    e.printStackTrace();
    } </code></pre>
<p>예외 발생시키기</p>
<ol>
<li><p>연산자 new를 이용해서 발생시키려는 예외 클래스의 객체를 만든다음
Exception e = new Exception(&quot;고의로 예외발생시킴&quot;);</p>
</li>
<li><p>키워드 throw를 이용해서 예외를 발생시킴
throw e;
한줄로 줄이면 throw new Exception</p>
<p>Exception클래스의 자손은 checked예외로 예외처리가 필수이다. 
RuntimeException자손은 unchecked예외로 예외처리가 필수가 아닌 선택이다. 근데 그만큼 더 조심해서 코딩해야함.</p>
</li>
</ol>
<p>eclipse에서 checked예외를 예외처리안해주면 빨간줄이 떠서 반드시 예외처리해줘야함
unchecked예외는 빨간줄은 안뜨는데 실행시 에러가 발생할 수있다.</p>
<p>메서드 예외 처리방법: try-catch문: 직접처리
            예외선언하기: 예외떠넘기기(알리기)
            은폐-&gt;catch블럭에 아무것도 넣지 않는다.
            =빅데이터 처리할때 사용됨</p>
<p>예외처리 예시</p>
<pre><code class="language-java">import java.io.File;

public class ThrowExceptionClass {
    public static void main(String[]args) {

    try {
        File f = createFile(args[0]);
        System.out.println(f.getName()+&quot;파일이 성공적으로 생성되었습니다.&quot;);

    } catch(Exception e) {
        System.out.println(e.getMessage()+&quot;다시 입력해주시기 바랍니다.&quot;);
    }

    }
    static File createFile(String fileName)throws Exception{
        if(fileName==null || fileName.equals(&quot;&quot;))
            throw new Exception(&quot;파일이름이 유효하지 않습니다.&quot;);
     File f = new File(fileName);
     f.createNewFile();
     return f;
    }
}
</code></pre>
<p>실행방법: 이클립스 메뉴바에 run탭에서 run configuration을 클릭한후 argument에 파일명을 입력한다.
<img src="https://velog.velcdn.com/images/oh-taehyun/post/6fb3bab2-b7bc-4a31-8a0f-c14f713f66dc/image.png" alt=""></p>
<p>실행결과
<img src="https://velog.velcdn.com/images/oh-taehyun/post/81897f3f-bb49-4de7-b33c-36d98e067d8b/image.png" alt=""></p>
<p>조금 다르게 변경할 수도 있다.</p>
<pre><code class="language-java">import java.io.File;

public class ThrowExceptionClass {
    public static void main(String[]args) {    
        File f = createFile(args[0]);
        System.out.println(f.getName()+&quot;파일이 성공적으로 생성되었습니다.&quot;);
    }
    static File createFile(String fileName){
        try{
        if(fileName==null || fileName.equals(&quot;&quot;))
            throw new Exception(&quot;파일이름이 유효하지 않습니다.&quot;);
        }catch(Exception e){
        fileName = &quot;제목없음.txt&quot;;
        }
        File f = new File(fileName);
        try{
         f.createNewFile();
        }catch(IOException e){
        e.printStackTrace();
        }
     return f;
    }
}</code></pre>
<p>finally블럭
:예외 발생여부와 관계없이 수행되어야 하는 코드를 넣는다.</p>
<pre><code class="language-java">try{
startInstall();
copyFiles();
deleteTempFiles();
} catch(Exception e){
    e.printStackTrace();
    deleteTempFiles();
    }
    //finally를 사용햐면 중복코드를 없앨 수 있다.
    try{
startInstall();
copyFiles();

} catch(Exception e){
    e.printStackTrace();
    }finally{
    deleteTempFiles();
    }</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[면접준비(6)StringBuffer,StringBuilder, 래퍼(wrapper)클래스]]></title>
            <link>https://velog.io/@oh-taehyun/%EB%A9%B4%EC%A0%91%EC%A4%80%EB%B9%847StringBufferStringBuilder-%EB%9E%98%ED%8D%BCwrapper%ED%81%B4%EB%9E%98%EC%8A%A4</link>
            <guid>https://velog.io/@oh-taehyun/%EB%A9%B4%EC%A0%91%EC%A4%80%EB%B9%847StringBufferStringBuilder-%EB%9E%98%ED%8D%BCwrapper%ED%81%B4%EB%9E%98%EC%8A%A4</guid>
            <pubDate>Thu, 06 Apr 2023 13:56:31 GMT</pubDate>
            <description><![CDATA[<p>출처: 자바의 정석 ch09 477<del>483, 490</del>496 ch12 p670~    674
1)StringBuffer
StringBuffer클래스는 String클래스와 달리 인스턴스를 생성할 때 지정된 문자열을 변경할 수 있다. 내부적으로 문자열 편집을 위한 버퍼를 가지고 있으며, StringBuffer인스턴스를 생성할 때 크기를 지정할 수 있다.
주의점은 String클래스에서는 equals메서드를 오버라이딩해서 문자열의 내용을 비교하도록 구현되어있지만, StringBuffer클래스는 equls메서드를 오버라이딩하지 않아서 StringBuffer클래스의 equals메서드를 사용해도 등가비교연산자로 비교한것과 같은 결과를 얻는다는 것이다.</p>
<p>StringBUffer클래스의 생성자와 메서드
: String클래스와 유사한 메서드를 많이 가지고있으며 추가로 추가,변경,삭제와 같이 저장된 내용을 변경할 수 있는 메서드들이 추가로 제공됨
1)StringBuffer()
16문자를 담을 수 있는 버퍼를 가진 StringBuffer 인스턴스를 생성함</p>
<pre><code class="language-java">StringBuffer sb = new StringBuffer();
</code></pre>
<p>2)StringBuffer append(boolean b)
StringBuffer append(char c)
StringBuffer append(long l)
   ...
매개변수로 입력된 값을 문자열로 변환하여 StringBuffer인스턴스가 저장하고 있는 문자열의 뒤에 덧붙임</p>
<p>3)StringBuffer delete(int start, int end)
시작위치부터 끝 위치 사이에 있는 문자를 제거함. 단 끝위치의 문자는 제외
4)StringBuffer reverse()
StringBuffer 인스턴스에 저장되어 있는 문자열의 순서를 거꾸로 나열</p>
<ol start="2">
<li>StringBuilder
StringBuffer는 멀티쓰레드에 안전하도록 동기화되어있다. 그런데 동기화는 StringBuffer의 성능을 떨어뜨린다. 멀티쓰레드로 작성된 프로그램이 아닌 경우, StringBuffer의 동기화는 불필요하게 성능만 떨어뜨림.
이것을 개선하기위해 쓰레드의 동기화만 뺀 StringBuilder가 추가됨
사용법은 소스코드에서 StringBuffer대신 StringBuilder를 사용하도록 바꾸기만 하면됨.</li>
</ol>
<p>3.래퍼(wrapper)클래스
프로그래밍을 하다보면 기본자료형 8개의 변수를 객체로 다뤄야 하는 경우가 있다.
ex. 매개변수로 객체를 요구, 기본형 값이 아닌 객체로 저장할 때, 객체 간의 비교가 필요할 때...
이때 사용되는 것이 래퍼클래스이다. char와 int형을 제외한 나머지는 자료형 이름의 첫 글자를 대문자로 한 것이 각 래퍼클래스의 이름</p>
<p>byte-Byte
char-Character
int-Integer
float-Float
double-Double
boolean-Boolean
long-Long
short-Short</p>
<p>오토박싱&amp;언박싱
기본 타입의 값을 직접 박싱, 언박싱하지 않아도 자동적으로 박싱과 언박싱이 일어나는 경우가 있음. 오토박싱은 기본형 값을 래퍼 클래스의 객체로 자동 변환해주는 것, 언박싱은 반대로 변환하는 것. </p>
<p>지네릭스
다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입체크를 해주는 기능. 
ex)</p>
<pre><code class="language-java">//지네릭스 사용
List&lt;Customer&gt; a=m1();
for(Customer c: a){}
//지네릭스 사용 안한다면
List b = m2();
for(Object o:b){
    Customer c = (Customer)o
    }</code></pre>
<p>두번째 예시처럼 제네릭을 안쓰면 컴파일시에는 오류를 발생 시키지 않고 실행할 때 오류가 남</p>
<p>장점</p>
<ol>
<li>타입 안정성을 제공함</li>
<li>타입체크와 형변환을 생략할 수 있으므로 코드가 간결해짐</li>
</ol>
<p>지네릭스 용어
 Box<T> : 지네릭 클래스.  T의 Box 또는 T Box라고 읽는다
  T 타입 변수 또는 타입 매개변수.(T는 타입 문자)
  Box 원시 타입(raw type)</p>
<p>  Box<String>b = new Box<String>();
  String은 대입된 타입</p>
<p>  참조변수와 생성자의 대입된 타입은 일치해야 함.
  지네릭 클래스간의 다형성은 성립.하지만 대입된 타입은 일치해야함
  List<Tv>list = new ArrayList<Tv>();
  List<Tv>list = new LinkedList<Tv>();</p>
<p>  매개변수의 다형성도 성립</p>
<pre><code class="language-java">import java.util.*

class Product {}
class Tv extends Product{}
class Audio extends Product{}

 public class Main{
  public static void main(String[]args){
      ArrayList&lt;Product&gt;list = new ArrayList&lt;Product&gt;();
      list.add(new product());
      list.add(new Tv());
      list.add(new Audio());
      }
  }</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[면접준비(5)string]]></title>
            <link>https://velog.io/@oh-taehyun/%EB%A9%B4%EC%A0%91%EC%A4%80%EB%B9%846stringStringBuilderStringBuffer</link>
            <guid>https://velog.io/@oh-taehyun/%EB%A9%B4%EC%A0%91%EC%A4%80%EB%B9%846stringStringBuilderStringBuffer</guid>
            <pubDate>Wed, 05 Apr 2023 09:52:28 GMT</pubDate>
            <description><![CDATA[<p>참고: 자바의 정석 3판 chapter09 java.lang패키지와 유용한 클래스 p464~474</p>
<ol>
<li>String 클래스</li>
</ol>
<p>-데이터(Char[])+메서드(문자열 관련)</p>
<p>-내용을 변경할 수 없는 불변클래스
-문자열의 결합이나 변경이 잦다면, 내용을 변경가능한 StringBuffer를 사용함</p>
<p>문자열의 비교
1)String str1=&quot;abc&quot;;
  String str2=&quot;abc&quot;;</p>
<p>str1==str2 ? true
str1.eqals(str2)? true
String은 내용변경이 불가하기 때문에 여러 참조변수가 하나의 문자열(상수)을 공유해도됨</p>
<p>2)String str3 = new String(&quot;abc&quot;);
  String str4 = new String(&quot;abc&quot;);</p>
<p>  str3==str4 ? false
  str3.equals(str4)? true</p>
<p>  1번방식 권장</p>
<p>String 생성자</p>
<p>1)String(char[] value)
주어진 문자열을 갖는 String인스턴스를 생성함</p>
<pre><code class="language-java">char[] c =(&#39;H&#39;,&#39;e&#39;,&#39;l&#39;,&#39;l&#39;,&#39;o&#39;);
String s = new String(c);
//결과: s=&quot;Hello&quot;</code></pre>
<p>2)String(StringBuffer buf)
StringBuffer 인스턴스가 갖고 있는 문자열과 같은 내용의 String 인스턴스를 생성함</p>
<pre><code class="language-java">StringBuffer sb = 
    new StringBuffer(&quot;Hello&quot;);
  String s = new Stirng(sb);
 //결과: s = &quot;Hello&quot;</code></pre>
<p>3)char charAt(int index)
지정된 위치(index)에 있는 문자를 알려준다.
(index는 0부터 시작)</p>
<pre><code class="language-java">String s = &quot;Hello&quot;;
String n = &quot;0123456&quot;;
char c = s.charAt(1);
char c2 = n.charAt(1);
//c = &#39;e&#39;
//c2=&#39;1&#39;</code></pre>
<p>4)int compareTo(String str)
문자열(str)과 사전순서로 비교한다. 같으면 0을, 사전순으로 이전이면 음수를, 이후면 양수를 반환한다.</p>
<pre><code class="language-java">int i = &quot;aaa&quot; compareTo(&quot;aaa&quot;);
int i2 = &quot;aaa&quot;.compareTo(&quot;bbb&quot;);
int i3 = &quot;bbb&quot;.compareTo(&quot;aaa&quot;);
//i=0
//i2=-1
//i3=1</code></pre>
<p>5)String concat(String str)
문자열(str)을 뒤에 덧붙인다</p>
<pre><code class="language-java">String s = &quot;Hello&quot;;
String s2 = s.concat(&quot;World&quot;)</code></pre>
<p>6)boolean contains(CharSequence s)
지정된 문자열(s)이 포함되었는지 검사</p>
<pre><code class="language-java">String s = &quot;abcdefg&quot;;
boolean b = s.contains(&quot;bc&quot;);
//b=true</code></pre>
<p>7)boolean endsWith(String suffix)
지정된 문자열(suffix)로 끝나는지 검사한다</p>
<pre><code class="language-java">    String file = &quot;Hello.txt&quot;;
    boolean b = file.endsWith(&quot;txt&quot;);
    //b=true</code></pre>
<p>8)boolean equals(Object obj)</p>
<pre><code class="language-java">    String s = &quot;Hello&quot;;
    boolean b = s.equals(&quot;Hello&quot;);
    boolean b2 = s.equals(&quot;hello&quot;);
    //b=true
    //b2=false</code></pre>
<p>9)boolean equalsIgnoreCase(String str)
문자열과 String인스턴스의 문자열을 대소문자 구분없이 비교한다.</p>
<pre><code class="language-java">String s = &quot;Hello&quot;;
boolean b = s.equalsIgnoreCase(&quot;HELLO&quot;);
boolean b2 = s.equalsIgnoreCase(&quot;heLLo&quot;);
//b=true
//b2=true</code></pre>
<p>10)int indexOf(int ch)
주어진 문자(ch)가 문자열에 존재하는지 확인하여 위치(index)를 알려준다. 못 찾으면 -1을 반환한다(index는 0부터 시작)</p>
<pre><code class="language-java">String s = &quot;Hello&quot;;
int idx1 = s.indexOf(&#39;o&#39;);
int idx2 = s.indexOf(&#39;k&#39;);
//idx1=4
//idx2=-1</code></pre>
<p>11)int indexOf(int ch, int pos)
주어진 문자(ch)가 문자열에 존재하는지 지정된 위치부터 확인하여 위치를 알려준다. 못찾으면 -1을 반환</p>
<pre><code class="language-java">String s = &quot;Hello&quot;;
int idx1 = s.indexOf(&#39;e&#39;,0);
int idx2 = s.indexOf(&#39;e&#39;,2);
//idx1 = 1
//idx2=-1</code></pre>
<p>12)int indexOf(String str)
주어진 문자열이 존재하는지 확인하여 그 위치를 알려준다. 없으면 -1을 반환한다.</p>
<pre><code class="language-java">String s = &quot;ABCDEFG&quot;;
int idx = s.indexOf(&quot;CD&quot;);
//idx=2</code></pre>
<p>13)String intern()
문자열을 상수풀(constant pool)에 등록한다.
이미 상수풀에 같은 내용의 문자열이 있을 경우 그 문자열의 주소값 반환</p>
<pre><code class="language-java">    String s = new String(&quot;abc&quot;);
    String s2= new String(&quot;abc&quot;);
    boolean b = (s==s2);
    boolean b2 = s.eqauls(s2);
    boolean b3 = (s.intern()==s2.intern());
    //b=false
    //b2=true
    //b3=true</code></pre>
<p>14)int lastIndexOf(int ch)
지정된 문자 또는 문자코드를 문자열의 오른쪽 끝에서부터 찾아서 위치를 알려줌.못찾으면 -1 반환</p>
<pre><code class="language-java">    String s = &quot;java.lang.Object&quot;;
    int idx = s.lastIndexOf(&#39;.&#39;);
    int idx2 = s.indexOf(&#39;.&#39;);
    //idx1=9;
    //idx2=4;</code></pre>
<p>15)int lastIndexOf(String str)
지정된 문자열을 인스턴스의 문자열 끝에서부터 찾아서 위치를 알려준다. 못찾으면 -1반환</p>
<pre><code class="language-java">    String s = &quot;java.lang.java&quot;;
    int idx1 = s.lastIndexOf(&quot;java&quot;);
    int idx2=s.indexOf(&quot;java&quot;);
    //idx=10
    //idx2=0</code></pre>
<p>16)int length
문자열의 길이를 알려준다.
String s = &quot;Hello&quot;;
int length = s.length;
//length=5</p>
<p>17)String replace(char old, char nw)
문자열 중의 문자(old)를 새로운 문자(nw)로 모두 바꾼후 문자열을 반환한다.</p>
<pre><code class="language-java">    String s=&quot;Hello&quot;;
    String sl = s.replace(&#39;H&#39;,&#39;C&#39;);
    //sl=&quot;Cello&quot;</code></pre>
<p>18)String replace(CharSequence old, CharSequence nw)</p>
<pre><code class="language-java"> String s = &quot;Hellollo&quot;;
 String sl = s.replace(&quot;ll,&quot;LL&quot;);
 //sl=&quot;HeLLoLLo</code></pre>
<p>19)String replaceAll(String regex, String replacement)
문자열 중에서 지정된 문자열과 일치하는 것을 새로운 문자열로 모두 변경한다.</p>
<pre><code class="language-java">    String ab &quot;AABBAABB&quot;;
    String r = ab.replaceAll(&quot;BB&quot;,&quot;bb&quot;);
    //r=AAbbAAbb</code></pre>
<p>20)String replaceFirst(String regex, String replacement)
문자열 중에서 지정된 문자열과 일치하는 것 중 첫 번째 것만 새로운 문자열로 변경함</p>
<pre><code class="language-java">    String ab = &quot;AABBAABB&quot;;
    String r = ab.replaceFirst(&quot;BB&quot;,&quot;bb&quot;);
    //r=&quot;AAbbAABB&quot;</code></pre>
<p>21)String[]split(String regex)
문자배열을 지정된 분리자(regex)로 나누어 문자열 배열에 담아 반환한다.</p>
<pre><code class="language-java">String animals = &quot;dog,cat,bear&quot;;
String[] arr = animals.split(&quot;,&quot;);
//arr[0]=&quot;dog&quot;
//arr[1]=&quot;cat&quot;
//arr[2]=&quot;bear&quot;</code></pre>
<p>22)String[] split(String regex, int limit)
문자열을 지정된 분리자로 나누어 문자열배열에 담아 반환. 단, 문자열 전체를 지정된 수로 자른다.</p>
<pre><code class="language-java">    String animals = &quot;dog,cat,bear&quot;;
    String[]arr = animals.split(&quot;,&quot;,2);
    //arr[0]=&quot;dog&quot;
    //arr[1]=&quot;cat,bear&quot;</code></pre>
<p>23)boolean startsWith(String prefix)
주어진 문자열로 시작하는지 검사한다.</p>
<pre><code class="language-java">    String s=&quot;java.lang.Object&quot;;
    boolean b = s.startsWith(&quot;java&quot;);
    boolean b2 = s.startsWith(&quot;lang&quot;);
    //b=true //b2=false</code></pre>
<p>24)String substring(int begin)
String substring(int begin, int end)
주어진 시작위치부터 끝위치 범위에 포함된 문자열을 얻는다. 이 때 시작위치의 문자는 범위에 포함되지만, 끝 위치의 문자는 포함되지 않음</p>
<pre><code class="language-java">String s = &quot;java.lang.Object&quot;;
String c = s.substring(10);
String p = s.substring(5,9);
//c=&quot;Object//p=lang</code></pre>
<p>25)String toLowerCase()
String 인스턴스에 저장되어있는 모든 문자열을 소문자로 변환하여 반환한다</p>
<pre><code class="language-java">    String s &quot;Hello&quot;;
    String s1 = s.toLowerCase();
    //s1=&quot;hello&quot;</code></pre>
<p>26)String toString()
String 인스턴스에 저장되어 있는 문자열을 반환한다</p>
<pre><code>String s =&quot;Hello&quot;;
String s1 = s.toString();
//s1=&quot;Hello&quot;</code></pre><p>27)String toUperCase()
String 인스턴스에 저장되어있는 모든 문자열을 대문자로 변환하여 반환</p>
<pre><code class="language-java">    String s = &quot;Hello&quot;;
    String s1 = s.toUpperCase();
    //s1=&quot;HELLO&quot;</code></pre>
<p>28)String trim()
문자열의 왼쪽끝과 오른쪽 끝에 있는 공백을 없앤 결과를 반환한다. 이 때 문자열 중간에 있는 공백은 제거되지 않는다.</p>
<pre><code class="language-java">    String s = &quot;   Hello World   &quot;;
    String s1 = s.trim();
    //s1=&quot;Hello World&quot;</code></pre>
<p>29)static String valueOf(boolean b)
static String valueOf(char c)
static String valueOf(int i)
static String valueOf(long l)
static String valueOf(float f)
static String valueOf(double d)
static String valueOf(Object o)
지정된 값을 문자열로 변환하여 반환한다. 참조변수의 경우 , toStirng()을 호출한 결과를 반환한다.</p>
<pre><code class="language-java">String b = String.valueOf(true);
String l = String.ValueOf(100L);
stirng f = String.valueOf(10f);
java.util.Date dd = new java.util.Date();
String date = String.valueOf(dd);
//b=&quot;true&quot;//l=&quot;100&quot;//f=&quot;10.0&quot;//date = &quot;Wed Jan 27 21:26:29 KST 2016&quot;</code></pre>
<p>*String을 기본형 값으로 변환
: ValueOf()를 쓰거나 parseInt()를 사용하면 됨</p>
<pre><code class="language-java"> int i = Integer.parseInt(&quot;100&quot;);
 int i = Integer.valueOf(&quot;100&quot;);</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[면접준비(5)클래스]]></title>
            <link>https://velog.io/@oh-taehyun/%EB%A9%B4%EC%A0%91%EC%A4%80%EB%B9%845%ED%81%B4%EB%9E%98%EC%8A%A4</link>
            <guid>https://velog.io/@oh-taehyun/%EB%A9%B4%EC%A0%91%EC%A4%80%EB%B9%845%ED%81%B4%EB%9E%98%EC%8A%A4</guid>
            <pubDate>Mon, 03 Apr 2023 05:45:39 GMT</pubDate>
            <description><![CDATA[<p>출처: 자바의 정석 chapter 07 객체지향 프로그래밍2 p345~400</p>
<p>클래스 1)객체를 만드는 틀
      2)하위클래스의 공통점을 모아둔 것</p>
<p>final class: 변경될 수 없는 클래스.객체를 만드는 틀로서만 기능함
-&gt;그래서 final로 지정된 클래스는 다른 클래스의 조상이 될 수 없다.</p>
<p>+final 메서드: 변경될 수 없는 메서드. final로 지정된 메서드는 오버라이딩을 통해 재정의 될 수 없음.
+final 멤버변수,지역변수: 변수 앞에 final이 붙으면 값을 변경할 수없는 상수가 된다.</p>
<p>abstract 클래스 :클래스 내에 추상 메서드가 선언되어 있음을 의미함. 하위클래스의 공톰점 모아두는 것 만 가능함
-추상클래스 사용법: class 앞에 abstract를 붙이기만 하면 됨.</p>
<pre><code class="language-java">abstract class 추상클래스{
}</code></pre>
<p>이렇게 하면 이 클래스를 사용할 때, 클래스 선언부의 abstract를 보고 이 클래스에는 추상 메서드가 있으니 상속을 통해 구현해주어야 한다는 것을 알 수 있음.
추상클래스로부터 상속받는 자손클래스는 오버라이딩을 통해 조상인 추상클래스의 추상메서드를 모두 구현해주어야 한다.</p>
<p>+abstract 메서드: 선언부만 작성하고 구현부는 작성하지 않은 추상 메서드임을 알림.
사용예시</p>
<pre><code class="language-java">abstract class Animal{
abstract void cry();
}
class Cat extends Animal{
void cry(){
System.out.println(&quot;냐옹냐옹!&quot;);
    }
}</code></pre>
<p>interface: 모든 메서드가 추상메서드여서 하위클래스의 공통점을 모아두는 것만 가능함. 
추상클래스와의 공통점: 추상메서드를 갖는다. 객체 생성을 할 수 없다.
추상클래스와의 차이점: 추상클래스(abstract 클래스)보다 추상화 정도가 높아서 몸통을 갖춘 일반 메서드 또는 멤버변수를 구성원으로 가질 수 없다.
추상클래스=부분적으로만 완성된 미완성 설계도
인터페이스=구현된 것은 아무것도 없고 밑그림만 그려져 있는 기본 설계도</p>
<p>-인터페이스의 장점</p>
<ol>
<li>개발시간을 단축시킴</li>
<li>표준화가 가능함</li>
<li>서로 관계없는 클래스들에게 관계를 맺어 줄 수 있음</li>
<li>독립적인 프로그래밍이 가능함</li>
</ol>
<p>생활코딩 인터페이스로 계산기 만들기 협업한 예시
출처 : <a href="https://opentutorials.org/course/1223/6063">https://opentutorials.org/course/1223/6063</a></p>
<pre><code class="language-java">//1.계산기에 대한 약속을 정의하는 인터페이스
public interface Calculatable {
    public void setOprands(int first, int second, int third);
    public int sum();
    public int avg();
        }
   //2.인터페이스를 구현한 가짜 클래스를 임시로 사용해 만든 애플리케이션
  class CalculoatorDummy implement Calculatable{
     public void setOprands(int first, int second, int third){
     }
     public int sum(){
         return 60;
     }
    public int avg(){
        return 20;
    }
  }

 public class CalculatorConsumer{
     public static void main(String[]args){
        CalculatorDummy c = new CalculatorDummy();
        c.setOprands(10,20,30);
        System.out.println(c.sum()+c.avg());
    }
 }

 //3.인터페이스에 따라 구현된 클래스
  class Calculator implements Calculatable{
      int first, second, third;
    public void setOprands(int first, int second, int third){
      this.first=first;
      this.second=second;
      this.third=third;
    }
    public int sum(){
        return this.first + this.second + this.third;
    }
   public int avg(){
           return (this.first + this.second +this.third)
    }
  }
  //4.가짜 클래스인 CalculatorDummy를 실제 로직으로 교체
  public class CalculatorConsumer{
      public static void main(String[] args){
        Calculator c = new Calculator();
        c.setOprands(10,20,30);
        Systmem.out.println(c.sum()+c.avg());
    }
  }</code></pre>
<p>추상클래스보다 인터페이스를 많이 사용하는 추세임.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 1008,10871
BufferedReader,BufferedWriter, StringTokenizer활용]]></title>
            <link>https://velog.io/@oh-taehyun/%EB%B0%B1%EC%A4%80-100810871BufferedReaderBufferedWriter-StringTokenizer%ED%99%9C%EC%9A%A9</link>
            <guid>https://velog.io/@oh-taehyun/%EB%B0%B1%EC%A4%80-100810871BufferedReaderBufferedWriter-StringTokenizer%ED%99%9C%EC%9A%A9</guid>
            <pubDate>Wed, 29 Mar 2023 09:56:47 GMT</pubDate>
            <description><![CDATA[<p>BufferedReader와 BufferedWriter는 버퍼를 이용해서 입출력 효율을 높여준다.
Scanner보다 성능이 더 좋다.</p>
<p>사용예시
<img src="https://velog.velcdn.com/images/oh-taehyun/post/38ab9a5d-28c4-41d3-b098-dd7eaca320aa/image.png" alt=""></p>
<pre><code class="language-java">import java.io.*;
import java.util.*;

public class Main{
    public static void main(String[]args)throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(),&quot; &quot;);//공백을 기준으로 구분함. &quot; &quot;는 생략해도 기본으로 공백 기준으로 됨
        int a = Integer.parseInt(st.nextToken());//예제대로 입력시 1
        int b = Integer.parseInt(st.nextToken());//예제대로 입력시 3
        double sum = (double)a/(double)b;
        System.out.println(sum);
    }
}</code></pre>
<ol>
<li>readLine()메서드: 데이터를 라인 단위로 읽음</li>
<li>리턴 값은 모조건 String: 다른 타입으로 사용하려면 형변환 필요</li>
<li>readLine()할 때마다 throws IOException혹은 try&amp;catch를 이용한 예외처리 필요</li>
</ol>
<p>StringTokenizer
긴 문자열을 지정된 구분자를 기준으로 문자열을 자를 때 사용함</p>
<p>BufferedWriter
일반적인 출력은 System.out.println(&quot;&quot;);방식인데
BufferedWriter를 사용하면 일반적 방식보다 성능이 개선된다.
사용예시
<img src="https://velog.velcdn.com/images/oh-taehyun/post/89a5f650-571c-4e8f-bbdf-95756788ea3c/image.png" alt=""></p>
<pre><code class="language-java">import java.util.*;
import java.io.*;

public class Main{
    public static void main(String[]args)throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));//System.out.println 대체하려고 씀
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        int x = Integer.parseInt(st.nextToken());
        int arr[] = new int[n];
        StringTokenizer st2 = new StringTokenizer(br.readLine());//StringTokenizer는 재사용이 불가해서 위에서 선언했어도 또 쓰려면 또 선언해야함
        for(int i=0;i&lt;arr.length;i++){
            arr[i] = Integer.parseInt(st2.nextToken());
            if(arr[i]&lt;x){
               bw.write(arr[i]+&quot; &quot;);
            }
        }
        bw.flush();//남아있는 데이터를 모두 출력시키기 위해 호출해 닫아줌
        br.close();
    }
}</code></pre>
<p>flush()로 남아있는 데이터를 모두 출력함
개행을 해야 할 때는 br.wirte(arr[i]+&quot;\n&quot;);</p>
<p>출처 BufferedReader / BufferedWriter / StringTokenizer: <a href="https://dblee.tistory.com/167">https://dblee.tistory.com/167</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[면접준비(4)객체지향의 3대원칙]]></title>
            <link>https://velog.io/@oh-taehyun/%EB%A9%B4%EC%A0%91%EC%A4%80%EB%B9%844%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5%EC%9D%98-3%EB%8C%80%EC%9B%90%EC%B9%99</link>
            <guid>https://velog.io/@oh-taehyun/%EB%A9%B4%EC%A0%91%EC%A4%80%EB%B9%844%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5%EC%9D%98-3%EB%8C%80%EC%9B%90%EC%B9%99</guid>
            <pubDate>Wed, 29 Mar 2023 05:29:19 GMT</pubDate>
            <description><![CDATA[<p>출처: 자바의 정석3판 객체지향 프로그래밍p230<del>287,p310</del>348</p>
<p>1.객체지향 언어의 특징</p>
<p>1) 코드의 재사용성이 높다
 -새로운 코드를 작성할 때 기존의 코드를 이용하여 쉽게 작성할 수 있다.
2) 코드의 관리가 용이하다
 -코드간의 관계를 이용해서 적은 노력으로 쉽게 코드를 변경할 수 있다.
3) 신뢰성이 높은 프로그래밍을 가능하게 한다.
 -제어자와 메서드를 이용해서 데이터를 보호하고 올바른 값을 유지하도록 하며, 코드   의 중복을 제거하여 코드의 불일치로 인한 오동작을 방지할 수 있다.</p>
<p>2.클래스와 객체
 1)클래스와 객체의 정의와 용도
  (1)클래스(붕어빵 기계)
   :클래스란 객체를 정의해 놓은 것이며, 객체를 생성하는데 사용된다.
  (2)객체(붕어빵)
   :객체는 실제로 존재하는 것으로 용도는 객체가 가지고 있는 기능과 속성에 따라       다르다.</p>
<p>3.객체지향의 3대원칙
1)상속
 :기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것
장점
 -1.보다 적은 양의 코드로 새로운 클래스를 작성할 수 있음
 -2.코드를 공통적으로 관리할 수 있어 코드이 추가 및 변경이 매우 용이함</p>
<p>2)캡슐화
 :데이터가 외부로 노출되지 않도록 가리는 것
  접근 제어자를 이용해 데이터를 외부에 노출하지 않도록 가려놓고(정보은닉),가려진   자료를 사용하기 위해 접근 가능한 메서드를 만들고, 데이터를 setting,getting 
  할 수 있도록 setter,getter로 데이터를 접근하도록 하는 것</p>
<p>3)다형성
 :한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 하는 것
 -상속과 인터페이스를 통해 이루어짐.
*upcasting, downcasting
-upcasting: 객체는 자식, 타입 부모인 캐스팅. 부모 클래스에 정의된 멤버만 사용가능, 형변환 생략 가능.
-downcasting:부모 타입으로 업캐스팅 된 상태에서 자식 클래스에만 있는 메서드를 사용할 때 부모타입을 자식 타입으로 형변환하는 것. 형 변환 생략 불가능</p>
<p>참고:  <a href="https://velog.io/@oh-taehyun/%EB%A9%B4%EC%A0%91%EC%A4%80%EB%B9%841%EC%9E%90%EB%B0%94%EC%96%B8%EC%96%B4%EC%9D%98-%ED%8A%B9%EC%A7%95">https://velog.io/@oh-taehyun/면접준비1자바언어의-특징</a></p>
<h2 id="그외-추가-설명">그외 추가 설명</h2>
<p>*객체와 인스턴스
:클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화라고 하며 어떤 클래스로부터   만들어진 객체를 그 클래스의 인스턴스라고 한다.</p>
<p>*자바 메모리 영역
출처: <a href="https://velog.io/@pjh612/Java-%EC%8B%A4%ED%96%89-%EA%B3%BC%EC%A0%95-%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%9F%AC-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%98%81%EC%97%AD%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC">https://velog.io/@pjh612/Java-실행-과정-컴파일러-그리고-메모리-영역에-대하여</a></p>
<p>1)PC register
  :스레드가 시작될 때 생성되며 현재 수행중인 JVM 명령의 주소를 가진다</p>
<p>2)Method area
  :모든 스레드가 공유하는 영역으로, 클래스, 인터페이스, 메소드, 필드, Static 변   수 등의 바이트 코드를 저장함</p>
<p>3)stack area
 :스레드마다 하나의  Stack area를 가지며, 메서드 호출 시 메서드 단위로 스택 프   레임이 생성된다. 호출된 메서드의 매개변수, 지역변수, 리턴 값, 연산 시 임시값   등을 저장하고 메서드 종료 시 스택 프레임 단위로 제거된다.</p>
<p>4)Heap area
 :모든 스레드가 공유하는 영역으로 객체들을 위한 영역, new를 통해 생성된 객체,     배열 등의 정보를 저장하고, Garbage Collector에 의해 관리되는 주요 메모리 영역</p>
<p>5)Native method area
 :자바 언어가 아닌 다른 언어로 작성된 네이티브 코드를 수행하기 위한 메모리 영역</p>
<p>*오버로딩/오버라이딩</p>
<p> 1)오버로딩
  :한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것
 조건: 
 -1.메서드 이름이 같아야 한다.
 -2.매개변수의 개수 또는 타입이 달라야 한다.
 장점
 -1.같은 기능을 하는 메서드들을 같은 이름으로 묶어줄 수 있다.
  ex.println메서드
 -2.메서드의 이름을 절약할 수 있다.
  (이름을 짓는 고민을 줄일 수 있다.)</p>
<p>2)오버라이딩
 : 조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것
조건:
 자손 클래스에서 오버라이딩하는 메서드는 조상 클래스의 메서드와
 -이름이 같아야 한다.
 -매개변수가 같아야 한다.
 -반환타입이 같아야 한다.</p>
<p> *접근제어자
 -private: 같은 클래스 내에서만 접근이 가능함
 -default: 같은 패키지 내에서만 접근이 가능함
 -protected: 같은 패키지 내, 다른 패키지의 자손클래스에서 접근 가능함
 -public: 접근 제한이 없다.</p>
<p> *package와 import</p>
<p> 1)package
 :클래스의 묶음. 
 -하나의 소스파일에는 첫 번째 문장으로 단 한번만 패키지 선언을 할 수 있음
 -모든 클래스는 하나의 패키지에만 속해야함
 -패키지는 점을 구분자로 하여 계층구조로 구성할 수 있음
 -패키지는 물리적으로 클래스 파일을 포함하는 하나의 디렉토리</p>
<p> 2)import
 :사용하고자 하는 클래스의 패키지를 소스코드에 명시해주는 것</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[면접준비(3)컬렉션]]></title>
            <link>https://velog.io/@oh-taehyun/%EB%A9%B4%EC%A0%91%EC%A4%80%EB%B9%843%EC%BB%AC%EB%A0%89%EC%85%98</link>
            <guid>https://velog.io/@oh-taehyun/%EB%A9%B4%EC%A0%91%EC%A4%80%EB%B9%843%EC%BB%AC%EB%A0%89%EC%85%98</guid>
            <pubDate>Tue, 28 Mar 2023 12:36:11 GMT</pubDate>
            <description><![CDATA[<p>Java의 collection
:데이터의 집합, 그룹을 의미함
자바 컬렉션 프레임워크는 객체들을 한 곳에 모아 관리하고, 편하게 사용하기 위해 제공되는 환경.
데이터, 자료구조인 컬렉션, 컬렉션을 구현하는 클래스를 정의하는 인터페이스를 제공함
대표 종류: list, Map, Set, Stack, Queue</p>
<p>사용이유: 
1.다수의 Data를 다루는데 표준화된 클래스들을 제공해주므로 DataStructure(자료구조)를 직접 구현하지 않고 편하게 사용할 수 있게 함.
2.배열과 다르게 객체를 보관하기 위한 공간을 미리 정하지 않아도 되며, 상황에 따라 객체 수를 동적으로 정할 수 있다. (프로그램의 공간적 효율성을 높여줌)</p>
<p>List: LinkedList, Vector, ArrayList. 순서가 있는 데이터의 집합으로 데이터의 중복 허용</p>
<p>Map: HashMap, HashTable,TreeMap. Key-Value의 쌍으로 이뤄진 데이터의 집합으로, 순서는 유지되지 않으며, Key의 중복을 허용하지 않으나 Value의 중복은 허용.</p>
<p>Set: HashSet, TreeSet. 순서를 유지하지 않는 데이터의 집합으로 데이터의 중복을 허용하지 않음.</p>
<p>Queue: LinkedList, PriorityQueue. List와 유사. FiFo 구조(First In First Out.선입선출)</p>
<p>Stack: LiFo구조(Last In First Out.후입선출)를 가지고 있는 선형 자료구조. 단일연결리스트로 구현 가능하나 대부분의 조건에서 성능저하를 가져오기에 사용지양.</p>
<p>1)List: ArrayList,LinkedList,Vector가 있음
    -ArrayList
    :자바의 vector를 개선한 배열로 구현된 List. 데이터가 저장된 순서가 같음
    배열과 같은 자료구조를 가지고 있어, List의 연산 자체 수행시간과 속도는 배열         과 동일함.(단방향 포인터 구조로 각 데이터에 대한 인덱스를 가지고 있어 조회     성능이 뛰어나다)</p>
<p>   -Vector: collection 프레임워크의 일부이며 java.util 패키지에 소속되어있      음. 항상 동기화되어있고 collection 프레임워크에 없는 메서드들을 사용 가        능. 하지만 동기화라는 특징 때문에 스레드가 아닌 환경에서는 거의 사용되지 않      으며, 스레드 환경에서 안정성은 높지만 ArrayList와 비교하여 추가, 검색, 삭      제 성능이 떨어짐</p>
<p>   -LinkedList
    :다음 노드 주소를 기억하고 있는 List. 배열에 배해 삽입과 삭제가 간단함.
    하지만 탐색할 때는 첫번째 노드부터 탐색하기 때문에 속도가 느림
    -양방향 포인터 구조.데이터의 삽입, 삭제가 빈번할 경우 유용함(데이터의 위치정     보만 수정하면 됨)
    *노드: 데이터를 저장하는 부분과 다음 노드에 대한 포인트로 이루어져 있음.
    첫 번째 노드를 헤드(Head), 마지막 노드를 테일(Tail)이라고 부르는데           Linked List 구조에서는 헤드 노드의 정보만 가지고 있으면 다음 노드를 찾아갈    수 있고(특정 위치에 있는 노드를 탐색하는데는 많은 연산이 필요함), 데이터 개수    에 맞춰 필요한 수의 메모리만 사용할 수 있음</p>
<p>   2)Map: HashMap,HashTable,TreeMap</p>
<p>   -HashMap
   :가장 일반적으로 사용하는 Map
   Key값에 해시 함수를 적용해 나온 인덱스에 value를 저장한다. 중복과 순서가 허    용되지 않고 null값이 올 수 있다.</p>
<p>   -HashTable
   :HashMap보다는 느리지만 동기화를 지원함
   *동기화: 작업들 사이의 수행 시기를 맞추는 것. 동기화가 제공된다고 해서 무조건    좋은 것이 아니다. 동기화가 지원되는 컬렉션을 사용하면 실행 속도 측면에서 성능    이 떨어짐</p>
<p>   -TreeMap
    :Red-Black Tree 자료구조를 이용한  Map.
    트리구조로 어느 정도는 순서를 보장함
    정렬된 순서대로 Key, Value를 저장하기에 검색이 빠름</p>
<p>   3)Set : HashSet, TreeSet</p>
<p>   -HashSet
   :사실상 HashMap에서 Key값을 뺀 자료형 집합으로 봐도 됨
   Value(값)이 포함되어 있는지 아닌지만 관심이 있다. 순서보장x, 중복 값 허용x.
   임의 접근 속도가 가장 빠르지만, 순서를 예측할 수 없다.</p>
<p>  -TreeSet
   :Red-Black Tree 자료구조를 사용한 Set으로 정렬 방법을 지정할 수 있다.</p>
<p>   4)Stack&amp;Queue</p>
<p>   -Stack
   : 직접 new 연산자로 객체를 생성하여 사용 가능함. 데이터를 차곡차곡 쌓아 올린     형태의 자료구조로 데이터가 순서대로 쌓이며 가장 마지막에 삽입된 자료가 가장     먼저 삭제되는 구조를 가짐. 삽입 연산-push, 삭제연산-pop. LIFO(last In       First Out) </p>
<p>   -Queue
   :LinkedList에 new 연산자로 객체를 생성함으로써 사용 가능함. FIFO(First In     First Out)구조. 삭제 연산-front(디큐), 삽입 연산-rear(인큐). 스택과 다르     게 큐이 한쪽 끝에서는 삽입 작업, 다른 한쪽에서는 삭제작업이 나뉘어서 이뤄짐</p>
<p>출처1 컬렉션프레임워크란?:<a href="https://backendcode.tistory.com/163">https://backendcode.tistory.com/163</a>
출처2 벡터:<a href="https://crazykim2.tistory.com/570">https://crazykim2.tistory.com/570</a>
출처3 노드 :<a href="https://velog.io/@woojinn8/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-Linked-List">https://velog.io/@woojinn8/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-Linked-List</a>
출처4 동기화: <a href="https://madplay.github.io/post/java-collection-synchronize">https://madplay.github.io/post/java-collection-synchronize</a>
출처5 스택과 큐: <a href="https://jud00.tistory.com/entry/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%8A%A4%ED%83%9DStack%EA%B3%BC-%ED%81%90Queue%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90">https://jud00.tistory.com/entry/자료구조-스택Stack과-큐Queue에-대해서-알아보자</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[면접준비(2)변수]]></title>
            <link>https://velog.io/@oh-taehyun/%EB%A9%B4%EC%A0%91%EC%A4%80%EB%B9%842%EB%B3%80%EC%88%98</link>
            <guid>https://velog.io/@oh-taehyun/%EB%A9%B4%EC%A0%91%EC%A4%80%EB%B9%842%EB%B3%80%EC%88%98</guid>
            <pubDate>Mon, 27 Mar 2023 13:21:22 GMT</pubDate>
            <description><![CDATA[<p>출처: 자바의 정석 3판
p20<del>35,p247</del>
변수란?
:단 하나의 값을 저장할 수 있는 메모리 공간</p>
<p>변수의 종류
1)타입에 따라
기본형과 참조형
(1)기본형
실제 값을 저장함. 논리형(boolean), 문자형(char), 정수형(byte,short,int,long), 실수형(float,double)
모두 8개</p>
<p>int와 long
int타입이ㅡ 변수는 대략 10자리 수의 값을 저장할 수 있음
7~9자리 수를 계산할 때는 long타입(약 19자리)으로 선언하는게 좋음
실수형은 정수형과 저장형식이 달라서 같은 크기라도 훨씬 큰 값을 표현할 수 있음. 하지만 오차가 발생할 수 있다. 
높은 정밀도가 필요한 경우에는 double을 선택해야 함</p>
<p>(2)참조형
-객체의 주소를 저장한다. 8개의 기본형을 제외한 나머지 타입. 참조변수의 타입은 클래스의 이름
초기화는 new를 통해서 함
ex. Date today = new Date();</p>
<p>2)선언위치에 따라
클래스변수, 인스턴스변수, 지역변수
(1)클래스변수: 선언위치-클래스 영역/생성시기-클래스가 메모리에 올라갈 때
선언방법은 인스턴스변수 앞에  static을 붙이면됨. 
(2)인스턴스변수: 선언위치-클래스영역/생성시기-인스턴스가 생성되었을 때
(3)지역변수:선언위치-클래스 영역 이외의 영역(메서드 생성자, 초기화 블럭 내부)/생성시기-변수 선언문이 수행되었을 때</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[면접준비(1)자바언어의 특징]]></title>
            <link>https://velog.io/@oh-taehyun/%EB%A9%B4%EC%A0%91%EC%A4%80%EB%B9%841%EC%9E%90%EB%B0%94%EC%96%B8%EC%96%B4%EC%9D%98-%ED%8A%B9%EC%A7%95</link>
            <guid>https://velog.io/@oh-taehyun/%EB%A9%B4%EC%A0%91%EC%A4%80%EB%B9%841%EC%9E%90%EB%B0%94%EC%96%B8%EC%96%B4%EC%9D%98-%ED%8A%B9%EC%A7%95</guid>
            <pubDate>Mon, 27 Mar 2023 07:46:47 GMT</pubDate>
            <description><![CDATA[<p>출처: 자바의 정석3판(남궁성 저자)
p 2<del>5
p 310</del>361
자바언어의 특징</p>
<ol>
<li>운영체제에 독립적이다.
:자바의 개발환경과 배포환경이 다를 경우에도, 프로그램을 다시 컴파일 할 필요없이 실행가능함</li>
</ol>
<p>-&gt;자바가상머신(jvm)을 통해서 가능함</p>
<p>JVM: Java Virtual Machine을 줄인 것. 자바로 작성된 애플리케이션은 jvm에서만 실행됨. java 어플리케이션은 os종속적인 일반 어플리케이션과 달리 JVM하고만 상호작용을 하기 때문에 다른 os에서도 프로그램의 변경없이 실행 가능함. 
*단, JVM은  OS에 종속적임</p>
<p>2.객체지향언어
-상속, 캡슐화, 다형성이 잘 적용된 객체지향 언어</p>
<p>1)상속:
기존 클래스를 재사용하여 새로운 클래스를 작성하는 것. 상속은 코드의 재사용성을 높이고, 코드의 중복을 제거해 프로그램의 생산성과 유지보수에 크게 기여함
-상속 구현방법
: 새로 작성하고자 하는 클래스의 이름 뒤에 상속받고자 하는 클래스의 이름을 키워드 &#39;extends&#39;와 함께 써주면 됨.</p>
<pre><code class="language-java">package pocketmon;

public class PocketMon {
    protected String name;
    protected int hp;
    protected int exp;
    protected int lv;

    public void eat() {
        System.out.println(name+&quot;밥먹음&quot;);
    }
    public void sleep() {
        System.out.println(name+&quot;잠잠&quot;);
    }
    public boolean play() {
        System.out.println(name+&quot;논다&quot;);
        return true;//살았나?
    }
    public boolean exc() {
        System.out.println(name+&quot;운동함&quot;);
        return true;//살았나?
    }
    public void levelCheck() {
        System.out.println(name +&quot;레벨체크&quot;);
    }
    public void printInfo() {
        System.out.println(name+&quot;상태확인&quot;);
        System.out.println(&quot;hp:&quot;+hp);
        System.out.println(&quot;exp:&quot;+exp);
        System.out.println(&quot;lv:&quot;+lv);
    }
</code></pre>
<pre><code class="language-java">package pocketmon;

//캐릭터의 공통사항
//name, hp, exp, lv
//eat(), sleep(), play(), printInfo(), levelCheck() . 부모 클래스에 있는 기능이라 업캐스팅 해서 한번에 관리 가능
public class Pikachu extends PocketMon {

    public Pikachu() {
        hp = 30;
        name = &quot;piachu&quot;;
        System.out.println(name+&quot; 생성됨&quot;);

    }

    @Override
    public void eat() {
        // TODO Auto-generated method stub
        super.eat();
        hp += 5;
    }
    @Override
    public void sleep() {
        // TODO Auto-generated method stub
        super.sleep();
        hp +=10;
    }

    @Override
    public boolean play() {
        // TODO Auto-generated method stub
        super.play();
         hp -= -8;//hp감소
         exp += 8;
         levelCheck();
         return hp&gt;0;//hp가 0초과 이어야 살아있음

    }

    @Override
    public boolean exc() {
        // TODO Auto-generated method stub
        super.exc();
             hp -= 15;//hp감소
             exp += 10;
             levelCheck();
             return hp&gt;0;//hp가 0초과 이어야 살아있음
    }

    @Override
    public void levelCheck() {
        // TODO Auto-generated method stub
        super.levelCheck();
        if(exp&gt;=20) {
            lv++;
            exp -= 20;
            System.out.println(name + &quot;레벨 1 증가됨&quot;);
        }
    }
    public void 백만볼트() {//부모클래스에 없는 기능. 쓰려면 다운캐스팅 해야함
        System.out.println(&quot;백만볼트 공격&quot;);
    }



}
</code></pre>
<p>2)캡슐화
외부로부터 데이터를 보호하고, 외부에는 불필요한,내부에서만 사용되는 부분들을 감추는 것
-접근 제어자를 통해 가능함
    멤버변수를 private이나 protected로 제한하고, getter와 setter를 이용해 값을 읽고 변경할 수 있는 public 메서드를 제공해 간접적으로 멤버 변수의 값을 다룰 수 있게 함.</p>
<pre><code class="language-java"> package 도서관리
public class bookVo {
    private int num;
    private String title;
    private String type;
    private String author;
    private String publisher;

    public bookVo(){}

    public bookVo(int num, String title, String type, String author, String publisher) {
        this.num = num;
        this.title = title;
        this.type = type;
        this.author = author;
        this.publisher = publisher;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getPublisher() {
        return publisher;
    }

    public void setPublisher(String publisher) {
        this.publisher = publisher;
    }

    @Override
    public String toString() {
        return &quot;bookVo [num=&quot; + num + &quot;, title=&quot; + title + &quot;, type=&quot; + type + &quot;, author=&quot; + author + &quot;, publisher=&quot;
                + publisher + &quot;]&quot;;
    }



}
</code></pre>
<p>접근제어자의 종류:
public,protected,default,private
(1)public: 접근 제한이 전혀 없음
(2)protected: 같은 패키지 내, 다른 패키지의 자손 클래스에서 접근 가능
(3)default: 같은 패키지 내에서 접근 가능
(4)private:같은 클래스 내에서만 접근 가능</p>
<p>접근 범위가 넓은 쪽에서 좁은 쪽의 순 나열
public&gt;protected&gt;(default)&gt;private</p>
<p>3)다형성
:한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 하는 것
=조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 함</p>
<pre><code class="language-java">package oop3;

import java.util.ArrayList;
//메서드 재정의를 통한 다형성 구현
class Car{
    public String name;
    public Car(){
        name=&quot;Car&quot;;
    }
    public void horn() {
        System.out.println(&quot;빵빵&quot;);
    }
}

class 엠뷸런스 extends Car{
    public 엠뷸런스(){
        name = &quot;엠뷸런스&quot;;
    }
//메서드 재정의: 상속받은 메서드를 하위 클래스에 적합하게 수정
//메서드 껍데기는 그대로 내용만 수정
    @Override
    public void horn() {
        System.out.println(&quot;삐오삐오&quot;);
    }
    public void 환자이송() {
        System.out.println(&quot;환자를 이송함&quot;);
    }

}
class 소방차 extends Car{
    public 소방차(){
        name = &quot;소방차&quot;;
    }

    @Override
    public void horn() {
        System.out.println(&quot;에~~~엥&quot;);
    }
    public void 불끈다() {
        System.out.println(&quot;불을 끈다&quot;);
    }

}

class 경찰차 extends Car{
    public 경찰차(){
        name = &quot;경찰차&quot;;
    }

    @Override
    public void horn() {
        System.out.println(&quot;삐뽀삐뽀&quot;);
    }
    public void 범죄자이송() {
        System.out.println(&quot;범죄자를 이송함&quot;);
    }


}

public class CarMain {
    public static void main(String[] args) {
        //업캐스팅: 객체는 자식, 타입 부모인 캐스팅. 부모 클래스에 정의된 멤버만 사용가능
        //Car 타입으로 업캐스팅 됨
        ArrayList&lt;Car&gt; list = new ArrayList&lt;&gt;();
        list.add(new Car());
        list.add(new 엠뷸런스());
        list.add(new 소방차());
        list.add(new 경찰차());


        for(Car c:list) {
            System.out.println(c.name+&quot;의 소리&quot;);
            c.horn();


        //하위 클래스에 추가된 멤버를 사용하려면 다운캐스팅 해야함
        //instanceof: 객체 타입 비교 연산자.
        //양 항의 타입이 일치하면 true, 아니면 false 반환
        if(c instanceof 엠뷸런스) {
            ((엠뷸런스)c).환자이송();

        }else if(c instanceof 소방차) {
            ((소방차)c).불끈다();
        }else if(c instanceof 경찰차) {
            ((경찰차)c).범죄자이송();
        }
        }

    }

}</code></pre>
<p>실행결과
<img src="https://velog.velcdn.com/images/oh-taehyun/post/167a2452-0105-4b36-8398-56d56ec4efae/image.png" alt=""></p>
<p>3.이식성이 높다
-java 언어로 개발된 프로그램은 jre만 설치되어있으면 모든 운영체제에서 실행이 가능함
출처:<a href="https://akdl911215.tistory.com/312">https://akdl911215.tistory.com/312</a></p>
<ol start="4">
<li><p>자동 메모리 관리
자바로 작성된 프로그램이 실행되면, 가비지컬렉터가 자동적으로 메모리를 관리해 줌</p>
</li>
<li><p>네트워크와 분산처리를 지원
네트워크 프로그래밍 라이브러리(java api)를 통해 비교적 짧은 시간에 네트워크 관련 프로그램을 쉽게 개발할 수 있게 지원함</p>
</li>
<li><p>멀티쓰레드 지원
자바에서 개발되는 멀티쓰레드 프로그램은 일반적인 멀티쓰레드와 달리 시스템과 관계없이 구현가능하며. 관련된 라이브러리가 제공되므로 구현이 쉽다. 또, 자바 인터프리터가 여러 쓰레드에 대한 스케줄링을 담당함</p>
</li>
<li><p>동적 로딩 지원
자바는 실행 시에 모든 클래스가 로딩되지 않고 필요한 시점에 클래스를 로딩하여 사용할 있다. 또, 일부 클래스가 변경되어도 전체 어플리케이션을 다시 컴파일하지 않아도 됨</p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로젝트-토큰받아오기]]></title>
            <link>https://velog.io/@oh-taehyun/%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%ED%86%A0%ED%81%B0%EB%B0%9B%EC%95%84%EC%98%A4%EA%B8%B0</link>
            <guid>https://velog.io/@oh-taehyun/%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%ED%86%A0%ED%81%B0%EB%B0%9B%EC%95%84%EC%98%A4%EA%B8%B0</guid>
            <pubDate>Thu, 23 Feb 2023 09:59:30 GMT</pubDate>
            <description><![CDATA[<p>dto에는 입력하는 값들만 들어가야함
사용자가 입력한 값만 dto에 들어간다.</p>
<p>처음에는 컨트롤러에서 @AuthenticationPrincipal을 사용하려 했는데 안됐다.
그래서 spring security에서 제공해주는 Authentication인터페이스를 가져올 것이다.
import는 spring security core로 한다.</p>
<p>return에는 타입을 ResponseEntity<ReviewSaveDro>로 한다.
  dto로 받고 로그인된 회원정보를 넣어줘야 함
  username은 로그인된 회원. user.getName()으로 회원정보를 가져온다. getName은 인터페이스가 제공해주는거라 그대로 해야한다.
 이제 타고 들어가야한다.
  optional로 user를 찾아라
  그다음에 seller에다가 찾은 user객체에 get으로 가져온다. </p>
<p>  기존에는 optional을 두번이나 날렸다.</p>
<p>  postman에서 로그인을 먼저해라</p>
<p>  header에 Authorization에다가 Bearer 띄어쓰기 한번하고 access type 값 복사해준거 넣어주기</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로젝트 중 dto,controller에 대해 알게된것]]></title>
            <link>https://velog.io/@oh-taehyun/%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%A4%91-dtocontroller%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EA%B2%8C%EB%90%9C%EA%B2%83</link>
            <guid>https://velog.io/@oh-taehyun/%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%A4%91-dtocontroller%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EA%B2%8C%EB%90%9C%EA%B2%83</guid>
            <pubDate>Thu, 23 Feb 2023 06:04:13 GMT</pubDate>
            <description><![CDATA[<ol>
<li><p>request를 위해 존재하는 dto는 실제 화면에서 내가 입력해야 하는 값들만 변수로 놔두면 된다. 
<img src="https://velog.velcdn.com/images/oh-taehyun/post/7f7bf8f0-7810-48f4-80d8-4a0f6c6a5463/image.png" alt=""></p>
</li>
<li><p>controller는 dto를 통해 db에 접근한다.</p>
</li>
<li><p>service 메서드 안에는 setter가 없는 걸 권장한다.</p>
</li>
<li><p>controller안에 @restController가 있다면</p>
</li>
</ol>
<p>post를 하는 메서드에서 함께 받아야할 데이터가 있다면 @RequestBody를 넣어줘야한다.
<img src="https://velog.velcdn.com/images/oh-taehyun/post/f0f9ac54-d7fe-42b0-ad18-8d277451f03f/image.png" alt=""></p>
<p>참고링크:<a href="https://memostack.tistory.com/162">https://memostack.tistory.com/162</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[msa 기본]]></title>
            <link>https://velog.io/@oh-taehyun/msa-%EA%B8%B0%EB%B3%B8</link>
            <guid>https://velog.io/@oh-taehyun/msa-%EA%B8%B0%EB%B3%B8</guid>
            <pubDate>Tue, 21 Feb 2023 03:52:12 GMT</pubDate>
            <description><![CDATA[<p>소프트웨어 아키텍처: 소프트웨어 도면을 작성하는 것</p>
<p>uml: (개발자쪽에 치중된) java를 모르는 사람들에게 시스템을 표현해줄 수 있는 표준화된 언어
아키텍처 관점을 view라고 하는데 4+1뷰가 있음</p>
<p>logical view, development view, process view, physical view</p>
<p>소프트웨어 아키텍처 스타일
스타일은 접근방법을 제시하고, 패턴은 구체적인 해결전술을 제시
ex. a 다음에 b를 하고 b 다음 c를 해야해-&gt; 스타일
c를 구현하는데 프록시패턴으로 구현할 것인지, 빌더패턴으로 구현할것인지...
msa는 코딩영역으로 보기이전에 아키텍처에 관한 스타일이다.
전체적인 구조를 만드는 능력이 중요함</p>
<p>-모놀리스에서 마이크로서비스로 변화
모놀리스: 하나의 애플리케이션으로 묶어서 처리
민첩한 대응이 어렵다
ex. 개발1팀, 개발2팀, 공통팀, 품질팀
처음에 공통팀이 인터페이스를 잘못 설계하면 개발1팀, 2팀이 많은 어려움을 겪음
서로 경계가 크면 책임을 서로 전가하게됨</p>
<p>스케일업: 서버한대를 증설한다</p>
<p>마이크로서비스아키텍처: 아주 작은 단위로 동작하는 서비스가 구동되도록 시스템 및 소프트웨어의 구성과 구성요소 간의 관계를 정의한 아키텍처
모놀리스 아키텍처와의 가장큰 차이점은 애플리케이션 기능뿐만 아니라 데이터까지 분리하여 격리된 독립환경으로 구성하는것</p>
<p>서비스지향 아키텍처</p>
<ol>
<li>서비스 계약: 서비스제공자와 소비자사이의 규칙을 준수해야함</li>
<li>서비스 가용성: 요청에 대한 반응이 일정시간동안 없으면 기존경로 차단, 다른 경로로 요청 경로를 변경
서로커뮤니케이션이나 빠른대처 이런게 안되면 책임소재를 전가하게된다.</li>
<li>서비스관리: 특정 서비스에 오류가 발생하면 자연스럽게 다른 정상적인 서비스로 요청 흐름의 변경도 가능함. 서비스의 상태는 시간화하여 모니터링할 수 있어야함</li>
</ol>
<p><img src="https://velog.velcdn.com/images/oh-taehyun/post/3c3f50a6-59d3-4e95-9d20-447634b1155e/image.png" alt=""></p>
<p>클라우드 네이티브</p>
<p>탄력적 아키텍처: 서비스 생성-통합-배포-비즈니스 환경 변화에 대응시간을 단축, 오류를 예측하고 적절히 대응할 수 있는 아키텍처 구조</p>
<p>무상태 통신 프로토콜
요청을 비동기로 보내놓고 응답이 오던 말던 하고싶은 일을 하다가 응답온 내용을 받아오면 됨</p>
<p>카프카 메신저 </p>
<p>동기요청해야하는 경우/비동기요청해야하는 경우</p>
<p>-동기요청: 조회작업
-비동기요청: 추가,수정,삭제
콘테이너별로 웹서버 하나가 있어야함
웹서버의 종류는 다양</p>
<p>내장된 랜더링 엔진이 있기때문에 </p>
<p>자바스크립트 해석기</p>
<p>서비스와 서비스간의 요청도 msa에서는 </p>
<p>ㅈ 슈<br><img src="https://velog.velcdn.com/images/oh-taehyun/post/1064cb33-fef2-4bb5-b4e5-cfa6fa71da84/image.png" alt="">
스프링부트는 내장된 콘텍스가있다</p>
<p>이벤트스트밍 다시 다듬어야할 필요가 있음</p>
<p>msa 적용시 고려사항
디자인 패턴으로 유명한 Martin Fowler는 모놀리식으로 관리하기에 특별히 복잡한 시스템을 운영할 상황이 아니면 마이크로 서비스 도입을 고려하지 말 것을 강조하고 있다.</p>
<p>서킷브레이커
-서비스간 장애 전파 차단 p37
Hystrix는 분산환경을 위한 장애 및 지연 내성(Latency and Fault Tolerance)을 갖도록 도와주는 라이브러리. MSA에서는 각각의 서비스들이 독립적이지만, 장애가 전파될 수 있는 성질이 있어 이를 미연에 방지하기 위한 Circuit Breaker가 필수적이다</p>
<p>비동기처리하는게 좋다</p>
]]></description>
        </item>
    </channel>
</rss>