<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>vryez1_.log</title>
        <link>https://velog.io/</link>
        <description>백엔드 개발자취</description>
        <lastBuildDate>Fri, 11 Jul 2025 13:05:54 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>vryez1_.log</title>
            <url>https://velog.velcdn.com/images/vryez1_/profile/c492c918-3da9-4c71-9f7b-3537f69bd0cf/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. vryez1_.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/vryez1_" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[네이버 부스트캠프 10기 후기]]></title>
            <link>https://velog.io/@vryez1_/%EB%84%A4%EC%9D%B4%EB%B2%84-%EB%B6%80%EC%8A%A4%ED%8A%B8%EC%BA%A0%ED%94%84-10%EA%B8%B0-%ED%9B%84%EA%B8%B0</link>
            <guid>https://velog.io/@vryez1_/%EB%84%A4%EC%9D%B4%EB%B2%84-%EB%B6%80%EC%8A%A4%ED%8A%B8%EC%BA%A0%ED%94%84-10%EA%B8%B0-%ED%9B%84%EA%B8%B0</guid>
            <pubDate>Fri, 11 Jul 2025 13:05:54 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/vryez1_/post/1b8d484f-16b1-4e64-993f-3c1aec898e05/image.png" alt=""></p>
<hr>
<h2 id="지원-배경">지원 배경</h2>
<p>네이버 부스트캠프 모집공고를 봤을 때 가장 흥미를 끈 문구는 &#39;인공지능 시대의 서비스 개발자&#39; 였습니다. 인공지능으로 인해 진로에 대해 고민이 있던 저에게 네이버 부스트캠프에 대해 흥미를 가지게 되었습니다. 하지만, 모집 분야에서 웹 풀스택에서 프로그래밍 언어로 JavaScript를 사용하는 것이 맞을 까 싶었지만 여러 후기와 네이버 부스트 캠프 OT를 통해서 JavaScript를 접하지 않더라도 미션을 통해서 준비할 수 있겠다고 생각을 해서 지원하게 되었습니다.</p>
<hr>
<h2 id="베이직2주의-학습-과정">베이직(2주)의 학습 과정</h2>
<p>베이직 과정은 평일 오전 10시에 미션을 주고, 이를 해결에서 gist 제출 후 피어 피드백과 수료자의 접근법을 보면서 미션을 바라보는 여러 관점을 확인하는 순서로 진행됩니다. 
미션을 해결하는데 있어서 기초 학습 내용을 가르쳐 주는 것이 아닌, 직접 학습하고 해결해야 한다는 점에서 이때까지 했던 과제와 가장 큰 다른점이라고 생각했습니다.</p>
<p>학습 과정에서 가장 흥미로웠던 점은 같은 미션을 가지고 여러 사람의 접근 관점과 방식을 많이 접할 수 있다는 점이었습니다. 그룹에서 약 100명의 미션 접근 방법과 수료자의 접근법까지 여러 관점을 보면서 성장하는 점이 가장 흥미로웠습니다. </p>
<hr>
<h2 id="추천하는-학습-방법">추천하는 학습 방법</h2>
<ol>
<li><p>미션을 미루지 않기</p>
<p>베이직 과정을 진행하면서 가장 중요하게 생각한 방법으로 미루게 되면 미션을 통해 배울 수 있는 질이 많이 떨어 진다고 생각했기 때문에 미루지 않는 것이 가장 중요한 학습 방법이라고 생각했습니다.</p>
</li>
<li><p>여러 미션 관점 많이 접하기</p>
<p>제가 JavaScript를 적응하는데 가장 많은 도움을 준 방법입니다. 여러 관점을 보고 모르는 것은 학습하면서 정리한 것이 코딩테스트 준비에도 가장 많은 도움이 되었습니다. </p>
</li>
</ol>
<hr>
<h2 id="베이직을-통해-느낀-점과-다짐">베이직을 통해 느낀 점과 다짐</h2>
<p>가장 많이 성장한 점은 여러 사람의 관점을 보면서 나의 것으로 만드는 능력과 여러 미션의 요구사항을 파악하고 이를 나만의 언어로 정리하는 과정을 통한 문제 해결력 같습니다. 노력의 결과로 챌린지에 합격하면서, 성장한 것과 더불어 커뮤니케이션을 좀 더 성장시켜야겠다고 다짐했습니다! </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Java] 상속]]></title>
            <link>https://velog.io/@vryez1_/Java-%EC%83%81%EC%86%8D</link>
            <guid>https://velog.io/@vryez1_/Java-%EC%83%81%EC%86%8D</guid>
            <pubDate>Tue, 04 Feb 2025 06:47:59 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p>상속의 필요성
내가 생각하는 상속이 가장 필요한 이유는 객체지향의 특징 중 하나인 다형성을 극대화하기 위해서 상속이 필요하다고 생각한다. 하지만, 다형성에 대해 학습은 다음에 예정되어 있기 때문에 다른 이유를 생각해보면 코드의 효율성과 생산성을 높일 수 있기 때문에 상속을 필요하다고 생각한다.</p>
<ul>
<li>코드의 효율성과 생산성
위에서 말한 코드의 효율성과 생산성이 대체 뭐지 라고 생각할 수 있다。 간략하게 설명해서 코드의 효율성은 프로그램이 주어진 자원을 얼마나 잘 활용하는지, 코드의 생산성은 명확하며, 재사용이 가능하며, 유지 보수가 좋은지를 설명한다고 알면 되고 상속을 학습하면서 차차 알아보면 좋을 것 같다.</li>
</ul>
</li>
</ul>
<hr>
<blockquote>
<p>상속 관계</p>
</blockquote>
<ul>
<li><p>상속이란
상속이 왜 필요한지, 위에서 알아보았다. 그러면, 상속이 무엇인지 설명을 먼저 하겠다. 
상속은 객체지향 프로그래밍에서의 특징 중 하나로, 기존 클래스를 기반으로 새로운 클래스를 정의하는 것을 말한다. </p>
<ul>
<li>특징</li>
</ul>
<ol>
<li>부모 클래스의 속성과 메서드를 자식 클래스가 그대로 물려받아 사용할 수 있다. </li>
<li>자식 클래스는 부모 클래스의 기능을 확장하거나 재정의(오버라이드)하여 새로운 기능을 추가할 수 있다. </li>
<li>상속을 사용하면 코드의 중복을 줄일 수 있고, 공통된 기능을 부모 클래스에 정의해두어 유지 보수성을 높일 수 있다. </li>
</ol>
<p>이러한, 특징이 위에서 말한 코드의 효율성과 생산성을 높이고 상속이 필요한 이유를 설명해준다. </p>
</li>
</ul>
<blockquote>
<p>상속 사용법</p>
</blockquote>
<ul>
<li><p>코드로 상속을 확인</p>
<pre><code class="language-java">public class Parent {
      public void eat() {
          System.out.println(&quot;음식을 먹습니다.&quot;);
       }
}</code></pre>
<pre><code class="language-java">public class Child extends Parent {
     @Override
      public void eat() {
              System.out.println(&quot;음식을 자식이 먹습니다.&quot;);
      }
}</code></pre>
<p>먼저, 상속은 extends 키워드를 사용하여 부여할 수 있다. 위의 특징에서 말한 재정의를 통해 Child 클래스에서 부모에서 정의한 eat 메서드를 재정의하여 사용할 수 있다. 메서드 오버라이드는 @Override  애노테이션을 통해 이루어 지며, 메서드 오버라이딩에 대해 뒤에서 설명할 예정이다. 만약, Child 클래스에서 부모 클래스의 메서드를 재정의하지 않는다면 부모 클래스의 메서드를 그대로 불러오게 된다. 자세한 설명은 뒤에서 할 예정이다. </p>
<p>또한, 상속은 단일 상속만 가능하다. 
<img src="https://velog.velcdn.com/images/vryez1_/post/f2adb43d-93ac-47a9-a01c-cf82678ab657/image.jpg" alt=""> 위와 같이 Child 클래스가 Dad 클래스와 Mom 클래스를 상속받고 Child가 eat() 메서드를 재정의 하지 않는다면 실행 시, 어느 부모의 eat()을 사용해야 할지 모르기 때문에 상속은 다중 상속이 불가능하다.</p>
</li>
</ul>
<blockquote>
<p>상속과 메모리 구조</p>
</blockquote>
<p>  위에서 메서드를 재정의 하지 않으면 부모의 메서드를 이용한다고 하였다. 말로만 들으면 잘 와닿지 않기 때문에 상속 객체가 메모리에 생성되고 메서드를 불러오는 과정을 그림을 통해 설명하겠다. </p>
<ul>
<li><p>Child 인스턴스 생성 시 메모리 구조
<img src="https://velog.velcdn.com/images/vryez1_/post/ee8cb36e-fb99-4ca1-b8be-1a5a86c6ea40/image.jpg" alt=""> 위와 같이 Child 인스턴스 생성 시 Child 클래스 정보와 상속받은 Parent 클래스 정보 2개가 한 인스턴스에 생성된다. 위는 Child 클래스에서 부모 메서드를 재정의 하지 않은 것이라고 가정한다면, 메인에서 Child 인스턴스를 통해 eat() 메서드를 호출한다면 먼저 Child 클래스 정보에서 eat 메서드가 재정의 되었는지, 아니면 기능을 추가했는지 확인한 후 없으면 Parent 클래스에서 eat 메서드를 호출하게 된다. 따라서, Child는 부모의 메서드를 인스턴스 내에 Parent 클래스 정보를 가지고 있음으로써 사용할 수 있게 된다. </p>
<p>다만, 설명을 하는데 있어 담은 타입에 따라 Child를 탐색하는지, Parent를 바로 가는지 달라지게 되는데 이는 다형성을 학습하면서 설명을 할 예정이다. </p>
</li>
</ul>
<blockquote>
<p>상속과 메서드오버라이딩</p>
</blockquote>
<ul>
<li><p>메서드 오버라이딩</p>
<p>위에서 설명했지만, 다시 설명하자면 상속받은 기능을 자식이 재정의 하는 것을 메서드 오버라이딩이라고 한다. 
또한, 오버라이딩은 컴파일러가 @Override 와 같이 애노테이션을 통해 확인할 수 있기 때문에 오버라이딩을 한다면 앞에 @Override를 달아주어서 컴파일러가 메서드 오버라이딩을 놓치는 실수를 사전에 방지해주어야 한다. </p>
<ul>
<li>메서드 오버라이딩 조건 
메서드 오버라이딩에는 여러 조건이 있지만, 주요 조건만 알아볼 예정이다.</li>
</ul>
<ol>
<li>접근 제어자 : 오버라이딩 메서드의 접근 제어자는 상위 클래스의 메서드보다 더 제한적이어서는 안된다. </li>
<li>예외 : 상위 클래스의 메서드보다 더 많은 체크 예외를 throws로 선언할 수 없다. </li>
<li>static, final, private 키워드가 붙은 메서드는 오버라이딩할 수 없다. 
 static : 클래스 레벨에서 작동하므로 인스턴스 레벨에서 사용하는 오버라이딩은 의미가 없다. 
