본문 바로가기
인천일보아카데미/- 학습일지

[학습일지]JAVA교육일지 43일차

by w1z 2022. 6. 16.

람다식 (Lambda Expression)


람다식 (Lambda Expression)

[ 정의 ]

- 함수형 프로그래밍 스타일 지원

- 자바의 메소드 표현과 유사하다

- 자바의 메소드를 좀 더 쉽고 간결하게 정의하기 위한 기법

 

[ 기본 표현(문법) ]

(자료형 매개 변수) -> { 실행 코드; }

1) 매개 변수: 메소드의 매개변수와 동일한 역할
2) -> : 화살표(Arrow), 코드블럭을 호출하는 역할
3) 실행코드: 메소드의 구현부와 동일한 역할


자바의 메소드와 자바스크립트 함수와 유사하다.
1) Java
public void test(int a) {
	syso(a);
}

2) JavaScript
function test() {}
() {}

 

[ Java의 람다식 ]

- 자바의 람다식은 불안전 하다.

- 객체 지향이라 메소드가 독립적이지 않다.

- 메소드를 객체 취급할 수 없다.

- 인터페이스를 사용해서(도움을 받아) 정의한다.

- 자바의 람다식 코드 > 인터페이스 변수 = 람다식;

 

[ 자바의 익명 객체 ]

- 이름없는 클래스를 사용해서 만드는 객체

- 인터페이스를 사용한다.

- 딱 1번만 객체를 만들 필요가 있을 때 사용한다.

 

[ 자바의 람다식 기본 예제 ]

public static void main(String[] args) {

	TestInterface t1 = () -> {
        System.out.println("익명 객체가 구현한 메소드");
    }
    
    t1.test();
}

interface TestInterface {
	void test();
}

 

- 결과 (Console)

   -> 익명 객체가 필요할 때 람다식을 사용하면 간결하게 표현할 수 있다.

 

[ 자바의 람다식 종합 예제 ]

- 람다식 = 익명객체의 추상 메소드

     a. 매개변수 O, X

     b. 반환값 O, X

 

1) 매개변수 X, 반환값 X

public static void main(String[] args) {

    NoParameterNoReturn a1 = () -> { System.out.println("a1"); };
    a1.call();

}

interface NoParameterNoReturn {
    void call();
}



--> output(console)
a1

 

2) 매개변수 O(1개), 반환값 X

public static void main(String[] args) {

    // 매개변수가 1개만 있을때 람다식 표현방법 2가지
    
    // 방법1
    ParameterNoReturn a2 = (int num) -> { System.out.println(num); };
    a2.call(100);
    a2.call(200);
    a2.call(300);
    
    // 방법2 - 매개변수가 1개라면 좀더 간결하게 표현할 수 있다. () {} 제거
    ParameterNoReturn a3 = num -> System.out.println(num);
    a3.call(400);
    a3.call(500);

}

interface ParameterNoReturn {
   void call(int num);
}



--> output(console)
100
200
300
400
500

 

3) 매개변수 O(여러개), 반환값 X

public static void main(String[] args) {

    // 매개변수가 여러개 있을때 람다식 표현방법 2가지
    
    // 방법1
    ParameterNoReturn2 a4 = (int a, int b) -> { System.out.println(a+ b); };
    a4.call(100, 200);
    
    // 방법2 - 매개변수가 2개 이상일 때는 자료형을 생략할 수 있고, ()는 생략할 수 없다.
    ParameterNoReturn2 a5 = (a, b) -> System.out.println(a+b);
    a5.call(100, 200);

}

interface ParameterNoReturn2 {
   void call(int a, int b);
}



--> output(console)
300
300

 

4) 매개변수 X, 반환값 O

public static void main(String[] args) {

    // 매개변수가 없을 때는 ()를 생략할 수 없다.
    NoParameterReturn a6 = () -> { return 100; };
    System.out.println(a6.call());
    
    // 실행 블럭에 실행문이 유일하게 반환문만 존재할 때
    oParameterReturn a7 = () -> 100;
    System.out.println(a7.call());

}

interface NoParameterReturn {
   int call();
}



--> output(console)
100
100

 

5) 매개변수 O, 반환값 O

public static void main(String[] args) {

    // 방법1
    ParameterReturn a8 = (int a, int b) -> { return a + b; };
    System.out.println(a8.call(100, 200));
    
    // 방법2 - 더 간결하게 표현
    ParameterReturn a9 = (a,b) -> a+b;
    System.out.println(a9.call(100, 200));

}

interface ParameterReturn {
   int call(int a, int b);
}



--> output(console)
300
300

 


MEMO>

# 오랜만에 Java에서 인터페이스를 사용해봤는데, 불과 몇달전 수업 후 복습을 했지만... 까먹었다. 다시 공부해야겠다.

# Java에서 람다식의 목적은 익명객체가 필요로 할 때 좀 더 간결하게 표현하기 위해 쓰인다!! 

# 람다식 표현법: (자료형 매개변수) -> { 실행코드 }

# 람다식을 표현할 때 매개변수, 반환값의 존재유무에 따라 머릿속에서 정리하기