728x90

자바의 람다식은 왜 등장했을까?

람다는 함수형 프로그래밍이다.  함수형 프로그래밍은 프로그램을 작성하는 데 있어서 함수의 조합을 중심으로 하는 프로그래밍이다. 이는 병렬 처리 및 동시성 프로그래밍을 강조하고, 불변성과 순수 함수를 중시하여 안정적이고 예측 가능한 코드를 작성한다.

 

자바는 과거부터 객체지향 프로그래밍 언어로서의 강점을 가지고 있었지만, 함수형 프로그래밍의 이점도 놓치지 않기 위해 Java 8에서 람다식이 도입되었다. 람다는 코드의 간결성과 가독성을 높이고 병렬성을 활용할 수 있다. 또, 함수형 프로그래밍은 요즘 개발에 있어 중요한 요소로 자리 잡았다. 자바도 객체지향 프로그래밍을 보완하면서, 시대의 변화에 맞게 변화하기 위해 도입하였다.

 

 

람다식과 익명 클래스는 어떤 관계가 있을까?

 

1. 익명 클래스란?

Java에서 클래스는 사용자가 정의한 타입을 만드는

설계도로 객체를 생성하고 코드의 재사용성을 높이는 역할을 한다.

 

하지만 익명 클래스는 내부 클래스의 일종으로 말 그대로 이름 없는 클래스를 말한다.

익명 클래스는 단발성으로 한번만 사용해야 하는 객체일 경우 사용한다.

즉, 클래스와 같이 재사용성이 없고, 오히려 확장하여 사용하는 것이 불리할 때 사용한다.

 

그렇기 때문에 생성자를 선언할 수 없고, 단 하나의 클래스, 인터페이스를 상속 받거나 구현할 수 있다.

public class Anonymous {
    public static void main(String[] args){
        className variableName = new className(){ // 클래스이름 참조변수이름 = new 클래스이름
            // 내용 작성
        }
    }
}

 

2. 함수형 프로그래밍이란?

순수 함수를 조합하고 공유 상태를 변경 가능한 데이터 및 부작용을 피해 소프트웨어를 만든는 프로그래밍 방법이다.
선언형 프로그래밍으로, 애플리케이션의 상태는 순수 함수를 통해 전달된다.

(명령형 프로그래밍은 어떻게 할지 표현하고, 선언형 프로그래밍은 무엇을 할 것인지 표현한다.)

 

  • 순수 함수 (Pure Function)
    • 순수 함수는 동일한 입력 값에 대해 항상 같은 값을 반환해준다.
    • 전역 변수를 사용하거나, 변경하면서 생기는 부작용이 없다.

 

  • 1급 객체 (Frist Class Citizen)
    • 변수나 데이터 구조안에 담을 수 있다.
    • 파라미터로 전달 할 수 있다.
    • 반환값으로 사용할 수 있다.
    • 할당에 사용된 이름과 무관하게 고유한 구별이 가능하다. 
    • class가 없어도 독립적으로 메서드의 인자로 전달되고나 return 값으로 전달 받을 수 있다.
      즉, 함수를 데이터 다루듯이 사용할 수 있다.
  • 고차 함수(High Order Function)
    • 함수를 매개변수로 사용하거나 함수를 반환하는 함수.
  • 불변성(Immutable)
    • 데이터는 변하지 않는 불변성을 가지고 있다.
    • 데이터의 변경이 필요할 경우, 원본 데이터는 변경하지 않고 복사본을 만들어 변경하고 사용한다.

 

3. 함수형 인터페이스(FunctionalInterface)

함수형 인터페이스는 오직 한 개의 추상 메서드를 갖는 인터페이스이다.

@FunctionalInterface
interface FuncInterface {
    // 추상메서드
    int sum(int a, int b);
    
    // default 메서드
    default int minus(int a, int b);
    
    // static 메서드
    static int mul(int a, int b);
}

 

위 코드와 같이 @FunctionalInterface 어노테이션이 붙고, 오로지 추상 메서드는 한 개 있거나,

default가 붙거나 static이 붙은 메서드가 있는 것을 말한다.

이때 default 메서드와 static이 붙은 메서드는 함수형 인터페이스에 아무런 영향을 미치지 않는다.

 

Java에서는 기본적으로 많이 사용되는 함수형 인터페이스를 제공한다.

java.util.fuction 패키지는 일반적으로 자주 쓰이는 함수형 이터페이스를 미리 정의한 패키지이다.

그러므로 함수형 인터페이스를 만들기 보다는 이 패키지를 활용하는 것이 좋다.

출처 - https://joomn11.tistory.com/22

 

 

4. 람다란?

람다 함수는 함수형 프로그래밍 언어에서 사용되는 개념으로 익명 함수라고도 한다.
Java 8 부터 지원하고, 불필요한 코드를 줄여 가독성을 향상 시킨다.

 

  • 람다의 특징
    • 익명 함수로 이름을 가질 필요가 없다. 
    • 메소드의 매개변수로 전달되거나, 변수에 저장될 수 있다.
    • 익명 클래스는 생성할 때 많은 코드를 작성해야 하지만 람다는 불필요한 코드를 작성하지 않아도 된다.
    • 람다는 메서드처럼 특정 클래스에 종속되지 않는다. 하지만 메서드와 동일하게 사용할 수 있다.(파라미터, 리턴 등)
  • 람다의 장점
    • 코드를 간결하게 만들 수 있다.
    • 코드에 개발자의 의도가 명확히 드러나 가독성이 높다진다.
    • 함수를 만드는 과정 없이 한번에 처리 가능하여 생산성이 높아진다.
    • 병렬 프로그래밍에 용이하다.
  • 람다의 단점
    • 람다로 사용한 익명함수는 재사용이 불가능하다.
    • 재귀로 사용하기엔 부적절하다.
    • 디버깅이 어렵다.
    • 람다로만 사용하게 되면 중복 생성이 될 가능성이 있다.
  • 람다 사용 방법
interface Calculator{
	public void calc(int a, int b);
}

public class Main{
    public static void main(String[] args){
        Calculator sum = (a, b) -> {
            int answer = a + b;
            System.out.println("sum: " + answer);
        }
        sum.calc(10, 20);
    }
}

// 람다 방식
// (매개변수 선언) -> { 문장들 }

 

 

[정리]

익명 클래스로 작성한 코드보단 람다식으로 작성한 코드가 훨씬 가독성이 좋고 간결성 있다.

람다는 매개변수 타입을 추론할 수 있지만, 익명 클래스는 인터페이스의 타입을 선언해야한다.

interface Calculator{
	public void calc(int a, int b);
}


// 익명
public class Main {
    public static void main(String[] args) {
        Calculator sum = new Calculator() {
            @Override
            public void calc(int a, int b) {
                int answer = a + b;
                System.out.println("sum: " + answer);
            }
        };
        sum.calc(10, 20);
    }
}

// 람다
public class Main{
    public static void main(String[] args){
        Calculator sum = (a, b) -> {
            int answer = a + b;
            System.out.println("sum: " + answer);
        }
        sum.calc(10, 20);
    }
}

 

 

강의 링크 👉 자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]

728x90

+ Recent posts