• 수학의 람다식
x, y의 값을 계산하는 수학 함수 f를 람다식으로 변환해보자.
f(x, y) = x + y // x, y의 합을 구하는 수학의 함수
함수의 이름을 제거하고 간소하게 표현된다.
(x, y) -> x + y
수학에서 람다식은 이름 없는 함수를 뜻한다.
아래와 같이 괄호와 함께 x와 y에 대입될 값을 지정하면 계산이 이루어진다.
((x, y) -> x + y)(2, 3)
= 2 + 3
= 5
• 자바의 람다식
자바에서는 함수를 메소드라고 부른다.
• 람다식 구조
매개변수 리스트
함수에 전달되는 매개변수를 나열한다
생략 시, 컴파일러가 추론하여 알아서 처리한다.
매개변수가 1개인 경우, 괄호를 생략할 수 있다.
애로우 토큰 ( -> )
매개변수 리스트와 함수 코드를 분리시키는 역할이다.
매개변수들을 전달하여 함수 바디 { }에 작성된 코드를 실행한다.
함수 바디
함수의 코드로 중괄호 { }로 표현한다.
• 람다식 사례
매개변수로 정수 값 나이를 받아 출력
(int age) -> { System.out.println("나이는" + age); }
매개변수 타입 생략 가능
(age) -> { System.out.println("나이는" + age); } // int 타입 생략
매개변수가 한개인 경우 괄호 생략 ()
함수 바디가 한 문장인 경우 중괄호를 생략 {}
age -> System.out.println("나이는" + age); // ()와 {} 생략
return문에서의 람다식
매개변수 x, y의 값을 합하여 리턴하는 경우,
(x, y) -> { return x + y; } // 합을 리턴하는 람다식
다음과 같은 return문의 경우 오류를 발생
(x, y) -> return x + y; // 오류. {} 생략 안됨
// return 문을 가진 함수에 중괄호를 생략할 수 없음
return문을 생략 가능한 경우,
(x, y) -> x + y; // return 생략 가능. x+y의 합을 리턴하는 람다식
• 람다식 생성 및 호출
람다식은 함수형 인터페이스를 구현한 객체이다.
함수형 인터페이스에 선언된 추상 메소드를 구현하는 방식이다.
1. 함수형 인터페이스 작성
추상 메소드 clac() 한 개만을 가진 함수형 인터페이스
interface MyFunction { //함수형 인터페이스
int calc(int x, int y); // 추상 메소드
}
2. 함수형 인터페이스의 추상 메소드를 람다식으로 구현
함수형 인터페이스의 추상 메소드에 코드를 작성한다.
인터페이스를 상속받은 클래스에 익명 클래스를 만드는 방식이다.
생성된 객체 안에는 clac(x, y) 메소드가 다음과 같이 구현된다.
int calc(int x, int y) {return x + y;)
3. 람다식 호출
레퍼런스 변수 f를 이용하면 람다식을 호출할 수 있다.
정수 1, 2를 매개변수로 주어 람다식을 호출하고 리턴한 값 3을 출력한다.
System.out.println(f.calc(1, 2));
• 함수형 인터페이스
주석문을 사용한다.
함수형 인터페이스 앞에 @를 사용하여 컴파일러에게 함수형 인터페이스임을 알릴 수 있다.
인터페이스가 추상 메소드가 1개만 있는 함수형 인터페이스인지 확인하도록 하여, 처음부터 잘못된 인터페이스 작성을 막는 장점이 있다.
@FunctionalInterface
interface MyFunction {
int calc(int x, int y);
}
인터페이스가 2개의 추상 메소드를 가지고 있는 경우이다.
@FunctionalInterface
interface MyFunction { // 컴파일 오류 발생
int calc(int x, int y);
void print();
}
제네릭 함수형 인터페이스
함수형 인터페이스를 제네릭 타입으로 만들고, 람다식에 String 타입과 Integer 타입을 각각 매개변수로 넘길 수 있다.
@FunctionalInterface
interface MyFunction<T> { // 제네릭 타입 T를 가진 함수형 인터페이스
void print(T x); // 람다식으로 구현할 추상 메소드
}
public class LambdaEx5 {
public static void main(String[] args) {
MyFunction<String> f1 = (x) -> System.out.println(x.toString());
f1.print("ABC"); // String 객체를 람다식에 넘겨준다.
MyFunction<Integer> f2 = (x) -> System.out.println(x.toString());
f2.print(Integer.valueOf(100)); // Integer 객체를 람다식에 넘겨준다.
}
}
ABC 100
'CS > 객체지향프로그래밍' 카테고리의 다른 글
[객체지향프로그래밍] #8 Nested Classes (0) | 2024.06.13 |
---|---|
[객체지향프로그래밍] #7 제네릭과 컬렉션 (0) | 2024.06.13 |
[객체지향프로그래밍] #6 모듈과 패키지 (0) | 2024.06.09 |
[객체지향프로그래밍] #5 상속 (0) | 2024.04.25 |
[객체지향프로그래밍] #4 클래스와 객체 (0) | 2024.04.21 |