final : 메서드는 재정의를 금지한다.
private : 해당 클래스에서만 접근이 가능하므로, 하위 클래스에서는 보이지 않는다.</li>
<li>생성자 오버라이딩 : 생성자는 오버라이딩 할 수 없다.</li>
</ol>
</li>
</ul>
<blockquote>
<p>super 참조</p>
</blockquote>
<ul>
<li><p>super 키워드</p>
<p>부모와 자식의 필드명이 같거나 메서드가 오버라이딩 되어 있다면, 자식에서 부모의 필드나 메서드를 호출할 수 없다. 이때 super 키워드를 사용하면 부모를 참조할 수 있다. </p>
<pre><code class="language-java">public class Parent {
 public String name = &quot;엄마&quot;;
         public void hello() {
                 System.out.println(&quot;안녕~&quot;);
      }
}</code></pre>
<pre><code class="language-java">public class Child extends Parent {
        public String name = &quot;자식&quot;;

         @Override
        public void hello() {
             System.out.println(&quot;안녕하세요&quot;);
      }

         public String familyName() {
             return this.name + &quot; &quot; + super.name;
        }

 public String familyHello() {
             this.hello();
             super.hello();
        }
 }</code></pre>
<p> 위와 같이 super 키워드를 생성할 수 있고, 또한 앞에서 설명했던 this() 생성자 호출도 super() 생성자를 통해 부모 타입의 생성자를 호출할 수 있고 자식에서는 필수로 해야 하지만, 파라미터가 없는 경우 생략이 가능하다. </p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Java] Final 키워드]]></title>
            <link>https://velog.io/@vryez1_/Java-Final-%ED%82%A4%EC%9B%8C%EB%93%9C</link>
            <guid>https://velog.io/@vryez1_/Java-Final-%ED%82%A4%EC%9B%8C%EB%93%9C</guid>
            <pubDate>Mon, 03 Feb 2025 05:02:06 GMT</pubDate>
            <description><![CDATA[<ul>
<li>final 키워드
final 키워드의 의미는 &#39;마지막&#39;이라는 직관적인 뜻을 가지고 있다. static 키워드와 마찬가지로, 변수, 메서드, 클래스 앞에 사용가능하고 메서드와 클래스 앞에 붙는 final은 다음 학습인 상속을 학습하면서 설명하도록 하겠다. </li>
</ul>
<blockquote>
<p>final 변수</p>
</blockquote>
<ul>
<li><p>필요성
final 키워드가 필요한 이유는 무엇일까? final 키워드를 사용하게 되면 변수에 값을 설정한 경우 변경이 불가해진다. 이러한 특성은 코드의 안정성과 예측 가능성을 높힐 수 있기 때문에 final 키워드가 필요하다고 생각했다.</p>
</li>
<li><p>final 지역 변수</p>
<pre><code class="language-java">public static void main(String[] args) {
      final int capacity = 10;
        final City city = new Seoul();

         capacity = 20;
         city = new Busan();
}</code></pre>
<p>위와 같이 final 지역 변수를 앞에서 학습한 기본형과 참조형으로 선언하였다. 먼저, capacity 변수를 20으로 변경하면 어떻게 될까? 당연히 final 변수는 변경 불가능하기 때문에, 컴파일 오류가 발생할 것이다. 마찬가지로 참조형 변수인 city 또한, 부산으로 변경이 불가능할 것이다.</p>
<pre><code class="language-java">public static void main(String[] args) {
       final City city = new Seoul();

        city.food = &quot;물떡&quot;;
}</code></pre>
<p> 위와 같이 city의 참조된 객체의 값은 변경할 수 있다. 따라서, city의 객체 참조값은 변경될 수 없지만, city 객체의 값은 변경할 수 있다는 것을 유의하자.</p>
<ul>
<li><p>final 멤버 변수
위에서 지역 변수에서의 final 사용법 및 주의사항을 알아 보았다. 그러면 멤버 변수에서는 어떻게 사용할까? </p>
<pre><code class="language-java">public class City {
  private final capacity; 
}</code></pre>
<p>위와 같이 멤버 변수가 있을 때, 기존의 값 설정 방법을 생각하면 2가지가 있을 것이다.</p>
<ul>
<li><p>필드에서 값 설정</p>
<pre><code class="language-java">public class City {
      private final capacity = 100_000;
}</code></pre>
<p>필드를 통해 바로 값을 설정하는 방법이다.</p>
</li>
<li><p>생성자를 통한 값 설정</p>
<pre><code class="language-java">public class City {
      private final capacity;

         public City(int capacity) {
             this.capacity = capacity;
      }
}</code></pre>
<p>생성자를 통해 바로 값을 설정하는 방법이다. 여기서 주의할 점은 필드를 통해 값을 설정한다면 생성자를 통해 값을 또 설정할 시 컴파일 오류가 발생한다는 점을 주의하자.</p>
</li>
</ul>
</li>
</ul>
</li>
<li><p>상수
상수는 변하지 않고, 항상 일정한 값을 갖는 수를 말하고, 자바에서는 보통 단 하나만 존재하는 변하지 않는 고정된 값을 말한다.</p>
<ul>
<li><p>상수 사용법
상수를 표현하기 위해서는 어떻게 해야할까? 일단, 상수는 변하지 않아야 하니 final 키워드를 사용할 것이다. 그리고 상수를 객체 마다 만들어야 할 이유가 없기 때문에 static 키워드를 통해 클래스 내에서 공용을 사용할 것이다. 
따라서, 상수는 static 키워드와 final 키워드를 붙혀 아래와 같이 static final 을 이용해서 표현할 수 있다.</p>
<pre><code class="language-java">public class City {
      public static final CAPACITY = 100_000;
      public static final CITY_SPOT = 1_000;
}</code></pre>
</li>
<li><p>상수 특징
위에서 본 것처럼 상수는 대문자를 사용하고 구분은 _(언더스코어)로 한다. 
그리고, 상수에 접근할 때에는 필드를 직접 접근해서 사용한다. 예시로 아래와 같이 사용한다.</p>
<pre><code class="language-java">public static void main(String[] args) {
      System.out.pringln(City.CAPACITY);
}</code></pre>
<p>위와 같이 필드에 직접 접근하는 이유는 상수는 기능을 하는 것이 아니라, 고정된 값 자체를 사용하는 목적이기 때문이다. 또 다른 하나는, 상수는 값을 변경할 수 없기 때문에 외부에서 데이터에 접근하더라도 값을 변경할 수 없다. 따라서, 상수는 필드에 직접 접근하여 사용한다.</p>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Java] Static 키워드]]></title>
            <link>https://velog.io/@vryez1_/Java-Static-%ED%82%A4%EC%9B%8C%EB%93%9C</link>
            <guid>https://velog.io/@vryez1_/Java-Static-%ED%82%A4%EC%9B%8C%EB%93%9C</guid>
            <pubDate>Sun, 02 Feb 2025 06:00:45 GMT</pubDate>
            <description><![CDATA[<p>static 키워드</p>
<ul>
<li>static 키워드는 변수, 메서드, 클래스 앞에 사용될 수 있다. 변수, 메서드, 클래스 앞에 static 키워드 사용의 필요성, 사용법 순으로 설명할 예정이다.</li>
</ul>
<hr>
<blockquote>
<p>static 변수 (클래스 변수, 정적 변수)</p>
</blockquote>
<ul>
<li>필요성<pre><code class="language-java"> public class Member {
         private int count;
          private String name;
          private int weight;
 }</code></pre>
 위와 같이 Member 클래스에서 member 객체의 수를 저장하고 싶을 때 위와 같이 변수를 선언하면 각 객체가 생성될 때 마다 객체 내에서 count 변수를 생성하기 때문에 제대로 count가 동작하지 않을 것이다. 이를 해결하기 위해 Counter 클래스를 따로 생성하며 Member 클래스의 생성자에 주입하여 해결할 수 있을 것이다. 하지만, Member 클래스에 관련된 일인데, Counter라는 별도의 클래스를 추가해서 사용해야 한다는 점과 생성자의 매개변수가 추가되고, 이에 따라서 복잡해진다는 불편함을 느낄 수 있을 것이다. 
이 부분에서 Class 내부에서 공용으로 사용할 수 있는 자원이 있으면 편하게 해결 할 수 있다는 느낌을 받을 수 있고 이에 따라 static 키워드가 필요해진다.</li>
</ul>
<ul>
<li><p>사용법</p>
<pre><code class="language-java">  public class Member {
      private static int count;
          private String name;
          private int weight;
   }
</code></pre>
<p>위와 같이 사용 변수 타입 앞에 static을 붙혀 사용할 수 있다. 전에 자바의 메모리 구조를 설명하면서 메서드 영역에는 static을 위한 메모리 공간이 있다고 설명했는데 static 변수는 클래스의 객체가 공유하는 것임을 이해한다면 프로그램 종료 까지 살아있는 메서드 영역에 static 영역이 있어야 한다는 것을 알 수 있을 것이다. 마찬가지로 만들어진 인스턴스에서 static 변수의 접근은 <img src="https://velog.velcdn.com/images/vryez1_/post/d9684110-9dba-4f38-8e57-acdb4a2d4dc0/image.jpg" alt=""> 위의 그림과 같이 이루어진다는 것을 알 수 있다. </p>
</li>
<li><p>static 변수 접근
static 변수를 접근하는 방법에는 인스턴스를 통한 접근과 클래스를 통한 접근 2가지가 있다. </p>
<ul>
<li>인스턴스를 통한 접근<pre><code class="language-java">System.out.println(member1.count);</code></pre>
기존 인스턴스 변수 접근법과 똑같다.</li>
<li>클래스를 통한 접근 <pre><code class="language-java">System.out.println(Member.count);</code></pre>
클래스 접근을 통해 static 변수 접근이 가능하다.</li>
<li>두 접근 중 어떻게 접근해야 할까? 
정적 변수는 클래스 내에서 공용으로 관리하기 때문에 클래스를 통해서 접근하는 것이 명확하다. 따라서, static 변수를 접근할 때에는 클래스를 통해서 하는 것이 좋다.</li>
</ul>
</li>
</ul>
<blockquote>
<p>static 메서드 (클래스 메서드, 정적 메서드)</p>
</blockquote>
<ul>
<li><p>필요성</p>
<pre><code class="language-java">   public class Utils {
  public int add(int a, int b) {
          return a + b;
          }
   }</code></pre>
<p>위와 같이 클래스를 선언하여 add 메서드를 사용하고 싶다면 </p>
<pre><code class="language-java">   public static void main(String[] args) {
          Utils util = new Utils();
       int result = util.add(10, 5);
       System.out.println(result);
   }</code></pre>
<p>와 같이 Uitls 인스턴스를 생성하고 add 메서드를 인스턴스를 통해 호출해야지 사용가능할 것이다. 하지만, 위와 같은 방법은 Utils 클래스는 메서드만 제공하기 때문에 굳이 인스턴스를 생성해야 할까? 라는 의문이 든다. 이 때, 사용할 수 있는 것이 static 키워드를 이용한 static 메서드이다.</p>
</li>
<li><p>사용법</p>
<pre><code class="language-java">public class Utils {
   public static int add(int a, int b) {
          return a + b;
   }
}</code></pre>
<p>와 같이 static 키워드를 메서드 반환 타입 앞에 사용하면 된다. static 메서드는 static 변수와 같이 자바 메모리 구조에서 메서드 영역에 존재한다.
또한, static 메서드 내에서 인스턴스 메서드에 접근은 불가능하다. 왜냐하면, static 메서드는 객체를 생성하지 않고 클래스를 통해 호출이 가능하기 때문에 인스턴스 메서드를 static 메서드에서 호출하게 된다면 컴파일 오류가 발생하기 때문이다. </p>
</li>
<li><p>static 메서드 접근 
static 메서드 또한 접근 방법이 인스턴스를 통한 접근과 클래스를 통한 접근 2가지가 있다. 하지만, 인스턴스를 통한 접근은 static 메서드의 필요성을 부정하기 때문에 클래스를 통해 접근을 권장한다.</p>
<ul>
<li>클래스를 통한 접근<pre><code class="language-java">public static void main(String[] args) {
  int result = Utils.add(5, 10);
    System.out.println(result);
}</code></pre>
</li>
</ul>
</li>
<li><p>static import
static 메서드를 자주 호출한다면 static import를 통해 호출하면 메서드를 간단하게 호출할 수 있다.</p>
<pre><code class="language-java">import static Utils.add;

public class Main {
    public static void main(String[] args) {
      int result = add(5, 10);
   System.out.println(result);
   }
}</code></pre>
</li>
<li><p>정적 메서드의 활용
위의 필요성에서 잠깐 이야기 한 것 처럼 객체 생성이 필요 없이 메서드의 호출만으로 필요한 기능을 수행할 때 주로 사용한다.</p>
</li>
</ul>
<blockquote>
<p>static 클래스 </p>
</blockquote>
<ul>
<li>정적 중첩 클래스 
static 키워드는 클래스 앞에 사용할 수 있으며, 이에 대해서는 뒤에 내부 클래스를 설명할 때 자세하게 설명할 예정이다. 지금은 static은 클래스 앞에도 사용할 수 있다는 정도만 알고 있어도 된다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Java] 자바 메모리 구조]]></title>
            <link>https://velog.io/@vryez1_/Java-%EC%9E%90%EB%B0%94-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0</link>
            <guid>https://velog.io/@vryez1_/Java-%EC%9E%90%EB%B0%94-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0</guid>
            <pubDate>Mon, 27 May 2024 02:07:05 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>자바 메모리 구조</p>
