<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>hochul-y.log</title>
        <link>https://velog.io/</link>
        <description>코딩이 즐거운사람~</description>
        <lastBuildDate>Fri, 25 Mar 2022 16:33:49 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. hochul-y.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/hochul-y" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[JAVA] 인터페이스란?]]></title>
            <link>https://velog.io/@hochul-y/JAVA-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4%EB%9E%80</link>
            <guid>https://velog.io/@hochul-y/JAVA-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4%EB%9E%80</guid>
            <pubDate>Fri, 25 Mar 2022 16:33:49 GMT</pubDate>
            <description><![CDATA[<h1 id="📢-인터페이스">📢 인터페이스</h1>
<ul>
<li><p>자식 클래스가 여러 부모 클래스를 상속받는 다중상속을 자바에서는 지원하지 않습니다.</p>
</li>
<li><p>다중 상속의 이점은 버릴수가 없기때문에 <strong>인터페이스</strong> 라는것을 통해 지원합니다.</p>
</li>
</ul>
<blockquote>
<p>결론적으로 인터페이스란 기본이 되는 틀만 제공되는 일종의 추상 클래스 입니다.</p>
</blockquote>
<h4 id="11-인터페이스-선언">1.1 인터페이스 선언</h4>
<ul>
<li>자바에서 클래스를 선언하는 거와 비슷하게 선언합니다.</li>
</ul>
<pre><code class="language-java">접근제어자 interface 인터페이스명{
    ...

}
</code></pre>
<p>위와 같이 class 대신 interface 키워드를 사용하며 클래스와 달리 
인터페이스의 모든 필드는 public static final 이어야하며 메서드는 추상메서드 여야합니다.</p>
<pre><code>🧾그럼 추상클래스와 인터페이스는 뭐가 다른 걸까?</code></pre><blockquote>
<p>추상클래스는 is-a 개념 (<del>는 ~ 이다)
인터페이스는 has-a 개념(</del>는 ~ 를 할수있다)</p>
</blockquote>
<h4 id="12-인터페이스-구현">1.2 인터페이스 구현</h4>
<ul>
<li>인터페이스는 추상 클래스와 마찬가지로 자신이 직접 인스턴스를 생성할 수 없습니다.</li>
<li>이에 따라추상 메소드를 구현할 클래스를 작성해야합니다.</li>
</ul>
<pre><code class="language-java">class 클래스이름 implemnets 인터페이스이름{ . . .}

// 인터페이스에 선언된 추상 메소드의 실제 메소드를 구현
</code></pre>
<p>위와 같이 implements 키워드를 넣고 인터페이이름을 명시해야합니다.</p>
<h4 id="13-인터페이스-래퍼런스를-통해-구현체를-사용하는-법">1.3 인터페이스 래퍼런스를 통해 구현체를 사용하는 법</h4>
<ul>
<li><p>인터페이스 참조변수에 구현체를 할당하여서 , 다형성을 확보할수있다.</p>
</li>
<li><p>인터페이스의 참조 변수로 클래스의 인스턴스를 참조할수 있고 타입의 형변환도 가능합니다.</p>
</li>
</ul>
<blockquote>
<p>interface a = new class 형으로 구현 할수있고
(class) a.메서드() 도 가능합니다.
하지만 인터페이스에 선언된 메서드만 호출이 가능합니다.</p>
</blockquote>
<h4 id="14-인터페이스-상속">1.4 인터페이스 상속</h4>
<ul>
<li><p>위에서 말했듯이 자바는 다중상속이 불가능 하지만 인터페이스는 예외이다.</p>
</li>
<li><p>하나의 클래스는 여러개의 인터페이스를 받을 수 있습니다.</p>
</li>
<li><p>인터페이스의 조상은 인터페이스만 가능합니다(<strong>Objec가 최고조상이 아니에요!</strong>)</p>
</li>
</ul>
<p>🎈 출처 : <a href="http://www.tcpschool.com/java/java_class_declaration">http://www.tcpschool.com/java/java_class_declaration</a></p>
<pre><code class="language-java">interface Animal { public abstract void cry(); }

interface Cat extends Animal { public abstract void cry(); }

interface Dog extends Animal { public abstract void cry(); }

class MyPet implements Cat, Dog {
    public void cry() {
        System.out.println(&quot;멍멍! 냐옹냐옹!&quot;);
    }
}

public class Polymorphism05 {
    public static void main(String[] args) {
        MyPet p = new MyPet();
        p.cry();
    }
}</code></pre>
<blockquote>
<p>위처럼 인터페이스를 통해 다중상속을 할경우 메서드 호출의 모호성도 방지할수 있습니다.</p>
</blockquote>
<h4 id="15-인터페이스의-기본-메서드-default-method-자바-8">1.5 인터페이스의 기본 메서드 (Default Method), 자바 8</h4>
<ul>
<li><p>java 8 에 추가된 문법입니다.</p>
</li>
<li><p>인터페이스에서 메서드 구현이 가능해졌습니다.</p>
</li>
</ul>
<pre><code class="language-java">interface Animal {
default void cry(){
    System.out.println(&quot;크앙&quot;);
    }
}
</code></pre>
<pre><code>추상메서드가 아닌 일반 메서드이기때문에 이를 구현한 클래스는 변경할 것이 없습니다.</code></pre><ul>
<li><p>위처럼 일반 메서드 처럼 구현부가 있어야 하고 접근제어자의 생략이 가능합니다.</p>
</li>
<li><p>위의 Animal 을 상속받은 자식클래스는 @Override 로 재정의 할 수 있습니다.</p>
</li>
</ul>
<h4 id="16-static-메서드--자바-8">1.6 static 메서드 , 자바 8</h4>
<ul>
<li>디폴드와는 달리 객체가 없어도 인터페이스만으로 호출이 가능합니다.</li>
</ul>
<pre><code class="language-java">interface Animal {
static void cry(){
    System.out.println(&quot;크앙&quot;);
    }
}
</code></pre>
<ul>
<li><p>위처럼 일반 메서드 처럼 구현부가 있어야 하고 접근제어자의 생략이 가능합니다.</p>
</li>
<li><p>하지만 default와 다르게 상속받은 자식클래스는 @Override 로 재정의 할 수 없습니다.</p>
</li>
</ul>
<h4 id="17-private-메서드-자바-9">1.7 private 메서드, 자바 9</h4>
<ul>
<li><p>java 9 이후에 private 메서드 와 private static 메서드를 추가 할 수 있습니다.</p>
</li>
<li><p>구현 클래스와 인터페이스가 상속되지 않는다</p>
</li>
<li><p>인터페이스에서 다른 메서드를 호출 할 수 있습니다.</p>
</li>
<li><p>private 은 private / abstract / default / static 메서드를 호출 가능</p>
</li>
<li><p>private static 은 static 과 static private 만 호출 가능합니다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] 상속이란?]]></title>
            <link>https://velog.io/@hochul-y/JAVA-%EC%83%81%EC%86%8D%EC%9D%B4%EB%9E%80</link>
            <guid>https://velog.io/@hochul-y/JAVA-%EC%83%81%EC%86%8D%EC%9D%B4%EB%9E%80</guid>
            <pubDate>Fri, 25 Mar 2022 15:04:12 GMT</pubDate>
            <description><![CDATA[<h1 id="📢-상속">📢 상속</h1>
<p>상속이란 기존의 클래스에 기능을 추가하거나 재정의하여 새로운 클래스를 정의하는것입니다.</p>
<p>상속을 사용하면 기존에 정의되어 있는 클래스의 모든 필드 메소드를 물려받을수 있습니다.</p>
<p>기존의 정의된 클래스를 부모클래스라 하고 상속을 통해 작성되는 클래스는 자식클래스라 합니다.</p>
<pre><code class="language-java">class 자식클래스이름 extends 부모클래스이름{...}
</code></pre>
<pre><code>* 상속은 위와 같은 문법으로 진행됩니다.</code></pre><h3 id="상속을-사용하는-이유">상속을 사용하는 이유</h3>
<blockquote>
<ol>
<li>기존에 작성된 클래스를 재활용 할 수 있습니다.</li>
<li>자식 클래스 설계시 부모클래스의 중복된 멤버 변수가 있을경우 작성하지 않아도 됩니다.</li>
<li>클래스 간의 계층적 관계를 구성합니다.</li>
</ol>
</blockquote>
<pre><code class="language-java">class Car {
    public int speed = 10;
    public String color =&quot;red&quot;;
}

class SuperCar extends Car{
    void print(){
        System.out.println(&quot;차량의 속도 : &quot;+speed);
        System.out.println(&quot;차량의 색 : &quot; +color);
    }
}</code></pre>
<p>위의 코드를 보면 SuperCar는 변수를 할당받지 않았지만 부모클래스의 변수를 사용할수 있습니다.</p>
<h1 id="📢-super">📢 Super</h1>
<h4 id="super-키워드">super 키워드</h4>
<ul>
<li><p>super 키워드는 부모의 클래스로부터 상속받은 필드나 메소드를 자식에서 참조할때 사용되는 변수입니다.</p>
<ul>
<li>비슷한 예로 클래스의 this 키워드를 생각하면 좋습니다!!</li>
</ul>
</li>
</ul>
<h4 id="super-메소드">super() 메소드</h4>
<ul>
<li><p>super() 메서드는 부모 클래스의 생성자를 호출할때 사용됩니다. </p>
</li>
<li><p>보통 컴파일러가 자동으로 끼워 넣어줍니다.</p>
</li>
<li><p>부모 클래스에 기본 생성자가 없을때 super()를 쓰게 되면 오류가 발생합니다.</p>
</li>
</ul>
<h1 id="📢-method-overriding">📢 Method overriding</h1>
<p>상속은 부모의 메서드를 가져다 쓸때 이를 재정의 할수있는데 이를 오버라이딩 이라고 합니다.</p>
<pre><code class="language-java">class Car {
    int speed = 10;
    String color =&quot;red&quot;;

    void print(){
        System.out.println(&quot;차량의 속도 : &quot;+speed);
        System.out.println(&quot;차량의 색 : &quot; +color);
    }
}

class SuperCar extends Car{
    String sound = &quot;부릉&quot;;

    @Override --&gt; //이놈은 친절히 오버라이드에요~~ 라고알려주는 놈이다.
    void print() {
        System.out.println(&quot;차량소리 : &quot;+sound);
    }
}</code></pre>
<p>위처럼 <strong>오버라이딩</strong>은 위와 같이 부모의 함수를 재정의하는 기능입니다.
그렇기 때문에 함수이름, 반환값, 매개변수가 모두 동일해야 합니다.</p>
<p>*<em>🧨 그럼 이름은같은데 매개변수나가 다를경우는 어떻게 될까요?
*</em></p>
<pre><code class="language-java">class Car {
    int speed = 10;
    String color =&quot;red&quot;;

    void print(){
        System.out.println(&quot;차량의 속도 : &quot;+speed);
        System.out.println(&quot;차량의 색 : &quot; +color);
    }
}

class SuperCar extends Car{

    //@Override
    void print(String sound) {
        System.out.println(&quot;차량소리 : &quot;+sound);
    }
}</code></pre>
<p>위와 같이 함수이름은 같고 매개변수가 다를경우에는 <strong>오버로딩</strong> 이됩니다.</p>
<h1 id="📢-다이내믹-메서드-디스패치">📢 다이내믹 메서드 디스패치</h1>
<p>다이내믹 메서드 디스패치를 알기 위해선 먼저 디스패치를 알아야합니다.</p>
<h4 id="dispatch">Dispatch</h4>
<blockquote>
<p>프로그램이 어떤 메소드를 호출할 것인가를 결정하여 그것을  실행하는 과정을 말합니다.</p>
</blockquote>
<p>디스패치의 종류는 2가지가 있습니다.</p>
<p> <strong>1. Static Dispatch</strong></p>
<ul>
<li>컴파일 시점에서 컴파일러가 어떤 메소드를 실행해야하는지 알고있는 경우 </li>
</ul>
<pre><code class="language-java">class Car {
    int speed = 10;
    String color =&quot;red&quot;;

    void print(){
        System.out.println(&quot;차량의 속도 : &quot;+speed);
        System.out.println(&quot;차량의 색 : &quot; +color);
    }

    public static void main(String[] args) {
        SuperCar superCar = new SuperCar();
        superCar.print();
    }
}

class SuperCar extends Car{
    String sound = &quot;부릉&quot;;

    void print() {
        System.out.println(&quot;차량소리 : &quot;+sound);
    }
}</code></pre>
<p>위의 코드 처럼 SuperCar.print()를 했을경우 SuperCar 클래스의 오버라이딩 된 함수가 불릴 것을 알고있습니다. 이처럼 저희가 알고있는사실을 컴파일러도 알고있는 경우를 정적 메소드 디스패치라고 합니다.</p>
<p><strong> 2. Dynamic Dispatch </strong></p>
<ul>
<li><p>Static Dispatch 와는 반대로 컴파일러가 어떤 메서드를 호출하는지 모르는 경우</p>
</li>
<li><p>이경우에는 호출할 메서드를 런타임 시점에서 결정한다.</p>
</li>
</ul>
<p><del>3. Double Dispatch 이부분은 아직잘 모르겠다.</del> </p>
<h1 id="📢-추상-클래스">📢 추상 클래스</h1>
<p>추상 클래스란 하나 이상의 추상 메소드를 가진 클래스를 뜻합니다.</p>
<p>추상클래스에는 abstract가 꼭 들어가야하고 자식 클래스에게 추상 메소드의 정의를 <strong>강제</strong> 합니다.</p>
<p>추상 클래스는 추상 메소드가 있다는것 말고는 일반적인 클래스와 크게 다를것이 없습니다.</p>
<h4 id="추상-메소드">추상 메소드</h4>
<p>추상 메소드란 반드시 오버라이딩 해야만 사용할수 있습니다.</p>
<blockquote>
<p>문법 abstrcat 반환타입 메소드이름();</p>
</blockquote>
<p>위와 같이 선언부만 있고 구현부가 없어서 오버라이딩 해야한다는 것입니다.</p>
<h1 id="📢-final-키워드">📢 final 키워드</h1>
<ul>
<li><p>final 키워드는 변수 , 메서드 , 클래스에 사용될 수 있습니다.</p>
</li>
<li><p>final 키워드를 붙인다는것은 붙여진 무언가를 제한한다는 의미를 가집니다.</p>
</li>
<li><p>class에 final이 붙으면 변경이 불가능한 클래스가 됩니다.</p>
</li>
<li><p>메소드에 final이 붙으면 오버라이딩을 통해 재정의를 할수없게 됩니다.</p>
</li>
<li><p>변수에 붙으면 값을 변경할 수 없는 상수가 됩니다.</p>
<pre><code class="language-java">final String hello = &quot;Hello world&quot;;
</code></pre>
</li>
</ul>
<h2 id="hello--hochul---에러">hello = &quot;hoChul&quot;--&gt; 에러</h2>
<p>final class Car{ // 변경불가능한 클래스
    final int speed = 100; // 값 변경 불가능</p>
<pre><code>final void getSpeed(){
    return speed; // 오버라이딩 불가능
}</code></pre><p>}</p>
<p>SuperCar extends Car{... &lt;-- 오류
}</p>
<p>```</p>
<ul>
<li>위의 코드와 같이 final 키워드가 붙은 값들은 초기화 후 변경할수 없습니다.</li>
</ul>
<h1 id="📢-object">📢 Object</h1>
<ul>
<li><p>java의 최상위 클래스 입니다.</p>
</li>
<li><p>생성한 모든 클래스는 object 기본 메서드가 포함됩니다.</p>
</li>
<li><p>Object 클래스는 필드를 가지지 않으며 11개의 메소드로만 구성되어있습니다.</p>
</li>
</ul>
<h4 id="object-메서드-종류">object 메서드 종류</h4>
<p>🎈출처: <a href="http://www.tcpschool.com/java/java_api_object">http://www.tcpschool.com/java/java_api_object</a></p>
<p><img src="https://images.velog.io/images/hochul-y/post/714eaf35-b776-422c-9d1f-907aaedbb6b2/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] 클래스란?]]></title>
            <link>https://velog.io/@hochul-y/JAVA-%ED%81%B4%EB%9E%98%EC%8A%A4%EB%9E%80</link>
            <guid>https://velog.io/@hochul-y/JAVA-%ED%81%B4%EB%9E%98%EC%8A%A4%EB%9E%80</guid>
            <pubDate>Thu, 24 Mar 2022 13:16:56 GMT</pubDate>
            <description><![CDATA[<h1 id="📢-클래스">📢 클래스</h1>
<p>자바에서 클래스는 객체를 정의하는 기본 적인 요소입니다.</p>
<p>클래스 안에는 생성자 ,객체의 필드(변수) 와 객체가 어떤 행동을 할건지를 보여줄수 있는 메소드로 구분됩니다.</p>
<p>클래스 는 객체지향 프로그래밍의 추상화라는 개념을 구현 한것이라고 할수있습니다.</p>
<h3 id="클래스-정의">클래스 정의</h3>
<p>🎈 출처 : <a href="http://www.tcpschool.com/java/java_class_declaration">http://www.tcpschool.com/java/java_class_declaration</a></p>
<p><img src="http://www.tcpschool.com/lectures/img_java_class_definition.png"></img></p>
<p>위의 그림을 보면 접근제어자 Class 키워드 &lt;클래스이름&gt;으로 생성을 합니다..
클래스 안에는 클래스 필드 와 클래스 메소드로 구성되어 있습니다.</p>
<ul>
<li><p><strong>클래스 필드</strong> : 객체 지향에서 속성에 해당하는 멤버 변수입니다.</p>
</li>
<li><p><strong>클래스 메소드</strong> : 객체 지향에서 기능(함수)에 해당합니다.<br><br></p>
</li>
</ul>
<h4 id="📢-접근제어자란">📢 접근제어자란?</h4>
<ul>
<li><p>외부의 클래스가 해당클래스의 접근을 허용하는 범위</p>
<ul>
<li>종류에는 public, protected, default, private 가 있습니다.</li>
</ul>
</li>
</ul>
<p>접근 제어자의 범위는 이렇게 됩니다.</p>
<p>public &gt; protected &gt; default &gt; private</p>
<ul>
<li>public : 같은 클래스 / 같은 패키지 / 자식 클래스 허용 / 그 외 허용</li>
<li>protected : 같은 클래스 / 같은 패키지 / 자식 클래스 허용</li>
<li>default : 같은 클래스 / 같은 패키지</li>
<li>private : 같은 클래스  </li>
</ul>
<h3 id="📝-객체-만드는-방법">📝 객체 만드는 방법</h3>
<p>위의 그림에서 Car 라는 클래스를 정의했습니다.</p>
<p>정의한 클래스에서 객체를 만들어야하는데 이렇게 객체에서 클래스를 만드는 과정을</p>
<p>클래스의 &#39;인스턴스 화&#39; 라고 합니다.</p>
<p><code>클래스명 변수명 = new 클래스명() &lt;-- 인스턴스 화</code></p>
<p>인스턴스화는 new 연산자를 통해서만 되고 변수명을 통해 객체를 사용합니다.</p>
<h3 id="new-연산자란">new 연산자란?</h3>
<ul>
<li><p>new 연산자는 Heap 이라는 메모리 영역에 메모리 공간을 할당하고</p>
</li>
<li><p>인스턴스를 생성하여 참조값을 리턴 하고 생성자를 호출합니다.</p>
</li>
</ul>
<p><code>참조값 확인방법 : Car car = new Car() 생성 이후</code></p>
<p><code>System.out.println(car); @참조값출력</code></p>
<h3 id="📝-메소드-정의하는-방법">📝 메소드 정의하는 방법</h3>
<p>위의 그림을 한번더 참고하자 </p>
<p><img src="http://www.tcpschool.com/lectures/img_java_class_definition.png"></img></p>
<ul>
<li>아래 클래스 메소드 부분을 보자 pubic void brake(){} 로 나와있는것을 볼수있는데</li>
</ul>
<p>이것을 풀어서 말하면 </p>
<pre><code class="language-java">접근제어자(public)반환타입(void) 메소드이름(brake) (매개변수목록(안줬다)) //선언부
{ //구현부
결국 정의하는 법은 절차지향의 함수와 크게 다르지 않습니다.</code></pre>
<p>로 설명이된다.</p>
<h3 id="📝-생성자-정의하는-방법">📝 생성자 정의하는 방법</h3>
<pre><code class="language-java">public 클래스이름(){
//블라 ~ ~ 블라
}
</code></pre>
<p>생성자는 위와 같이 선언되며 몇가지 특징이 존재합니다.    </p>
<ul>
<li><p>반환값이 없지만 , 반환 타입을 void 로 선언한하지 않습니다.</p>
</li>
<li><p>생성자의 초기화를 위한 데이터를 인수로 전달받을 수 있습니다.</p>
</li>
<li><p>하나의 클래스는 여러 개의 생성자를 받을수 있습니다.</p>
</li>
<li><p>클래스 내부에 생성자를 선언하지 않으면 기본 생성자를 선언하여 사용할수있습니다.</p>
</li>
</ul>
<h4 id="📢-생성자-종류">📢 생성자 종류</h4>
<pre><code>+ 기본 생성자 : 생성자가 없어도 자동으로 추가되는 생성자

+ 묵시적 생성자 : 파라미터 값을 가지지 않는 생성자

+ 명시적 생성자 : 파라미터 값을 가지는 생성자</code></pre><p>   예를 들면 아래와 같습니다.</p>
<pre><code class="language-java">public class Car{} //--&gt; 기본 생성자가 호출된다.
public class Car{
    ...
      //묵시적 생성자
    public Car(){
    System.out.println(&quot;자동차 생성&quot;);
    }
    //명시적 생성자
    public Car(int speed){
        this.speed = speed;
    }
}
</code></pre>
<h3 id="📝-this-키워드-이해하기">📝 this 키워드 이해하기</h3>
<ul>
<li>this 참조 변수는 인스턴스가 자기 자신을 참조하는데 사용하는 변수입니다.</li>
</ul>
<pre><code class="language-java">public Car{
    private int speed;

    public Car(int speed){
        this.speed = speed;
    }
}
</code></pre>
<ul>
<li>this 참조 변수는 인스턴스의 주소를 가리키고 있습니다.
그렇기 때문에 위 처럼 변수의 이름이 같을경우 구분이 가능합니다.</li>
</ul>
<pre><code class="language-java">public Car{
    private int speed;
    private String color;

    public Car(int speed){
        this.speed = speed;
    }

    public Car(int speed , String color){
        this(speed);
        this.color = color;
    }
}
</code></pre>
<ul>
<li>this() 는 해당 클래스의 생성자를  호출할수도 있습니다.
그렇기 때문에 <strong>재사용</strong> 하는데 쓰입니다.<br>



</li>
</ul>
<p>📕 참고사이트
 &lt; <a href="http://www.tcpschool.com/java/java_class_component&gt;">http://www.tcpschool.com/java/java_class_component&gt;</a></p>
]]></description>
        </item>
    </channel>
</rss>