3일차 과제 [인프런 워밍업 클럽 스터디 BE 1주차]

heisje·2024년 2월 21일
0

3일차 과제

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

프로그래밍이 복잡해지고 선언적여지는 추세에 있는 와중에, JAVA에서 컬렉션과 스트림을 잘사용할 수 있는 방향을 찾으며 생겨난 것이다.(이라고 생각한다.)

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

옛날부터 함수를 간접적으로 전달할 때 익명함수를 활용했다. 하지만 익명클래스는 코드가 길고 복잡하다. 람다를 사용하면 가독성, 간결, 스트림과 잘 어울리는 장점으로 람다를 권장하는 추세이다.

람다식은 메서드가 아닌, 익명 클래스의 인스턴스(객체)이다. 먼저 람다식을 살펴보면 아래와 같다.

(int a, int b) -> a > b ? a : b;

위와 같은 람다식은 실제로는 아래처럼 생겼다. 익명 클래스의 인스턴스를 하나 만들고 내부적으로 메서드를 가지게 했다.

new Objcet() {
  int max(int a, int b) {
    return a > b ? a : b;
  }
}

더 나아가 람다식으로 메서드를 전달해 사용할 수 있게 만드는 방법은 다음과 같다.

아래처럼 인터페이스에 단 하나의 추상메서드만 구현하면 된다. @FunctionalInterface를 붙이면 올바르게 함수형 인터페이스를 정의했는지 체크해준다. 즉 public메서드가 1개 초과하면 컴파일 에러를 발생시킨다.

@FunctionalInterface
public interface 무기{
	void 공격();
}

아래처럼 람다식을 전달해 사용할 수 있다.

public class Main {

	public static void main(String[] args){
		군인 soldier = new 군인();
		solder.공격(()->System.out.println("빵야"));
		solder.공격(()->System.out.println("와장창")); 
	}
}

람다식의 문법은 어떻게 될까?

람다식 문법

(인자 목록) -> { 로직 }

원래 기존의 함수형태를 보면 다음과 같다

void foo() {
    System.out.println("나는 함수다요");
}

람다로 표현하면 아래와 같다. 함수의 이름과 타입이 추론가능하면 없앨 수 있다.

() -> {
    System.out.println("나는 함수다요");
};

Return값이 결과값이면 축약할 수 있다. 이 경우엔 return void형태라 return값은 존재하지 않는다.

() -> System.out.println("나는 함수다요");

다음과 같이도 쓸 수 있다.


(a, b) ->  a > b ? a: n

예시

전통적인 방법

**for** (**int** i = 0; i < 10; i++) {
    System.out.println(i);
}람다식을 사용하여 만드는 방법
  • Java 8부터 지원되는 람다식을 사용한 코드
IntStream.range(0, 10).forEach((**int** value) -> System.out.println(value));
  • 컴파일러의 추론을 통해 파라미터의 자료형을 생략한 코드
IntStream.range(0, 10).forEach(value -> System.out.println(value));
  • 메서드 참조를 사용한 코드
IntStream.range(0, 10).forEach(System.out::println);

참고자료

https://dwaejinho.tistory.com/entry/Java-Lambda-Stream-도입-배경과-원리-파해치기

profile
김희제의 기술블로그

0개의 댓글