</blockquote>
<ul>
<li><p>메모리 구조에 대해서 왜 알고 있어야 할까? </p>
<p>형식적인 이유로는 성능 최적화, 디버깅 및 문제해결, 자원 관리 등 여러 이유가 있을 수 있지만 내가 생각하는 메모리 구조에 대해 알고 있어야 하는 이유는 앞으로 공부하게 될 static 과 final 그리고 다형성을 제대로 이해하기 위해서는 메모리 구조를 정확하게 이해하고 있어야 가능하다고 생각한다. 따라서, 앞으로 나아가기 위한 계단을 걷기위한 단계이기 때문에 꼭 이해하고 넘어가야 한다. </p>
</li>
<li><p>자바 메모리 구조</p>
<p>자바 메모리 구조는 3개의 영역으로 나눌 수 있다. </p>
<ul>
<li>메서드 영역 : 클래스 정보를 보관하는 영역이다. </li>
<li>스택 영역 : 실제 프로그램이 실행되는 영역이다. </li>
<li>힙 영역 : 객체(인스턴스)가 생성되는 영익이다. </li>
</ul>
</li>
</ul>
<ul>
<li><p>메서드 영역
메서드 영역은 프로그램을 실행하는데 필요한 공통 데이터를 관리한다. 이 영역은 프로그램의 모든 영역에서 공유한다.
<img src="https://velog.velcdn.com/images/vryez1_/post/9bb32419-fa01-4d61-ad58-a7ac82d2c08e/image.jpg" alt=""></p>
<ul>
<li>클래스 정보 : 클래스의 실행 코드(바이트 코드), 필드, 메서드와 생성자 코드등 모든 실행 코드가 존재한다.</li>
<li>static 영역 : static 변수들을 보관한다.</li>
<li>런타임 상수 풀 : 프로그램을 실행하는데 필요한 공통 리터럴 상수를 보관한다.</li>
</ul>
</li>
<li><p>스택 영역
자바 실행 시, 하나의 실행 스택이 생성된다. 각 스택 프레임은 지역 변수, 중간 연산 결과, 메서드 호출 정보 등을 포함한다.
<img src="https://velog.velcdn.com/images/vryez1_/post/ac033a4e-5930-4e36-8985-4eaf7997bb8a/image.jpg" alt=""></p>
<ul>
<li><p>스택 프레임 : 스택 영역에 쌓이는 네모 박스가 하나의 스택 프레임이다. 메서드를 호출할 때 마다 하나의 스택 프레임이 쌓이고, 메서드가 종료되면 스택 프레임이 제거된다.</p>
</li>
<li><p>위에서 자바 실행 시, 하나의 실행 스택이 생성된다고 하였는데 이는 메인 스레드가 하나 생성된 것과 같은 의미이다. 다시 말해, 스레드가 한개 추가 될 때마다 하나의 스택 영역에 추가로 생성 된다.</p>
</li>
<li><p>이 후, 스레드에 대해 학습할 때 더욱 자세히 설명할 예정이다.</p>
</li>
</ul>
</li>
<li><p>힙 영역
객체(인스턴스)와 배열이 생성되는 영역이다. 가비지 컬렉션(GC)이 이루어지는 주요 영역이며, 더 이상 참조되지 않는 객체는 GC에 의해 제거된다.
<img src="https://velog.velcdn.com/images/vryez1_/post/83e394fe-d5c3-4a2d-953c-6e33356ffa2c/image.jpg" alt=""></p>
<ul>
<li>위의 그림을 보면, 스택 프레임에 인스턴스의 메서드를 호출한 모습으로 가정해보자. 이후 Data 인스턴스가 추가 되었을 때, 어떤 인스턴스의 메소드를 호출했는지 기억하기위해, 해당 인스턴트의 참조값을 스택 프레임 내에 저장한다. 이 것이 인스턴스 내에서 사용되는 this이다.</li>
</ul>
</li>
<li><p>각 영역에서의 변수 위치
마지막으로 변수 종류를 알아보고 어떤 영역에 올라가는지 보면서 이해를 해보겠다.
  <img src="https://velog.velcdn.com/images/vryez1_/post/a6bae042-3bb0-466a-b8b3-679c7a061c0c/image.jpg" alt=""></p>
