4-1. (1) Lambda (람다식)

zhyun·2020년 9월 21일
0

HighJava

목록 보기
20/67

1. Lambda(람다식)란?

람다식 -> 매개변수를 가진 코드 블록 -> 익명 구현 객체

  • 람다식은 (매개변수)->{실행코드}로 작성
  • 자바에서는 '매개변수를 가진 코드 블럭' => 런타임시 익명구현객체로 생성
  • 어떤 인터페이스를 구현할 것인가는 대입되는 인터페이스가 무엇이냐에 달려있다.
  • 익명함수를 생성하기 위한 식 코드가 간편해짐!

2. Lambda(람다식) 기본 문법

(타입 매개변수,...) -> {처리할 코드들(실행문);...}

  • (타입 매개변수,...)는 오른쪽 중괄호{} 블록을 실행하기 위해 '필요한 값'을 제공

  • -> 기호는 매개변수를 이용해서 중괄호{}를 실행한다는 뜻

  • ex) (a) -> {System.out.println(a);}

    • 매개변수 타입런타임 시 대입되는 값에 따라 자동으로 인식될 수 있기 때문에 람다식에서는 매개변수의 타입을 일반적으로 언급하지 않는다.

    • 하나의 매개변수만 있다면 괄호()를 생략할 수 있고, 하나의 실행문만 있다면 중괄호{}도 생략 가능

    • 매개변수가 없다면 람다식에서 매개변수 자리가 없어지므로 빈괄호()를 반드시 사용

3. 람다식 타겟 타입

  • 인터페이스 변수 = 람다식;
  • 람다식은 인터페이스 변수에 대입된다.-> 람다식은 인터페이스의 익명 구현 객체를 생성한다는 뜻
  • 인터페이스직접 객체화할 수 없기 때문에 구현 클래스가 필요한데, 람다식은 익명구현 클래스를 생성하고 객체화한다.
  • 람다식이 대입될 인터페이스를 람다식의 타겟타입(target type)이라고 한다.

4. 함수적 인터페이스(@FunctionalInterface)

  • 모든 인터페이스를 람다식의 타겟타입으로 사용할 수 없다.
  • 하나의 추상 메소드가 선언된 인터페이스만이 람다식의 타겟 타입이 될 수 있음 -> 함수적 인터페이스(functional interface)
	@FunctionalInterface
	public static interface RealOperator{/
		public int operate(int leftOp, int rightOp);
	}
  • 두개 이상의 추상 메소드가 선언되지 않도록 컴파일러가 체킹해주는 기능 -> @FuctionalInterface 어노테이션 붙이면 된다
    • 이 어노테이션은 두개 이상의 추상메소드가 선언되면 컴파일 오류 발생

T01_LambdaTest

public class T01_LambdaTest {
	public static void main(String[] args) {

<람다식을 사용하지 않는 경우 >

Runnable인터페이스를 구현한 익명클래스를 이용한 Thread 생성

		Thread th1 = new Thread(
			new Runnable() {// Runnable인터페이스 @FunctionalInterface =>  추상메서드1개  : 아래 run()
							// Runnable쓰고 space바 누르고 run() 자동완성
				@Override
				public void run() {//자동완성  매개변수는 없다
					for(int i =0; i<10; i++) {
						System.out.println(i);
					}
				}
			}
		);
		th1.start();

<람다식을 사용하는 경우>

	Thread th2 = new Thread(
			() -> { // 위에 run()에 매개변수가 없으니까 없다 매개변수가 있는 경우도 있다
				for (int i=0; i<=10; i++) {
					System.out.println("람다-"+i);
				}
			}
	);
	th2.start();
	}
}
profile
HI :)

0개의 댓글