<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>satellite.log</title>
        <link>https://velog.io/</link>
        <description>//</description>
        <lastBuildDate>Thu, 21 Sep 2023 14:06:30 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. satellite.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/satellite_ys" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[JAVA 람다식 (1)]]></title>
            <link>https://velog.io/@satellite_ys/%EB%9E%8C%EB%8B%A4%EC%99%80-%EC%8A%A4%ED%8A%B8%EB%A6%BC</link>
            <guid>https://velog.io/@satellite_ys/%EB%9E%8C%EB%8B%A4%EC%99%80-%EC%8A%A4%ED%8A%B8%EB%A6%BC</guid>
            <pubDate>Thu, 21 Sep 2023 14:06:30 GMT</pubDate>
            <description><![CDATA[<p><em>코딩테스트를 준비하며.....</em></p>
<p>java를 메인 언어로 공부하는 입장에서 
각종 알고리즘 문제풀이 사이트에서 순위권에 존재하는 코드를 구경하다 보면
내가 알던 자바가 맞나? 싶을 정도로 간결하고 가독성이 높은 코드들을 마주할 때가 있다.</p>
<p>단순히 for문과 if문을 사용하던 아니, 전부인줄 알았던 나에겐 신선한 충격이였다.</p>
<p><del>지금까지 람다식과 스트림을 몰랐던 내가 더 충격...</del></p>
<p>아무튼 람다와 스트림에 대하여 검색을 좀 해보니 Java8 부터 시작된 문법이였고 현업에서 많~이 사용한다는 사실을 알게 되었다.</p>
<p>이번 기회에 람다와 스트림 문법을 장착하여 코드를 모던하게 작성 해보겠다.</p>
<hr>
<h2 id="람다식">람다식</h2>
<p>람다식을 한 마디로 정의하자면</p>
<blockquote>
<p>&quot; 메서드를 한 하나의 식으로 표현한 것 &quot;</p>
</blockquote>
<p>이라고 할 수 있다.</p>
<p>그렇다면 람다식은 메서드일까? 객체일까?
결론부터 말하자면 람다식은 익명 &quot;객체&quot;이다.</p>
<p>객체를 다루려면 참조변수가 필요하다. 
그렇다면 참조변수의 타입은 무엇이 되어야 할까?</p>
<p>바로 <em>FunctionalInterface</em> = 함수형 인터페이스 타입이다.</p>
<p>그래서 함수형 인터페이스가 뭘까?</p>
<blockquote>
<p>구현 해야 할 추상 메서드가 한 개 있는 인터페이스</p>
</blockquote>
<p>예를 들어서 하나의 함수형 인터페이스를 만들어 보겠다.</p>
<pre><code>@FunctionalInterface
public interface MyFunctionalInterface{
    public void run();
}</code></pre><p>@FunctionalInterface 애노테이션을 선언하여 해당 인터페이스의 추상메서드가 하나임을 보장받는다. (추상메서드가 1개 이상이면 에러 발생)</p>
<p>MyFunctionalInterface의 추상메서드 이름은 run()이며 매개변수와 리턴타입이 없다.</p>
<p>이제 이 함수형 인터페이스를 사용해보자</p>
<pre><code>public static void main(String[] args){
    MyFunctionalInterface myf = () -&gt; System.out.println(&quot;TEST&quot;);

    myf.run();
}</code></pre><p>위 코드를 보면 람다식이 등장하고 해당 람다식이 함수형인터페이스 타입 참조변수 myf에 저장되어 사용되어지는 것을 볼 수 있다.</p>
<pre><code>() -&gt; System.out.println(&quot;TEST&quot;);</code></pre><p>이 람다식의 형태는 함수형인터페이스의 추상메서드 run 의 형태와 닮아있지 않은가?
run은 매개변수와 리턴타입이 없는 추상메서드 이다.
람다식의 괄호 부분이 바로 매개변수를 뜻하며, 화살표 뒤의 내용은 메서드의 구현부이다. </p>
<p>위 람다식은 리턴값이 없고 단순한 출력문을 실행하므로 추상메서드 run과 완벽히 매칭이 된다.</p>
<pre><code>myf.run();</code></pre><p>람다식을 담고 있는 참조변수 myf을 활용하여 run을 호출하는 방식으로 사용할 수 있다.
<img src="https://velog.velcdn.com/images/satellite_ys/post/811ae977-c22e-420a-bc19-204b9814ebcb/image.png" alt=""></p>
<p>만약 람다식이 없었다면 어떻게 될까?</p>
<pre><code>public class Myfunc implements MyFunctionalInterface{
    @Override
    public void run(){
        System.out.println(&quot;TEST&quot;);
    }
}</code></pre><pre><code>public static void main(String[] args){
    Myfunc mc = new Myfunc();
    mc.run();
}</code></pre><p>이 처럼 MyFunctionalInterface를 오버라이딩하는 클래스를 만들어서 인스턴스를 생성하여 사용해야 했다.</p>
<p>람다식으로 이러한 과정들을 생략하고 바로 인스턴스를 생성할 수 있다.</p>
<p>추가적으로 외부에서 선언된 변수를 람다식 내부에서 변경할 수 없다.
왜냐하면 람다식 내부에서 외부 변수는 final 키워드가 붙어 상수로 취급을 하기 때문이다.</p>
<hr>
<h2 id="람다식-작성-방법">람다식 작성 방법</h2>
<ol>
<li><p>매개변수와 리턴값이 없는 경우</p>
<p>위의 예시과 같다.</p>
</li>
<li><p>매개변수가 있는 경우</p>
<pre><code>public interface MyFunctionalInterface{
public void sum(int x, int y);
}</code></pre><p>위와 같은 경우 매개변수가 x, y 두 개를 받아 출력한다고 하면(리턴값 없음)</p>
<pre><code>(int x, int y) -&gt; System.out.println(x + y)</code></pre><p>람다식으로 이렇게 표현 할 수 있다.</p>
<pre><code>(x, y) -&gt; System.out.println(x + y)</code></pre><p>추상메서드에 integer로 자료형이 명시되어 있으므로 타입추론이 가능하기 때문에
람다식에서 자료형을 생략해도 괜찮다.</p>
<pre><code>x -&gt; System.out.println(x)</code></pre><p>매개변수가 하나일 경우 괄호까지 생략 가능하다.</p>
</li>
</ol>
<ol start="3">
<li>매개변수와 리턴값이 있는경우<pre><code>public interface MyFunctionalInterface{
 public int sum(int x, int y);
}</code></pre>위의 추상 메서드는 리턴형이 int이다.<pre><code>(int x, int y) -&gt; {return x + y}</code></pre>변수 x와 y를 더하여 리턴한다.
이 때, return문이 한 줄 이라면 return과 중괄호{}를 같이 제거할 수 있다.<pre><code>(x, y) -&gt; x + y</code></pre>이렇게 간단해진다.</li>
</ol>
<hr>
<h3 id="마치며">마치며</h3>
<p>람다식이 무엇이며 어떻게 작성하는지 알아보았다.
람다식은 익명객체이며 함수형 인터페이스 타입의 참조변수를 필요로 한다.</p>
<p>이 때, 매번 함수형 인터페이스를 만들어서 사용하는건 귀찮은 일이다.
따라서 미리 만들어 놓은 표준 함수형 인터페이스를 사용하는 것을 추천한다.</p>
<p>다음 포스팅에 표준 함수형 인터페이스의 종류와 사용법, 그리고 스트림에 대하여 알아보도록 하겠다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Java Bean과 Spring Bean]]></title>
            <link>https://velog.io/@satellite_ys/Java-Bean%EA%B3%BC-Spring-Bean</link>
            <guid>https://velog.io/@satellite_ys/Java-Bean%EA%B3%BC-Spring-Bean</guid>
            <pubDate>Mon, 31 Jul 2023 12:47:20 GMT</pubDate>
            <description><![CDATA[<h2 id="개념을-명확하게-이해하자">개념을 명확하게 이해하자...</h2>
<p>Bean은 과거 웹 프로그래밍 수업에서 Spring을 사용하며 접했던 핵심 개념이지만</p>
<p>시험을 위한 급급한 암기 수준에서 그쳤고  그로부터 1년이 지나 Spring Boot공부를 시작한 지금 
머릿속에서 Spring Bean의 개념이 명확하게 떠오르지 않았다.</p>
<p>따라서 오늘은 Bean이라는 개념을 명확하게 공부하고 정리 해 보려고한다.</p>
<hr>
<h2 id="java-bean">Java Bean</h2>
<p>Java Bean의 정의
&quot; 빌더 형식의 개발도구에서 가시적으로 조작이 가능하고 또한 재사용이 가능한 Java로 작성된 소프트웨어 컴포넌트&quot;</p>
<p>Spring Boot를 공부하는 나의 입장에서 개념을 추가하자면,
DTO나 VO와 같은 형태를 지닌 Java 클래스를 뜻한다.</p>
<blockquote>
<p>즉, 필드는 private로 선언하여 직접적인 접근을 막고
Setter 와 Getter를 통해서 접근이 가능하며
생성자에 파라미터가 없어야 한다.</p>
</blockquote>
<p>객체지향에서 지향해야할 POJO개념과 거의 동일하다고 생각하면 된다.</p>
<hr>
<h2 id="spring-bean">Spring Bean</h2>
<p>위에서 살펴본 Java Bean의 개념이 &#39;특정 형식을 지키는 클래스&#39; 였다면
Spring Bean의 개념은 결이 살짝 다르다.</p>
<blockquote>
<p>간단하게 설명해서 &#39;Spring IoC 컨테이너에서 관리되는 객체&#39;이다.</p>
</blockquote>
<p>Java Bean처럼 클래스가 특정한 형식을 지켜야 할 필요가 없다.</p>
<p>Spring을 공부하는 사람이라면 IOC(제어의 역전) 개념을 알고 있다고 생각하고
Spring Bean을 IOC 컨테이너에 등록하는 방법을 알아보자.</p>
<h4 id="1-컴포넌트-스캔">1. 컴포넌트 스캔</h4>
<p>Spring 프로젝트에서 흔히 사용하는 @Controller, @Service, @Repository, @Configuration과 같은 어노테이션을 사용하는 방식이다.
이들은 기본적으로 @Component를 포함하고 있기 때문에 자동으로 스캔하여 등록된다.</p>
<p>등록된 Bean을 사용(스프링 컨테이너에게 의존성을 주입 받음)하고 싶으면 @Autowired 어노테이션을 사용하면 된다.</p>
<p>참고로, 스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본으로 싱글톤으로 등록한다.
따라서 같은 스프링 빈이면 모두 같은 인스턴스다.</p>
<p>이 떄, Lombok을 사용한다면 빈을 사용하려는 객체에 @RequiredArgsConstructor을 선언하혀
@Autowired를 선언하지 않고 간단하게 사용 할 수 있다.</p>
<h4 id="2-자바-코드로-직접-스프링-빈-등록하기">2. 자바 코드로 직접 스프링 빈 등록하기</h4>
<p>스프링은 @Configuration 어노테이션이 명시된 클래스를 우선으로 읽는다.</p>
<p>따라서 SpringConfig.java 파일을 생성하여 @Configuration을 명시한 뒤, 클래스 내의 메서드에게 @Bean 어노테이션을 명시하여 등록한다. 이 때, 메서드 이름이 Bean의 이름이 된다.
@Configuration 어노테이션과 @Bean 어노테이션을 함께 사용하면 싱글톤임을 보장해 준다.</p>
<p>단, Controller는 컴포넌트 스캔 방식으로 등록해야 한다.</p>
]]></description>
        </item>
    </channel>
</rss>