<ul>
<li><p>static 변수 (클래스 변수) : 각 변수에 대한 자세한 설명은 다음 static 학습에서 설명할 예정이다. 변수의 저장 위치를 보면 메서드 영역에 있는 Static 영역에 저장되고 프로그램이 종료 될 때 사라진다.</p>
</li>
<li><p>Instance 변수 : 클래스 영역에서 static이 붙지 않은 객체가 생성될 때 생기는 변수로 변수의 저장 위치는 힙 영역의 객체 내에서 저장되며 GC에 의해 객체가 사라질 때 같이 변수도 사라진다.</p>
</li>
<li><p>Local 변수 : 메서드 내부에서 선언되어 있어, 스택 영역의 스택 프레임 내에서 저장되며 블록을 벗어날 때 (메서드가 종료 될 때) 같이 사라진다.</p>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Java] 프로그래머스 문제4 고찰]]></title>
            <link>https://velog.io/@vryez1_/Java-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%AC%B8%EC%A0%9C-4-%EA%B3%A0%EC%B0%B0</link>
            <guid>https://velog.io/@vryez1_/Java-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%AC%B8%EC%A0%9C-4-%EA%B3%A0%EC%B0%B0</guid>
            <pubDate>Sun, 12 May 2024 06:20:49 GMT</pubDate>
            <description><![CDATA[<h3 id="풀었던-문제-중에-다시-생각해-볼만한-문제에-대한-고찰">풀었던 문제 중에 다시 생각해 볼만한 문제에 대한 고찰</h3>
<blockquote>
<p>키패드 누르기 (2020 카카오 인턴쉽)</p>
</blockquote>
<hr>
<ul>
<li>문제 설명
<img src="https://velog.velcdn.com/images/vryez1_/post/e9f6088b-bbb8-4b23-929f-4f708638e557/image.png" alt=""></li>
</ul>
<p>numbers 라는 int형 배열에 0 ~ 9 까지의 정수가 주어지고 이 정수를 휴대폰 키패드에서 왼손으로 터치할 것인가 오른손으로 터치할 것인가 결정하여 String result를 반환하면 되는 문제이다. </p>
<p>1, 4, 7은 왼손으로 터치 후 누른 자리 유지, 3, 6, 9는 오른손으로 터치 후 누른 자리 유지, 마지막으로 2, 5, 8, 0은 왼손의 위치와 오른손의 위치 중 가까운 손으로 터치 후 누른 자리 유지하면 되는 방식이다. </p>
<p>2, 5, 8, 0에서 왼손의 거리와 오른손의 거리가 같다면 주어진 String hand에서 right(오른손 잡이)이면 오른손으로 터치, left이면 왼손으로 터치하면 된다.</p>
<hr>
<ul>
<li><p>내가 풀었던 풀이</p>
<ul>
<li><p>변수 선언 
<img src="https://velog.velcdn.com/images/vryez1_/post/14bbaeeb-7635-48e2-9131-2509e0c9a98e/image.png" alt=""> 왼손과 오른손의 현재 위치를 저장하는 변수를 int형 배열로 선언 후 초기화했다.</p>
</li>
<li><p>로직 설명
<img src="https://velog.velcdn.com/images/vryez1_/post/300057b1-78eb-4327-b589-bb0f5e20322c/image.png" alt=""> 반복문의 인덱스는 필요없다고 판단하여 for-each문으로 반복을 실행했다.</p>
<ul>
<li>number가 1, 4, 7 일 때 
<img src="https://velog.velcdn.com/images/vryez1_/post/8c7abd63-d745-4b98-8844-9d7ad50318a5/image.png" alt=""> 1, 4, 7 일 떄는 왼손으로 터치해야 되기 때문에 먼저 현재 왼손의 위치를 숫자 패드의 위치에 맞게 왼손 위치 배열의 값을 변경해줄 때 향상된 switch 문을 통해 간단하게 대입해주고 String answer 변수에 &quot;L&quot;를 더해주었다. </li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code>+ number가 3, 6, 9 일 때 

![](https://velog.velcdn.com/images/vryez1_/post/19e4056b-19a3-422a-9f8f-22576ce8e3e9/image.png) 3, 6, 9 일 때도 1, 4, 7 때와 마찬가지로 향상된 switch 문을 통해 키패드의 위치를 오른손 위치 배열에 대입해주었다. 

+ number가 2, 5, 8, 0 일 때

![](https://velog.velcdn.com/images/vryez1_/post/dfc15ed9-2739-4411-af8b-f1ca49ced651/image.png) 왼손의 위치와 오른손의 위치를 저장할 int형 변수를 선언해주고 Math.abs 메서드를 통해 정수의 절댓값을 반환하게 해주고 매개변수로는 왼손과 number의 x좌표와 y좌표의 차를 대입을 통해 거리 측정후 대입해주었다. 따라서 왼손의 거리가 작으면 &quot;L&quot;, 오른손이 크면 &quot;R&quot;, 같으면 주 손을 answer에 더하게 작성하였다. 나머지 5, 8, 0도 else if 조건문으로 똑같이 작성하여 문제를 해결하였다. </code></pre><hr>
<ul>
<li>문제 고찰</li>
</ul>
<p>사실 이 문제에 대해서 다시 고찰하게 된 이유는 위의 문제는 맨해튼 거리 공식을 이용해서 문제를 풀어야지 답으로 되고 유클리드 거리 공식으로 문제를 풀게 되면 오답이 나오기 때문에 무엇이 다른지 궁금하여 문제를 다시 생각해보게 되었다. </p>
<p>물론, 나의 풀이를 중복되는 부분이 많기 때문에 메서드를 추출하여 모듈화를 하면 깔끔하게 다시 풀었다. 문제를 다시 풀면서 메서드 추출 반환 타입을 좀 더 유연하게 하는 것이 부족하다는 것을 깨달았다. </p>
<ul>
<li><p>유클리드 거리 공식, 맨해튼 거리 공식</p>
<ul>
<li><p>유클리드 거리 공식 
유클리드 거리는 두 점 사이의 직선 거리를 계산하는 방법이다. 피타고라스의 정리를 기반으로 하여, 2차원의 두 점의 좌표를 java 에서는 Math.sqrt(Math.pow((x2 - x1), 2) + Math.pow((y2, y1), 2)로 Math 클래스를 이용하여 구현할 수 있다. </p>
</li>
<li><p>맨해튼 거리 공식
맨해튼 거리는 두 점사이의 수평 및 수직 거리의 합을 계산하는 방법이다. 2차원의 두 점의 좌표를 java에서는 Math.abs(x2 - x1) + Math.abs(y2 - y1)로 Math 클래스를 이용하여 구현할 수 있었다. </p>
</li>
<li><p>위의 문제에서 유클리드 거리가 오답인 이유
유클리드는 직선의 거리를 구하는 것이고 문제에서는 손이 이동할 때 직선으로 이동하는 것이 상하좌우로 이동하기 때문에 왼손이 4에 있고 오른손이 8에 있을 때 number가 2로 주어지면 유클리드 거리는 sqrt(2)이고 맨해튼은 2이기 때문에 거리에 차이가 있기 때문에 문제에서 원하는 거리 방식인 맨해튼을 통해 거리를 구했어야 했다. 문제를 볼 때 문제의 의도를 정확하게 파악해야겠다고 느꼈다.</p>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Java] 접근 제어자]]></title>
            <link>https://velog.io/@vryez1_/Java-%EC%A0%91%EA%B7%BC%EC%A0%9C%EC%96%B4%EC%9E%90</link>
            <guid>https://velog.io/@vryez1_/Java-%EC%A0%91%EA%B7%BC%EC%A0%9C%EC%96%B4%EC%9E%90</guid>
            <pubDate>Sat, 11 May 2024 06:51:30 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>접근 제어자란? </p>
</blockquote>
<p>접근 제어자는 클래스 내부 또는 외부에서 메소드 그리고 필드(변수)에 접근을 제어하는 역할을 하는 키워드이다. 클래스, 메소드에 접근한다는 것은 호출한다는 뜻이고 변수에 접근한다는 것은 변수의 값을 읽어 들인다는 뜻이다.</p>
<hr>
<ul>
<li><p>접근 제어자 종류</p>
<ul>
<li><p>public : 외부에서 모든 접근이 허용된 접근 제어자이다.</p>
</li>
<li><p>protected : 같은 패키지에 속해있을 때 접근이 허용되고, 예외적으로 상속 관계에 있으면 접근이 허용되는 접근 제어자이다.</p>
</li>
<li><p>default : 앞에 접근 제어자를 붙이지 않았으면 자동으로 default 접근 제어자가 할당 된다. 같은 패키지에 속해있을 때 접근이 허용된다.</p>
</li>
<li><p>private : 같은 클래스 내에서만 접근이 허용되는 접근제어자이다.</p>
</li>
<li><p>따라서 public &gt; protected &gt; default &gt; private 순으로 접근 허용 범위가 나뉘어진다. </p>
</li>
</ul>
</li>
</ul>
<hr>
<ul>
<li><p>클래스 접근 제어자 </p>
<ul>
<li><p>public 과 default 만 사용가능하다. </p>
</li>
<li><p>범위는 위의 접근 제어자와 동일하다. </p>
</li>
<li><p>하나의 자바 파일에 public 클래스는 하나만 등장할 수 있다. </p>
</li>
<li><p>하나의 자바 파일에 default 접근 제어자를 사용하는 클래스는 무한정 만들 수 있다. </p>
</li>
</ul>
</li>
</ul>
<hr>
<ul>
<li>접근 제어자의 필요성</li>
</ul>
<p>위에서 접근 제어자 그리고 클래스 접근 제어자에 대해 알아봤다. 그럼 왜 접근 제어자가 필요할까? 그냥 public으로 설정 후 사용해도 상관없지 않을까? 라고 생각할 수 있다. 아래에서 예시를 통해 변수에 접근 제어자와 메서드에 접근 제어자가 필요한 이유를 설명하겠다. </p>
<p><img src="https://velog.velcdn.com/images/vryez1_/post/04251d63-36cd-42c5-89ec-68b5eba6261d/image.png" alt=""> 위의 클래스는 Car 클래스에서 필드(변수)와 메서드를 모두 public으로 외부에서 모든 접근을 허용하였다. 이를 CarMain 클래스에서 보면 <img src="https://velog.velcdn.com/images/vryez1_/post/791078d3-f7cf-44ed-a4d3-2711b4e14dc0/image.png" alt=""> 와 같이 모든 메서드와 변수가 접근 가능하다. 이러한 상황에서 무슨 일이 일어날 수 있을까? 실무에서는 각 파트별로 업무가 나누어져 있어서 클래스를 만든 사람과 클래스를 이용하는 사람이 다를 수 있어 클래스를 이용하는 사람은 속도를 설정하는데 있어서 변수를 바로 이용할 것인지 어떤 메서드를 이용할 것인지 혼란이 올 수 있다. 또한, 보안 측면에서도 위험할 수 있다. 따라서 Car 클래스를 아래와 같이 수정해 보자. <img src="https://velog.velcdn.com/images/vryez1_/post/ab7a7e28-b1d3-425f-be62-7e8e51b1e616/image.png" alt=""> 이 후 CarMain 클래스에서 Car 클래스의 인스턴스를 이용할려고 보면 <img src="https://velog.velcdn.com/images/vryez1_/post/a04360e0-0e65-4379-ac90-1a23b95221f2/image.png" alt=""> 와 같이 클래스 만든 사람의 의도에 맞게 변수와 메서드에 허용을 막음으로써 이용하는 사람도 혼란이 오지 않고 클래스를 쉽게 사용할 수 있다. </p>
<ul>
<li>접근 제어자를 통한 객체 지향 프로그래밍의 한 걸음</li>
</ul>
<p>객체 지향 프로그래밍은 뒤에서 자세하게 설명을 할 예정이다. Java는 객체지향 프로그래밍언어 라는 것만 기억하자. 따라서 접근제어자는 객체지향 프로그래밍언어에서 다음과 같은 기능을 한다.</p>
<ol>
<li>데이터 감추기 </li>
<li>메서드 감추기</li>
</ol>
<p>데이터와 메서드를 감춤으로써 외부에서는 꼭 필요한 기능만 노출하고 나머지는 모두 내부로 감추는 것이다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[IntelliJ] 단축키 정리 1]]></title>
            <link>https://velog.io/@vryez1_/ItelliJ-%EB%8B%A8%EC%B6%95%ED%82%A4-%EC%A0%95%EB%A6%AC-1</link>
            <guid>https://velog.io/@vryez1_/ItelliJ-%EB%8B%A8%EC%B6%95%ED%82%A4-%EC%A0%95%EB%A6%AC-1</guid>
            <pubDate>Fri, 10 May 2024 01:44:39 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>IntelliJ 단축키 정리 1</p>
</blockquote>
<ul>
<li><p>psvm
psvm은 public static void main(String[] args)의 줄임말로 인텔리제에서 클래스 안에 psvm Enter를 치게 되면 바로 public static void main(String[] args)를 자동 타이핑해준다.
<img src="https://velog.velcdn.com/images/vryez1_/post/58fc911f-0a2c-4dd4-b11f-015a7540cee4/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/vryez1_/post/5f75ea42-bd58-4073-a12b-ff51ed123685/image.png" alt=""></p>
</li>
</ul>
<ul>
<li><p>sout
sout은 System.out.println()의 줄임말로 인텔리제이에서 sout Enter를 치게 되면 바로 System.out.println()을 자동 타이핑 해준다.
<img src="https://velog.velcdn.com/images/vryez1_/post/b1749558-89ed-4044-86c9-e017c82e3dc0/image.png" alt=""> <img src="https://velog.velcdn.com/images/vryez1_/post/0fbe08c8-51d9-4b2d-90c7-968f6dfd93f3/image.png" alt=""> 또한 위에서 나온거와 같이 m, v, p의 추가 옵션을 가지고 있는데 순서대로 soutm 은 현재 클래스와 메서드의 이름을 출력하는 것이고 soutv는 변수의 값을 바로 출력해주는 것이고 soutp는 메서드의 매개변수의 이름과 값을 출력해주는 것이다. 아래는 사용 예시이다. <img src="https://velog.velcdn.com/images/vryez1_/post/cd8ec649-e320-4499-8028-c00727253ac4/image.png" alt=""></p>
</li>
<li><p>Ctrl + N : 파일 찾기 
Ctrl + N 단축키를 이용해서 파일의 이름을 쉽게 찾을 수 있다.<img src="https://velog.velcdn.com/images/vryez1_/post/7b9dc9e3-3880-4a3c-b1a2-a3ec475b3b63/image.png" alt=""></p>
</li>
<li><p>Ctrl + E : 최근 파일 목록
최근 파일의 목록을 창으로 띄어주는 단축키 이며 Ctrl + E로 최근파일을 띄우고 바로 Enter를 입력하게 되면 직전의 파일로 바로 갈 수 있다.
<img src="https://velog.velcdn.com/images/vryez1_/post/9399494a-b7b5-42db-b7a1-dad6ad13b1cb/image.png" alt=""></p>
</li>
<li><p>Shift + F6 : 이름 변경
Shift + F6은 이름을 변경하는데 한번에 코드에 같은 이름을 같이 변경해주는 단축키이다.<img src="https://velog.velcdn.com/images/vryez1_/post/5a65b638-8e28-43a7-8e5c-bd40180373dc/image.png" alt=""> Rename code occurrences는 &quot; &quot;안에 있는 문자는 변경해주지 않지만 all occurrences 항목은 코드 내에 모든 이름을 한번에 변경해준다. 아래는 all occurrences 항목의 예시이다. <img src="https://velog.velcdn.com/images/vryez1_/post/2701d25c-6fb1-400f-b4c6-3abfae6e7b9f/image.png" alt=""> </p>
</li>
<li><p>Ctrl + Shift + Enter : 현재 구문 자동 완성
현재 작성하고 있는 구문을 자동으로 완성해주는 단축키로 자주 사용하는 단축키 중에 하나이다. 아래에는 함수 구문의 자동완성 예시이다. <img src="https://velog.velcdn.com/images/vryez1_/post/3db03a1c-4e2a-469c-9e21-2205dc652a3d/image.png" alt=""> <img src="https://velog.velcdn.com/images/vryez1_/post/17412867-ce6b-4989-b40c-a5961a716f1f/image.png" alt=""> 아래에는 변수 선언의 자동완성 예시이다. <img src="https://velog.velcdn.com/images/vryez1_/post/a83b0d60-01fd-4168-93cd-07bcccd4278b/image.png" alt=""> <img src="https://velog.velcdn.com/images/vryez1_/post/c41c9a5e-fe01-4036-9265-2086c5018d77/image.png" alt=""> 위의 것 뿐만아니라 반복문, 조건문 등의 구문도 완성해주는 편리한 단축키이다. </p>
</li>
</ul>
<ul>
<li>Ctrl + Shift + F10 : 현재 클래스 실행
현재 클래스 파일을 실행시켜주는 단축키로 자주 사용되는 단축키 중에 하나이다.<img src="https://velog.velcdn.com/images/vryez1_/post/b8b40a15-d26e-4e49-98a5-aab47a08893b/image.png" alt=""></li>
</ul>
<ul>
<li><p>Ctrl + D : 줄 복사
위의 줄 복사 단축키는 현재 줄의 코드를 바로 아래 복사/붙여주는 단축키이다. 이 단축키는 코드를 블록으로 한 후 사용하면 그 블록 코드가 복사/붙여넣기가 가능하다. 아래에는 사용 예시이다.<img src="https://velog.velcdn.com/images/vryez1_/post/7e9ed995-5c74-4d91-8a61-7492d1b4ccfb/image.png" alt=""> <img src="https://velog.velcdn.com/images/vryez1_/post/4c899070-b59e-458c-b4a1-e76a82a78688/image.png" alt=""></p>
</li>
<li><p>iter : 향상된 for 문(for-each) 단축키
위의 단축키는 향상된 for 문인 for-each문을 자동으로 완성해주는 기능을 가지고 있다. 아래에는 사용 예시이다. <img src="https://velog.velcdn.com/images/vryez1_/post/89d03823-8451-4b56-8141-ac72a910544f/image.png" alt=""> <img src="https://velog.velcdn.com/images/vryez1_/post/c08653cb-0fc8-45ba-91e0-9424b132f907/image.png" alt=""> 먼저 반복할 변수를 선택하고 이 후 Enter를 한번 누르면 String 변수의 이름을 변경하거나 Enter를 한번 더 누르면 body로 커서가 움직인다. <img src="https://velog.velcdn.com/images/vryez1_/post/ef90e040-0d22-4d58-a16c-35e28cc61015/image.png" alt=""></p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Java] 생성자]]></title>
            <link>https://velog.io/@vryez1_/Java-%EC%83%9D%EC%84%B1%EC%9E%90-f91o03qz</link>
            <guid>https://velog.io/@vryez1_/Java-%EC%83%9D%EC%84%B1%EC%9E%90-f91o03qz</guid>
            <pubDate>Thu, 09 May 2024 07:17:54 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>생성자란? </p>
