JAVA Advanced

JAVA Advanced


1. 개요


자바(JAVA)에서 다른언어를 배울 때 익히지 못하거나, 특별히 다른 개념/문법들 정리



2. 내용


2.1 Interface, Lambda, Generic, Stream, Optional

자바에서 다른 언어에는 없거나 조금 다르게 작동하는 개념들

2.1.1 Interface

자바에는 Class에서 다중상속을 지원하지 않는다. 이는 다이아몬드 상속문제의 모호함을 피하기 위함이다. 따라서 Interface(인터페이스)라는 추상형식을 사용해 프로그래밍에 유연함을 더한다. JAVA의 인터페이스는 다른 언어(C++)의 클래스와 같이 다중상속이 가능하지만, JAVA의 클래스는 다중상속을 지원하지 않는다.

인터페이스의 특징

  1. 순수한 추상형식 (Pure Abstract) : 인터페이스는 추상형식의 집합으로, 추상 메서드 들의 집합이다. 이는 인터페이스에서 메모리 할당이나 논리식과 같이 공간과 연산이 필요한 작업을 하지 않는다는 것을 의미한다.
  2. 상수 선언 : 다만, 상수의 선언은 가능하다.
<p>인터페이스 예제코드 (GPT작성)&lt;/summary&gt;</p>

<figure class="highlight">
  <pre><code class="language-java" data-lang="java">    <span class="c1">// 다중 상속을 지원하는 인터페이스 정의</span>
<span class="kd">interface</span> <span class="nc">Walkable</span> <span class="o">{</span>
    <span class="kt">void</span> <span class="nf">walk</span><span class="o">();</span>
<span class="o">}</span>

<span class="kd">interface</span> <span class="nc">Swimmable</span> <span class="o">{</span>
    <span class="kt">void</span> <span class="nf">swim</span><span class="o">();</span>
<span class="o">}</span>

<span class="c1">// 인터페이스를 구현한 클래스</span>
<span class="kd">class</span> <span class="nc">Human</span> <span class="kd">implements</span> <span class="nc">Walkable</span><span class="o">,</span> <span class="nc">Swimmable</span> <span class="o">{</span>
    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">walk</span><span class="o">()</span> <span class="o">{</span>
        <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Walking..."</span><span class="o">);</span>
    <span class="o">}</span>
    
    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">swim</span><span class="o">()</span> <span class="o">{</span>
        <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Swimming..."</span><span class="o">);</span>
    <span class="o">}</span>
<span class="o">}</span>

<span class="c1">// 메인 클래스</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">Main</span> <span class="o">{</span>
    <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="nc">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span>
        <span class="c1">// 인터페이스를 구현한 객체 생성</span>
        <span class="nc">Human</span> <span class="n">person</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Human</span><span class="o">();</span>
        
        <span class="c1">// 인터페이스를 통한 메서드 호출</span>
        <span class="n">person</span><span class="o">.</span><span class="na">walk</span><span class="o">();</span>
        <span class="n">person</span><span class="o">.</span><span class="na">swim</span><span class="o">();</span>
    <span class="o">}</span>
<span class="o">}</span></code></pre>
</figure>

<p>&lt;/details&gt; <br /> <br /></p>

<h3 id="lambda">2.1.2 Lambda</h3>

<p>Lambda(람다)식은 간단한 대소비교 식 등을 별도의 매소드(함수)작성없이 일회용 함수를 만들어 사용가능하게 한다. 코드의 가독성을 증가시키지만, for문이나 재귀함수같은 반복시 매번 함수를 생성해야하므로, 리소스의 낭비가 크다. 다른 언어의 람다함수작성법과 유사</p>

<h3 id="generic">2.1.3 Generic</h3>