</blockquote>
<p>생성자는 객체를 생성할 때 호출되는 특별한 종류의 메서드이다. 예시를 들어 설명하면</p>
<pre><code class="language-java">Car car = new Car();</code></pre>
<p>Car의 클래스가 있다고 가정하자. car 변수를 Car 타입으로 선언 후 new 키워드를 통해 힙 메모리 영역에 새로운 객체에 필요한 메모리를 할당한다. 이 후에 객체를 초기화를 수행하는데 필요한 메서드를 호출하는데 이 메서드가 생성자이다. </p>
<p>클래스를 작성하면서 생성자를 작성하지 않았던 적이 있었을 것이다. 이는 자바에서 생성자를 따로 작성하지 않으면 생성자를 자동으로 생성해주기 때문이다. </p>
<p>생성자의 작성 방법에 대해서 알아보겠다.</p>
<ul>
<li><p>기본 생성자
기본 생성자는 생성자 메서드에서 매개변수를 받지 않고 초기화하는 메서드로 클래스의 이름과 기본 생성자 메서드의 이름은 같아야 한다. 아래에는 기본 생성자 작성 예시이다.</p>
<pre><code class="language-java">Class Car {
  private count;

    Car() {
          System.out.println(&quot;기본 생성자 생성&quot;);
    }
}

</code></pre>
</li>
</ul>
<ul>
<li>생성자
기본생성자와 달리 매개변수를 가지고 객체를 생성할 때 초기화하고 싶을 때는 어떻게 할까? 
기본생성자와 많이 다르지 않지만 사용하는데 있어서 주의할 것이 있다. 먼저 예시를 들고 이를 설명하겠다.</li>
</ul>
<p>Case1)  </p>
<pre><code class="language-java">Class Car {
    private count;

    Car (int count) {
        this.count = count;
    }
}    </code></pre>
<p>Case2)</p>
<pre><code class="language-java">Class Car {
    private count;

    Car(int count) {
        count = count;
    }
}</code></pre>
<ul>
<li><p>주의할 점
만약 위의 코드에서 생성자 초기화 부분에서 Case 2와 같이 하게 되면 어떻게 될까? 이는 우리의 의도와 다르게 count는 모두 우선순위가 빠른 매개변수 count로 인식되어 클래스의 맴버변수의 초기화는 이루어지지 않는다. 따라서 이 때 맴버변수로 지정해주는 키워드가 필요한데 이 키워드가 바로 위에서 사용한 this 이다. 다시 정리하면 this 키워드는 자기 자신의 클래스의 맴버변수를 가리키는 키워드이다.</p>
</li>
<li><p>생성자의 오버로딩
그럼 생성자의 매개변수의 타입과 개수를 다르게 해줘서 객체 생성시 초기화를 다양하게 할 수 없을까? 당연히 가능하다. 이는 오버로딩을 이용하면 되는데 오버로딩에 대해 짧게 설명하면 같은 메서드를 매개변수를 다르게 해서 다양하게 사용할 수 있게 하는 방법인데 아래는 예시이다.</p>
</li>
</ul>
<p>  ```java
Class Book {
    private String name;
        private String author;
        privaet int isbn; </p>
<pre><code>  Book(String name, String author, int isbn) {
        this.name = name;
      this.author = author;
      this.isbn = isbn;
    }

    Book(String name, String author) {
        this.name = name;
      this.author = author;
      isbn = 0;
    }</code></pre><p>}</p>
<ul>
<li><p>this() 사용법과 예시
위에서 Book 생성자 메서드를 보면 중복이 약간 불편하다고 생각할 수 있다. 따라서 이를 this() 메서드를 통해 중복을 피할 수 있다. this() 기능은 생성자 내부에서 자신의 생성자를 호출할 수 있게 해주는 메서드이다. this() 사용 주의점은 생성자 메서드 내부에서만 사용가능하며 생성자 메서드 맨 첫줄(앞)에 와야 한다는 점이다.</p>
<p>```java
Class Book {
  private String name;</p>
<pre><code>private String author;
private int isbn;

Book(String name, String author, int isbn) {
    this.name = name;
     this.author = author;
  this.isbn = isbn;</code></pre><p>  }</p>
<p>  Book(String name, String author) {</p>
<pre><code>    this(name, author, 0)</code></pre><p>  }</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Java] 프로그래머스 문제3 고찰]]></title>
            <link>https://velog.io/@vryez1_/Java-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-3-%EA%B3%A0%EC%B0%B0</link>
            <guid>https://velog.io/@vryez1_/Java-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-3-%EA%B3%A0%EC%B0%B0</guid>
            <pubDate>Wed, 08 May 2024 02:21:07 GMT</pubDate>
            <description><![CDATA[<h3 id="풀었던-문제-중에-다시-생각해-볼만한-문제에-대한-고찰">풀었던 문제 중에 다시 생각해 볼만한 문제에 대한 고찰</h3>
<blockquote>
<p>공원 산책 (프로그래머스 연습문제)</p>
</blockquote>
<hr>
<ul>
<li>문제 설명
<img src="https://velog.velcdn.com/images/vryez1_/post/d14198bc-b287-49d0-b0df-9b73256148fe/image.png" alt=""> 이미지와 같은 2차원 배열에서 각 배열에는 시작 지점, 장애물 또는 갈 수 있는 지점을 &quot;S&quot;, &quot;X&quot;, &quot;O&quot; 로 입력된다. 또한 routes라는 1차원 String 배열에서 &quot;E 2&quot;와 같은 방향과 움직일 수를 입력된다. 출력으로는 마지막에 출력될 결과값으로는 모든 routes 배열의 입력력값을 수행 후 최종 좌표를 리턴하면 된다. 
주의할 점으로는 수행 중 &quot;X&quot;를 만나게 되면 그 전까지 가는 것이 아닌 수행을 하지 않는 것이다!</li>
</ul>
<hr>
<ul>
<li>내가 풀었던 풀이<ul>
<li>변수 선언
<img src="https://velog.velcdn.com/images/vryez1_/post/32e89c52-bb57-4ecf-bb54-4e6b267d5522/image.png" alt=""> 변수는 가로와 세로의 길이, 시작지점을 저장하고 움직이는 현재의 상태를 초기화할 변수를 선언하고 초기화 했다.</li>
</ul>
</li>
</ul>
<ul>
<li><p>데이터 전처리
<img src="https://velog.velcdn.com/images/vryez1_/post/e807d7cd-25ac-408c-a485-ba8a184b6edd/image.png" alt=""> 2차원 String 배열로 입력받은 park 배열을 직접 이용하여 &quot;S&quot;를 움직여서 할 수 있지만 직관적이지 못하다고 생각하여 2차원 int 배열로 전처리를 진행하였다. S는 1, O는 0, 그리고 장애물 X는 -1을 각 배열에 값으로 대입했다. <img src="https://velog.velcdn.com/images/vryez1_/post/d67dac08-492c-4dc4-a2a4-1ce501dc9be2/image.png" alt=""> 입력받은 routes 또한 향상된 for문을 통해 route로 반복하였고 route는 split함수를 통해 방향(dir)과 정도(amount)로 나눠서 저장했다. </p>
</li>
<li><p>주요 방향 움직임 로직
<img src="https://velog.velcdn.com/images/vryez1_/post/3e111723-6361-4c43-afc2-6eac8da7cf6e/image.png" alt=""> E, S, N, W 4방향의 움직임 중 E 방향 움직임 로직만을 가져왔다. 각 방향은 if, else if, else로 조건에 맞게 각 로직을 수행하도록 했다. 로직은 간단한데 첫 번째 조건은 2차원 배열을 벗어났을 때, break를 걸어주는 것이다. 두 번째 조건은 장애물을 만났을 때, break를 걸어주는 것이고, 마지막 조건은 마지막 i 수행까지 배열을 벗어나지 않고 장애물을 만나지 않았으면 startX 변수를 i만큼 더해주는 것이다. </p>
</li>
</ul>
<hr>
<ul>
<li><p>내 풀이에 대한 고찰
내가 푼 코드를 봤을 때 로직이 단순해서 이해하는데는 크게 문제가 없지만 반복적으로 if와 else if 그리고 else가 자주 사용되어 한 눈에 담기지 않을 것이라고 생각했다. 따라서 이 풀이를 어떻게 하면 다른 사람이 보고 쉽게 이해할 수 있을까? 라고 고민하다가 자바의 주요 특징인 객체지향 프로그래밍으로 현재 좌표를 나타내는 startX, startY 그리고 주요 로직을 캡슐화로 구현하면 다른 사람이 보고 이해하기 쉽겠다고 생각했다.</p>
<ul>
<li><p>데이터 숨기기
<img src="https://velog.velcdn.com/images/vryez1_/post/917da720-7a0f-4bfb-91d1-fae6f541153d/image.png" alt=""> 좋은 객체 지향은 데이터와 메서드를 잘 숨겨야 한다고 공부했다. 따라서 다른 개발자가 이 클래스를 가지고 쓸 때 햇갈리지 않기 위해 데이터를 직접 사용하지 못하게 private로 숨겼다. 따라서 <img src="https://velog.velcdn.com/images/vryez1_/post/a406949f-ef54-4863-81e0-4d5f08d1bcf7/image.png" alt=""> 마지막에 결과값 반환을 위한 getStartX, getStartY 메서드를 생성하여 반환하도록 했다.</p>
</li>
<li><p>생성자
<img src="https://velog.velcdn.com/images/vryez1_/post/bdbab041-380c-4e27-8be1-fd7f6f4a9cca/image.png" alt=""> 생성자는 solution 메서드에서 데이터 전처리하여 가공한 데이터를 입력받게 생성했다.</p>
</li>
<li><p>move 메서드
<img src="https://velog.velcdn.com/images/vryez1_/post/bc79d1a2-5a27-485b-b645-0a9a70011775/image.png" alt=""> move 메서드는 방향과 정도(amount)를 매개변수로 받아 클래스 안에 있는 방향 메서드로 가게 안내자 메서드로 작성했다.</p>
</li>
<li><p>방향 메서드
<img src="https://velog.velcdn.com/images/vryez1_/post/5172d3a1-3a06-47a6-91fa-9fb05e5829bd/image.png" alt=""> move메서드가 방향 메서드를 지정해주기 때문에 main 메서드에서는 방향 메서드를 직접 호출할 필요가 없다. 따라서 다른 개발자의 혼돈을 줄이기 위해서 private 접근 제어자를 사용했다. 로직은 이전 풀이에서와 같은 로직을 사용했다. </p>
</li>
<li><p>Solution 클래스
<img src="https://velog.velcdn.com/images/vryez1_/post/cabbb3dd-6582-4d83-9f65-41d915450ca1/image.png" alt=""> 메인 메서드에서의 사용의 다음과 같이 했다. 전처리 부분도 클래스 내부에 넣었어야 했나? 라는 생각이 들었지만, 그래도 기존 코드와 비교했을 때 클래스가 잘 캡슐화 되어있기 때문에 사용하거나 이해하는데 더 쉬울 것이라고 생각했다. </p>
</li>
</ul>
</li>
</ul>
<hr>
<ul>
<li><p>전체 고찰</p>
<p>이번 문제는 실무에서 하는 것과 같이 클래스를 캡슐화 시켜서 객체지향프로그램으로 구현해보자는 것이 이 문제를 다시 고찰하게 된 이유였는데 확실히 캡슐화를 시키니 캡슐화된 클래스를 보고 본문에 구현하는데 큰 도움을 주었다. 실무에서는 클래스를 만드는 파트, 만든 클래스를 활용하는 파트가 나누어져있다고 알고 있는데 왜 프로젝트를 객체지향프로그래밍으로 해야되는지 이유를 느낄 수 있었다.</p>
</li>
</ul>
<p>전체 코드 : <a href="https://github.com/Vryez11/JVCS">https://github.com/Vryez11/JVCS</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Java] 기본형과 참조형]]></title>
            <link>https://velog.io/@vryez1_/Java-%EA%B8%B0%EB%B3%B8%ED%98%95%EA%B3%BC-%EC%B0%B8%EC%A1%B0%ED%98%95</link>
            <guid>https://velog.io/@vryez1_/Java-%EA%B8%B0%EB%B3%B8%ED%98%95%EA%B3%BC-%EC%B0%B8%EC%A1%B0%ED%98%95</guid>
            <pubDate>Tue, 07 May 2024 02:09:38 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>기본형과 참조형? </p>
</blockquote>
<ul>
<li><p>기본형
기본형은 int, long, double, boolean 처럼 변수를 선언하고 그 변수에 값을 직접 저장하는 형태를 기본형이라고 한다.  </p>
</li>
<li><p>참조형
참조형은 앞에서 말한 배열과 같이 변수를 선언하고 그 변수에 값을 직접 저장하는 것이 아닌 (참조)주소를 저장하는 형태를 참조형이라고 한다. </p>
</li>
<li><p>기본형과 참조형의 출력
<img src="https://velog.velcdn.com/images/vryez1_/post/25aa2e4a-0815-4ba6-865b-285a19a9ddf5/image.png" alt=""> 위와 같이 int형 변수와 int를 담는 배열을 선언하고 배열은 인덱스를 이용하여 출력하는 것이 아닌 변수 그 자체를 출력하면 <img src="https://velog.velcdn.com/images/vryez1_/post/9457895d-95b8-48b2-846c-bd6200a76c24/image.png" alt=""> 위와 같이 기본형인 num은 값 그 자체가 참조형인 nums는 배열의 주소가 참조되는 것을 확인할 수 있다. </p>
</li>
</ul>
<blockquote>
<p>기본형과 참조형의 차이1 (대입)</p>
</blockquote>
<p>자바에서는 가장 중요한 원칙이 있는데 이는 자바에서 변수를 대입할 때 값을 복사해서 대입한다는 것이다.</p>
<p>간단하게 설명하면, 
<img src="https://velog.velcdn.com/images/vryez1_/post/c24c069a-677d-4a31-9c31-5b4336da7d6e/image.png" alt=""> 에서 num1와 nums1의 값을 변수에 대입한 것을 출력해보면 <img src="https://velog.velcdn.com/images/vryez1_/post/de6da7fc-60a2-49a6-bff6-2a83d502139d/image.png" alt=""> 와 같이 출력되는데 모두 그 변수의 값을 복사하여 대입했다는 것을 알 수 있다.</p>
<hr>
<ul>
<li><p>기본형의 대입
<img src="https://velog.velcdn.com/images/vryez1_/post/73680ce2-0497-4f51-8baf-ee4aba6d2f41/image.png" alt=""> 와 같이 num2에 num1의 값을 대입하고 num1 변수의 값을 수정하면 어떻게 될까? 또 num2의 변수의 값을 수정하면 어떻게 될까? 답은 위에서 말한 대원칙에 있다.
대원칙에서는 값을 복사해서 대입한다고 했다. 따라서 <img src="https://velog.velcdn.com/images/vryez1_/post/c1ac014c-c9aa-4f01-ae31-c20bb4230dcf/image.png" alt=""> 와 같이 num1과 num2의 변수의 값을 바꿔도 num2는 num1의 값을 복사해서 대입 받았을 뿐 다른 관계가 없어 각자의 변수의 값만 수정된다.</p>
</li>
<li><p>참조형의 대입
참조형에서의 대입은 어떨까? <img src="https://velog.velcdn.com/images/vryez1_/post/5c09fd69-9df1-4ef9-93f4-fb1437125e90/image.png" alt=""> 와 같이 nums2에 nums1변수를 대입하면 위에서 말한 것 처럼 nums1 변수의 값(주소)를 복사해서 대입한다. 그 후 nums1의 배열안의 값과 nums2의 배열안의 값을 수정하면 <img src="https://velog.velcdn.com/images/vryez1_/post/cf100152-7109-435d-83bf-cfee05d67334/image.png" alt=""> 와 같이 둘은 메모리에 생성된 같은 배열의 주소를 가지고 있기 때문에 nums1의 배열의 값을 수정해도 nums2의 배열의 값이 수정되고 반대도 똑같이 수정되는 것이다. </p>
</li>
</ul>
<blockquote>
<p>기본형과 참조형의 차이2 (호출)</p>
</blockquote>
<p>기본형과 참조형의 메서드 호출에 대한 차이점에 대해서 알아볼 차례이다. </p>
<ul>
<li>기본형의 호출</li>
</ul>
<p><img src="https://velog.velcdn.com/images/vryez1_/post/8d5fbeb8-17a1-451a-bd30-4ad32906054f/image.png" alt=""> 위와 같이 기본형을 메서드에서 호출하여 변수의 값을 바꾸고 메인 메서드에서 변수의 값을 출력하면 어떻게 될까? 이 또한 위에서 말한 대원칙을 떠올리면 쉽게 에상할 수 있다.<img src="https://velog.velcdn.com/images/vryez1_/post/63026b5c-b8e6-4b1d-adf1-67f731dc9a9e/image.png" alt=""> 위와 같이 당연히 메인메서드의 기본형 변수의 값은 수정되지 않았다. 왜냐하면 메서드에서 매개변수로 값을 호출하고 메인메서드의 기본형 변수가 값을 대입할 때 자기 자신을 대입하는 것이 아닌 값을 복사해서 대입하기 때문에 changeValue 메서드에서 매개변수의 값을 수정한다고 해서 메인 메서드 변수의 값이 수정되지 않는다. 따라서 위의 changeValue 매개 변수 받는 것은 <img src="https://velog.velcdn.com/images/vryez1_/post/16c1dcda-20f2-4707-9c57-34265576a9fe/image.png" alt=""> 와 같이 생각하면 쉽게 이해할 수 있을 것이다.</p>
<hr>
<ul>
<li>참조형의 호출</li>
</ul>
<p><img src="https://velog.velcdn.com/images/vryez1_/post/6b16a080-62ba-4d56-ac43-1dca089f4fdd/image.png" alt=""> 를 생각하면 어떻게 될까? 변수의 값을 대입할 때에는 값을 복사해서 대입한다. 라는 것을 떠올리면 a의 값(주소)를 메서드에게 전달한 것이고 여기서 배열의 값을 수정하면 똑같은 배열을 가리키고 있기 때문에 당연히 메인 메서드의 배열의 값도 수정되었을 것이다. 라는 것을 예상할 수 있을 것이다. <img src="https://velog.velcdn.com/images/vryez1_/post/321cbb33-a806-44ef-bb1c-5ff0405da2e3/image.png" alt=""> 위와 같은 예상과 같은 결과를 알 수 있었다. </p>
<blockquote>
<p>최종 정리</p>
</blockquote>
<ol>
<li>기본형은 값 그 자체를, 참조형은 참조(주소) 값을 변수로 저장한다.</li>
<li>변수로 값을 전달할 때에는 그 값을 복사해서 대입힌다.</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Java] 프로그래머스 문제2 고찰]]></title>
            <link>https://velog.io/@vryez1_/JAVA-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-2-%EB%B2%88%EC%A7%B8-%EA%B3%A0%EC%B0%B0</link>
            <guid>https://velog.io/@vryez1_/JAVA-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-2-%EB%B2%88%EC%A7%B8-%EA%B3%A0%EC%B0%B0</guid>
            <pubDate>Sat, 04 May 2024 00:38:39 GMT</pubDate>
            <description><![CDATA[<h3 id="풀었던-문제-중에-다시-생각해-볼만한-문제에-대한-고찰">풀었던 문제 중에 다시 생각해 볼만한 문제에 대한 고찰</h3>
<blockquote>
<p>붕대감기 (PCCP 기출문제 1번)</p>
</blockquote>
<ul>
<li>문제 설명</li>
</ul>
<hr>
<pre><code>붕대 감기 문제는 3개의 로직을 가지고 있다.</code></pre><ol>
<li>1초 마다 회복을 주어진 량 만큼 한다.</li>
<li>시전시간이 t 연속으로 힐을 하면 y만큼 추가로 한다.</li>
<li>입력된 시간에 attack을 하고 연속된 힐은 멈추게 된다.</li>
</ol>
<p>이렇게 3개의 로직을 가지고 있으며 입력되는 방식은 int[시전 시간, 초당 회복량, 추가 회복량] bandage, health(현재 체력), int[공격 시간, 피해량] attacks로 입력된다. 마지막으로 결과값은 마지막 공격이 끝났을 때 현재 체력을 반환하면 되는 문제이다.</p>
<hr>
<ul>
<li><p>내가 풀었던 풀이</p>
<ul>
<li><p>코드 구현에 필요한 변수 선언</p>
<pre><code class="language-java">   int initHealth = health;  //초기 체력을 현재 채력으로 저장할 변수 설정
    int endTime = attacks[attacks.length-1][0]; //attacks의 배열의 크기를 통해 끝나는 시간 저장
    int[] attackTime = new int[endTime+1]; //attack 하는 시간 만을 attscks 2차원 배열에서 추출해서 저장
    int healTime = 0; //연속적인 회복 시간을 알기 위해 변수 설정
    int attackTemp = 0; //배열의 카운트를 위한 변수

+ 데이터 전처리

```java
    //for문을 통해 tempTime 변수에 공격 시간을 저장하고 attackTime 인덱스에 1로 표현
    for (int i = 0; i &lt; attacks.length; i++) {
        int tempTime = attacks[i][0];
        attackTime[tempTime]++;
    }</code></pre>
<p>int형 변수에 공격시간을 받아 attackTime 배열의 인덱스에 증감을 함으로써 공격시간을 확인</p>
<ul>
<li>주요 로직 
기본적으로 공격시간을 배열로 저장한 attackTime의 크기 동안 for문을 사용하여 반복하도록 구현하였다.<ul>
<li>공격안할 때<img src="https://velog.velcdn.com/images/vryez1_/post/9bd5fd75-16b5-4571-99ae-4855959668fe/image.png" alt=""></li>
<li>공격할 때 <img src="https://velog.velcdn.com/images/vryez1_/post/9a73c68f-aed9-4de7-97a6-9f2e0842ffde/image.png" alt=""> 생각나는 조건을 다 구현하다 보니 중복되는 부분이 많았다.</li>
</ul>
</li>
</ul>
</li>
<li><p>결과값 리턴 </p>
<ul>
<li>결과값을 0보다 작을 때와 클 때를 나누어 결과값을 if-else를 사용하여 리턴
<img src="https://velog.velcdn.com/images/vryez1_/post/a6156286-4744-4a26-a5a3-b71dd376b5cd/image.png" alt=""></li>
</ul>
</li>
</ul>
</li>
</ul>
<hr>
<ul>
<li><p>내 풀이에 대한 고찰</p>
<ul>
<li><p>고찰을 하게 된 이유 </p>
<p>이 문제는 사실 그렇게 어려운 문제는 아니었다. 하지만 이 문제를 다시 생각해보고 고찰한 이유는 풀 때에는 몰랐으나 코드에 중복되는 부분이 많고 잘못된 조건이 있어 문제를 다시 생각하게 되었다.</p>
</li>
<li><p>중복되는 부분 제거
<img src="https://velog.velcdn.com/images/vryez1_/post/36a42aea-f437-438e-ac20-534e166d35b8/image.png" alt=""> 코드를 보면 if (최대 채력이 현재 채력보다 작을 때)와 else (최대 체력과 현재 채력이 같을 때)에 중복으로 있어서 else 문 뒤에 한 번만 적으면 되겠다고 생각했다.
<img src="https://velog.velcdn.com/images/vryez1_/post/95b5e8bd-ef7f-4e84-afee-b28c934a6aa2/image.png" alt=""> 위와 마찬가지로 if문과 else문에서 모두 사용되기 때문에 연속시간을 판단하기위한 변수 healTime을 if 문 앞에 한 번만 작성하면 되겠다고 생각했다.
<img src="https://velog.velcdn.com/images/vryez1_/post/dc24ad23-7951-4c9a-9656-0823945b72f1/image.png" alt=""> 현재 상태보다 작을 때에는 return -1을하는 구문이다. 이는 for문 시작하자마와 return할 때 두 곳에 중복되어 사용되었는데 공격 받을 때에는 else문에 공격할 때 뿐이기 때문에 이는 else문에 넣어 중복을 피할 수 있다고 생각하여 수정했다.</p>
</li>
<li><p>잘못된 조건 제거
<img src="https://velog.velcdn.com/images/vryez1_/post/03dcb779-8d84-491b-9f72-f10ff95446f9/image.png" alt=""> 위에서 if 문의 조건으로 힐 할 때 힐량 보다 남은 힐량 보다 적을 때와 클 때를 나누어 실행하도록 하였지만 마지막 if에서 현재 체력이 최대 채력보다 클 때 현재 채력과 최대 채력을 같게 해주는 조건문이 있기 때문에 굳이 나눌 필요가 없다고 생각하여 <img src="https://velog.velcdn.com/images/vryez1_/post/85c2330a-59ad-424b-9eb7-0996b392ec75/image.png" alt=""> 위와 같이 줄일 수 있었다. </p>
</li>
</ul>
</li>
</ul>
<hr>
<ul>
<li><p>실행 시간 비교 및 느낀점</p>
<ul>
<li><p>Before
<img src="https://velog.velcdn.com/images/vryez1_/post/7283ef7b-ffd6-486e-bf17-0ab387b02265/image.png" alt=""> </p>
</li>
<li><p>After
<img src="https://velog.velcdn.com/images/vryez1_/post/8792daf7-f154-493f-875a-3a318c2fcc16/image.png" alt=""> </p>
</li>
</ul>
<p>코드 수정 전과 후의 차이는 미미하였지만 전코드는 코드 길이가 56줄이었던 반면에 수정 후 코드의 길이는 42줄로 14줄이나 줄일 수 있었다. 또한 수정 전 코드는 중복되는 부분이 많아 코드를 처음 본 사람이 이해하는데 어려움이 있었을 것이라고 생각되는 반면에 수정 후 코드는 한 번에 눈에 들어오는 코드라고 생각했다. 이렇게 같은 로직이지만 코드를 더 보기쉽게 짜는 것은 실무에서 큰 역량이라고 생각하기 때문에 앞으로도 코드를 간단하게, 한번에 보기 쉽게 짜기 위해 노력해야겠다고 느낀 문제였다. </p>
</li>
</ul>
<p>전체 소스 코드 : <a href="https://github.com/Vryez11/JVCS">https://github.com/Vryez11/JVCS</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Java] 배열]]></title>
            <link>https://velog.io/@vryez1_/Java-%EB%B0%B0%EC%97%B4%EA%B3%BC-%EC%9D%B8%EB%8D%B1%EC%8A%A4</link>
            <guid>https://velog.io/@vryez1_/Java-%EB%B0%B0%EC%97%B4%EA%B3%BC-%EC%9D%B8%EB%8D%B1%EC%8A%A4</guid>
            <pubDate>Fri, 03 May 2024 02:04:02 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>배열이란? </p>
</blockquote>
<p>배열은 같은 타입을 가진 여러 데이터를 하나의 변수에 저장할 수 있게 해주는 자료구조이다.</p>
<blockquote>
<p>배열의 1차원 및 2차원 선언</p>
</blockquote>
<ul>
<li>1차원 배열 선언 및 초기화 </li>
</ul>
<pre><code class="language-java">1. int[] a = new int[5];                 //배열의 변수 선언 및 크기에 맞는 배열 생성
2. int[] a = new int[]{1, 2, 3, 4, 5};  //배열의 변수 선언 및 초기화 1
3. int[] a = {1, 2, 3, 4, 5};            //배열의 변수 선언 및 초기화 2</code></pre>
<p>위에서 배열의 선언 만으로는 배열을 사용할 수 없다. 배열 변수를 선언하게 되면 배열을 담을 빈 박스가 생기게 되는 것이다. 배열을 생성해서 대입하여 줌으로써 배열을 사용할 수 있게 되는데 여기서 잠깐, 짚고 넘어가야할 것이 있다.</p>
<ul>
<li>배열 변수의 참조값</li>
</ul>
<p>위에서는 간단한 설명을 위해 배열 변수에 배열을 담는 다고 하였지만 사실은 메모리에 배열이 따로 저장되고 배열의 변수에는 메모리에 생성된 배열의 주소가 대입이 되는 것이다. <img src="https://velog.velcdn.com/images/vryez1_/post/ac69a515-2a56-49a8-8ba4-8b1d0a2c7a71/image.png" alt=""> 위의 사진은 전에 공부한 변수 선언 및 초기화와 이번에 학습한 배열 선언 및 초기화를 이해하기 쉽게 그림으로 그린 것이다. <img src="https://velog.velcdn.com/images/vryez1_/post/c86a757a-8c3b-4364-840f-84f5d4d773eb/image.png" alt=""> <img src="https://velog.velcdn.com/images/vryez1_/post/f9da764f-a11d-403c-a4d9-85f965a159b1/image.png" alt="">
위의 사진은 직접 배열을 선언 및 생성 해보고 배열의 값을 출력해 본 것이다. 위에서 설명한 것과 같이 주소가 출력되는 것을 볼 수 있으며 앞에 [I는 Int형 배열이라는 것이고 @뒤에가 주소이다.</p>
<p>또한, 기본값과 참조값에 대해서는 다음에 다시 정리해서 업로드할 예정이다.</p>
<ul>
<li>2차원 배열의 선언 및 초기화<pre><code class="language-java">int[][] arr1 = new int[num1][num2]; //arr1 배열 변수 선언, num1*num2의 크기를 가지는 배열 생성 및 주소값 전달
int[][] arr2 = { {1,2,3},            //arr2 배열 변수 선언, 2*3의 크기를 가지는 배열 생성 및 주소값 전달
               {4,5,6} };</code></pre>
</li>
</ul>
<p>위와 같이 2차원 배열은 선언 및 생성, 주소값 전달이 가능하다. 또한 위와 같이 num1*num2 크기의 배열에서 배열만 생성하면 배열안의 값은 int는 0, String은 null이 default값으로 저장된다.</p>
<blockquote>
<p>인덱스란?</p>
</blockquote>
<p>인덱스란 순차적인 자료구조에서 각 요소의 위치를 나타내는데 사용되는 수이다. 
인덱스의 가장 큰 특징으로는 인덱스의 수가 0부터 시작한다는 것이다. </p>
<p><img src="https://velog.velcdn.com/images/vryez1_/post/5134baf8-f5c1-4690-91bb-0b13e313fe00/image.png" alt=""> 위의 그림은 배열 생성과 그 배열의 인덱스를 이해하기 쉽게 그림으로 나타낸 것이다. </p>
<blockquote>
<p>배열에서의 인덱스 이동</p>
</blockquote>
<pre><code class="language-java">int[] num = new int [5];
num[1] = 1;</code></pre>
<p>위에서 num[1]에 대한 자세한 동작 순서는 num에 저장된 배열의 주소를 X001이라고 한다면</p>
<pre><code class="language-java">num[i] = 1;
X001[i] = 1;</code></pre>
<p>위와 같이 표현될 수 있는데 이것이 의미하는 것은 num은 배열을 가리키는 주소(아파트)를 저장되고 인덱스(층)으로 가게 안내 한다는 것을 의미한다.</p>
<blockquote>
<p>배열 사용법 </p>
</blockquote>
<p>배열은 주로 반복문을 이용하여 값을 다룬다.</p>
<pre><code class="language-java">int[] nums = new int[5];
#1
for (int i = 0; i &lt; nums.length; i++) {
    nums[i] = i;
}
#2
for (int num : nums) {
    System.out.print(num++ + &quot; &quot;);
}</code></pre>
<p>  #1은 인덱스의 번호가 로직에서 필요할 때 사용되는 일반적인 for문이고 
  #2는 배열의 값만을 필요할 떄 사용할 수 있는 것이며 for-each문이라고 불린다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Java] 프로그래머스 문제1 고찰]]></title>
            <link>https://velog.io/@vryez1_/JAVA-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-1-%EA%B3%A0%EC%B0%B0</link>
            <guid>https://velog.io/@vryez1_/JAVA-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-1-%EA%B3%A0%EC%B0%B0</guid>
            <pubDate>Thu, 02 May 2024 01:13:03 GMT</pubDate>
            <description><![CDATA[<h3 id="풀었던-문제-중에-다시-생각해-볼만한-문제에-대한-고찰">풀었던 문제 중에 다시 생각해 볼만한 문제에 대한 고찰</h3>
<blockquote>
<p>가장 많이 받은 선물 (2024 KAKAO WINTER INTERSHIP)</p>
</blockquote>
<ul>
<li>문제 설명
입력은 Sring배열 두개를 입력 받으며 첫 번째 배열에는 friends 즉, 선물을 주고 받은 사람들의 이름이 담긴 배열이다. 두 번째 배열은 gifts 즉, 준 사람과 받은 사람이 담긴 사람이 한 문자열에 담긴 배열이다.
간단하게 문제를 설명하면 다음 달에 누가 선물을 많이 받을지 리턴하는 문제이고, 이는 이번 달에 선물을 주고 받은것이 관계가 있다.</li>
</ul>
<hr>
<ul>
<li>내가 풀었던 풀이    <ul>
<li>입력값 전처리<ul>
<li>2차원 배열 arr 선언 
<img src="https://velog.velcdn.com/images/vryez1_/post/dcb0c1b3-0a42-4a70-8b3f-e76fb5d38d4c/image.png" alt=""></li>
<li>입력받은 gifts String 배열 처리
<img src="https://velog.velcdn.com/images/vryez1_/post/139c41b2-36e1-4481-af8c-dd8bbe465e05/image.png" alt=""></li>
<li>위에서 처리한 준 사람과 받은 사람을 이용해서 arr 배열 처리
<img src="https://velog.velcdn.com/images/vryez1_/post/76f9fa9f-e906-4abe-a23f-2b24b216c2aa/image.png" alt=""></li>
<li>한 사람이 주고 받은 횟수를 나타낸 선물 지수 배열 선언 및 처리
<img src="https://velog.velcdn.com/images/vryez1_/post/94f99e7c-01a4-458d-8a62-7fa4062eddb7/image.png" alt=""></li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li><p>로직 구현</p>
<ul>
<li>monthGift 다음 달 받을 선물을 저장하는 배열을 선언한 후 비교하며 monthGift배열 증감
<img src="https://velog.velcdn.com/images/vryez1_/post/97a89174-613b-45c9-8cac-45cb423db439/image.png" alt=""> 일단 각 사람들끼리 준 횟수와 받은 횟수를 비교 후 준 횟수가 많은 사람에게 monthGift배열에 증감, 둘이 같으면 위에서 처리한 선물 지수를 통해 비교 후 더 선물지수가 높은 사람에게 monthGift 증감하도록 구현</li>
</ul>
</li>
<li><p>결과값 리턴</p>
<ul>
<li>for문을 이용해서 배열의 최댓값 구하기
<img src="https://velog.velcdn.com/images/vryez1_/post/675fdf4f-060d-402c-93b1-8a3d11e3bb13/image.png" alt=""></li>
</ul>
</li>
</ul>
<hr>
<ul>
<li><p>내 풀이에 대한 고찰</p>
<ul>
<li>데이터 전처리
데이터 전처리 하는데 있어서 이 문제를 풀 당시에는 Map을 몰랐기 때문에 배열만을 이용하여 풀려고 하다 보니 arr 2차원 배열의 증감을 할 때 일일히 for문을 통해 비교하고 equals 함수를 통해 비교하는 것이 낭비라고 생각하여 데이터 전처리 부분을 수정하였습니다.
<img src="https://velog.velcdn.com/images/vryez1_/post/ec9921fa-ffbd-495b-aa27-2a949a2b65c6/image.png" alt=""> 또한 선물지수도 굳이 for 문을 한 개 더 써서 따로 계산하는 것이 아닌 위의 arr 2차원 배열 증감에서 같이 수행할 수 있을 것 같아 이 부분 또한 추가로 수정하였습니다.
<img src="https://velog.velcdn.com/images/vryez1_/post/69e33899-f8b0-4c4a-a317-2b3f699a7971/image.png" alt=""> 위의 과정들을 통해 데이터 전처리 부분에 있어서 상당히 코드를 줄여 복잡성을 낮출 수 있었고 인덱스 번호가 자주 필요할 때에는 이를 배열에서 for문으로 찾는 것 보다는 Map으로 키와 값을 저장 후 필요할 때 값을 얻어 쓰는 것이 더 구조적으로 단순화 시킬 수 있겠다고 생각하였습니다. </li>
</ul>
<hr>
<ul>
<li>실행 시간 비교
(수정 전) <img src="https://velog.velcdn.com/images/vryez1_/post/a8d95a65-31f1-49d6-987c-ca3fbe75a831/image.png" alt="">
(수정 후) <img src="https://velog.velcdn.com/images/vryez1_/post/4c097ad9-b909-49aa-bafb-b7b5b1726cff/image.png" alt=""> Map을 이용하여 for문을 줄인 것도 실행시간 단축에 도움이 되었다고 생각하지만 더욱 큰 이유는 굳이 선물지수를 구할 때 for문을 따로 다시 하는 것이 아닌 arr 배열 증감할 때 같이 계산한 것이 큰 이유일 것이라고 생각하였고 중복되는 부분에 주의하며 코딩해야 겠다고 느꼈다.</li>
</ul>
</li>
</ul>
<p>  전체 소스 코드 : <a href="https://github.com/Vryez11/JVCS">https://github.com/Vryez11/JVCS</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Java] 변수와 타입]]></title>
            <link>https://velog.io/@vryez1_/Java-%EB%B3%80%EC%88%98-%EC%84%A0%EC%96%B8-%EB%B0%8F-%ED%83%80%EC%9E%85-%EC%B4%9D%EC%A0%95</link>
            <guid>https://velog.io/@vryez1_/Java-%EB%B3%80%EC%88%98-%EC%84%A0%EC%96%B8-%EB%B0%8F-%ED%83%80%EC%9E%85-%EC%B4%9D%EC%A0%95</guid>
            <pubDate>Wed, 01 May 2024 05:04:20 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>변수 선언 및 초기화</p>
</blockquote>
<p>Java에서는 변수는 </p>
<pre><code class="language-java">int num;
num = 5;</code></pre>
<p>와 같은 변수를 선언(int num;) 하고 초기화(num = 5;) 하는 과정으로 사용된다.</p>
<pre><code class="language-java">int num = 5;</code></pre>
<p>물론, 위와 같이 변수 선언과 초기화를 한번에 하는 것도 가능하다. </p>
<p>코드에서 개발자가 직접 적은 5, 10.5, true와 같은 고정된 값을 *리터럴이라고 부른다.</p>
<hr>
<p>*<em>변수를 선언하게 되면 어떤 일이 일어날까? *</em></p>
<p>먼저, 컴퓨터에는 정보를 저장하는 메모리(RAM, ROM)가 있다. 변수를 선언하게 되면 변수에게 알맞은 메모리 공간(메모리의 주소)을 할당하게 된다. 
메모리 공간을 할당해주는 작업은 대부분 OS와 컴파일러가 자동으로 처리준다.</p>
<p><strong>변수 초기화는 어떤 일이 일어날까?</strong> </p>
<p>int num = 5;와 같이 변수에 값을 할당(초기화)하면 5 정수 리터럴을 위에서 선언한 변수의 공간에 저장하게 됩니다.</p>
<p><img src="https://velog.velcdn.com/images/vryez1_/post/40fead92-ae2f-437c-8bdb-a475d5d33b30/image.png" alt=""></p>
<p>위의 그림은 변수 선언과 초기화에 대해 간략하게 그림으로 나타낸 것이다.</p>
<hr>
<blockquote>
<p>변수 타입</p>
</blockquote>
<p>변수을 선언할 때 무조건 타입을 같이 적어줘야 한다. 또한, 앞에서 언급한 공간의 알맞은 크기는 변수의 타입이 결정한다.</p>
<hr>
<p><strong>정수 타입</strong></p>
<table>
<thead>
<tr>
<th align="center">변수 타입</th>
<th align="center">메모리 공간</th>
<th align="center">값의 범위</th>
</tr>
</thead>
<tbody><tr>
<td align="center">byte</td>
<td align="center">8 bit</td>
<td align="center">~128 ~ 127</td>
</tr>
<tr>
<td align="center">short</td>
<td align="center">16 bit</td>
<td align="center">-32,768 ~ 32,767</td>
</tr>
<tr>
<td align="center">char</td>
<td align="center">16 bit</td>
<td align="center">0 ~ 65535 (유니코드)</td>
</tr>
<tr>
<td align="center">int</td>
<td align="center">32 bit</td>
<td align="center">-2,147,483,648 ~ 2,147,483,647 (대략 20억)</td>
</tr>
<tr>
<td align="center">long</td>
<td align="center">64 bit</td>
<td align="center">-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 (대략 900해)</td>
</tr>
</tbody></table>
<p>정수 타입을 선언하고 값을 대입하는데 있어서 주의해야 할 것은 </p>
<pre><code class="language-java">int num1 = 10;
long num2 = 10L;</code></pre>
<p>와 같이 long 타입의 변수에 값을 대입할 때는 정수뒤에 L을 붙여야 된다는 것이다.
그 이유는 자바에서는 정수 리터럴을 기본적으로 int 타입으로 간주하기 때문에 long 타입으로 리터럴 값을 대입할 때에는 L을 붙여주어서 long 타입임을 명시해야 한다.</p>
<pre><code class="language-java">long num3 = 10;</code></pre>
<p>위의 경우는 일반 long 타입에 int 타입을 대입해서 오류가 날 것 같지만 이는 컴파일러가 진행 시 int 타입을 자동으로 변환하여 대입시켜준다.
하지만, int의 범위가 벗어나는 정수를 L을 붙이지 않는다면 오류가 난다.</p>
<hr>
<p><strong>실수 타입</strong></p>
<table>
<thead>
<tr>
<th align="center">변수 타입</th>
<th align="center">메모리 공간</th>
<th align="center">값의 범위</th>
</tr>
</thead>
<tbody><tr>
<td align="center">float</td>
<td align="center">32 bit</td>
<td align="center">1.4E-45 ~ 3.4028235E38</td>
</tr>
<tr>
<td align="center">double</td>
<td align="center">64 bit</td>
<td align="center">4.9E-324 ~ 1.7976931348623157E308</td>
</tr>
</tbody></table>
<pre><code class="language-java">float num4 = 0.5f;
double num5 = 0.5;</code></pre>
<p>정수 타입과 마찬가지로 실수의 기본 리터럴은 double형이기 때문에 
float 타입에 값을 대입할 때에는 뒤에 f를 붙여주어야 한다.</p>
<hr>
<p><strong>논리 타입</strong></p>
<table>
<thead>
<tr>
<th align="center">변수 타입</th>
<th align="center">메모리 공간</th>
<th align="center">값의 범위</th>
</tr>
</thead>
<tbody><tr>
<td align="center">boolean</td>
<td align="center">8 bits</td>
<td align="center">true/false</td>
</tr>
</tbody></table>
<pre><code class="language-java">boolean logic = true;</code></pre>
<p>논리 타입의 선언은 위와 같이 할 수 있다. </p>
<hr>
]]></description>
        </item>
    </channel>
</rss>