<p>Generic은 타입을 지정하지 않음으로서 매서드와 파라미터의 재사용성을 높이는 형식지정자(=타입 매개변수, 타입 파라미터)이다. 타입 매개변수명 <strong>T</strong>를 일반적으로 사용하며, Python이나 let과 같이 변수,매서드,클래스의 타입을 <strong>알아서 지정해주는것이 아닌</strong>, 명시적으로 선언하여 호출한 뒤 명시적으로 반환받는다.</p>

<details>
  <summary>
    <p>제네릭 예제코드 (GPT 작성) &lt;/summary&gt;</p>

    <figure class="highlight">
      <pre><code class="language-java" data-lang="java">    <span class="c1">// Generic 클래스 선언</span>
<span class="kd">class</span> <span class="nc">Box</span><span class="o">&lt;</span><span class="no">T</span><span class="o">&gt;</span> <span class="o">{</span>
    <span class="kd">private</span> <span class="no">T</span> <span class="n">item</span><span class="o">;</span>

    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">setItem</span><span class="o">(</span><span class="no">T</span> <span class="n">item</span><span class="o">)</span> <span class="o">{</span>
        <span class="k">this</span><span class="o">.</span><span class="na">item</span> <span class="o">=</span> <span class="n">item</span><span class="o">;</span>
    <span class="o">}</span>

    <span class="kd">public</span> <span class="no">T</span> <span class="nf">getItem</span><span class="o">()</span> <span class="o">{</span>
        <span class="k">return</span> <span class="n">item</span><span class="o">;</span>
    <span class="o">}</span>
<span class="o">}</span>

<span class="c1">// Generic 메서드 사용</span>
<span class="kd">class</span> <span class="nc">Main</span> <span class="o">{</span>
    <span class="kd">public</span> <span class="kd">static</span> <span class="o">&lt;</span><span class="no">T</span><span class="o">&gt;</span> <span class="kt">void</span> <span class="nf">printItem</span><span class="o">(</span><span class="nc">Box</span><span class="o">&lt;</span><span class="no">T</span><span class="o">&gt;</span> <span class="n">box</span><span class="o">)</span> <span class="o">{</span>
        <span class="no">T</span> <span class="n">item</span> <span class="o">=</span> <span class="n">box</span><span class="o">.</span><span class="na">getItem</span><span class="o">();</span>
        <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Item: "</span> <span class="o">+</span> <span class="n">item</span><span class="o">.</span><span class="na">toString</span><span class="o">());</span>
    <span class="o">}</span>

    <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="nc">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span>
        <span class="c1">// Integer 타입을 갖는 Box 생성</span>
        <span class="nc">Box</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">&gt;</span> <span class="n">integerBox</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Box</span><span class="o">&lt;&gt;();</span>
        <span class="n">integerBox</span><span class="o">.</span><span class="na">setItem</span><span class="o">(</span><span class="mi">123</span><span class="o">);</span>

        <span class="c1">// String 타입을 갖는 Box 생성</span>
        <span class="nc">Box</span><span class="o">&lt;</span><span class="nc">String</span><span class="o">&gt;</span> <span class="n">stringBox</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Box</span><span class="o">&lt;&gt;();</span>
        <span class="n">stringBox</span><span class="o">.</span><span class="na">setItem</span><span class="o">(</span><span class="s">"Hello, World!"</span><span class="o">);</span>

        <span class="c1">// Generic 메서드 호출</span>
        <span class="n">printItem</span><span class="o">(</span><span class="n">integerBox</span><span class="o">);</span>
        <span class="n">printItem</span><span class="o">(</span><span class="n">stringBox</span><span class="o">);</span>
    <span class="o">}</span>
<span class="o">}</span></code></pre>
    </figure>

    <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>결과적으로, Box클래스를  Int타입과 Str타입 모두에서 사용할 수 있다. </code></pre></div>        </div>
    <p>&lt;/details&gt;  <br /></p>

    <h3 id="stream">2.1.4 Stream</h3>

    <h3 id="optional">2.1.5 Optional</h3>
  </summary>
</details>

You might also enjoy