티스토리 뷰
1. 람다 표현식(lambda expression)이란?
함수형 프로그래밍 언어에서 사용되는 개념으로 익명함수라고도 한다
Java 8 부터 지원되며, 불필요한 코드를 줄이고 가독성을 향상시키는 것을 목적으로 두고 있다
표현법
(매게변수, ...) -> {함수 실행문};
람다 표현식 작성 시 유의 사항
- 기본적인 람다 표현식의 표현법은 매게변수 화살표 함수몸체 입니다 : (매게변수, ...) -> {함수몸체}
- 매게변수가 하나일 경우 매게변수를 생략 할 수 있다 : () -> {함수몸체}
- 함수몸체가 단일 실행문이면 괄호({})를 생략할 수 있다 : (매게변수 ,...) -> 함수몸체
- 함수몸체가 return 문으로만 구성되어 있는 경우 괄호({})를 생략할 수 없다 : (매게변수,...) -> {return 0;}
람다 표현식의 장점
- 코드의 라인수가 줄어든다
- 병렬처리가 가능하다
람다 표현식의 단점
- 람다식의 호출이 까다롭다
- 람다 stream 사용 시 단순 for 문 혹은 while 문 사용시 성능이 떨어진다
- 불필요하게 너무 사용되면 오히려 가독성을 떨어 뜨릴 수 있다
람다식 예제
- 기존 자바 문법
// 인터페이스 정의
public interface Goods {
public void doSome();
}
//인터페이스를 상속받아 메소드 오버라이드
public class Computer implements Goods{
@Override
public void doSome(){
System.out.println("Computer is Running!!");
}
}
//인터페이스를 상속받아 메소드 오버라이드2
public class Youngji implements Goods {
@Override
public void doSome(){
System.out.println("Youngji is studying!!");
}
}
public class Main{
public static void main(String args[]){
Goods com = new Computer();
com.dosome(); //객체를 선언하여 메소드를 실행
Goods young = new Youngji();
young.doSome();
}
}
메소드의 다형성을 제공하기 위해 interface를 생성하고 Computer 과 Youngji Class에 interface를 상속받아 메소드를 오버라이드한다.
그리고 interface 타입의 Class들의 객체를 생성한 뒤 메소드를 참조하여 사용했다. 메소드를 반복하여 사용해야 하는 경우 위의 코드를 반복하게 되고 그러면 지저분한 코드가 될 것이다
2. 람다식 사용
@FunctionalInterface
public interface Goods {
void doSome();
}
public class Main{
public static void main(String args[]){
Goods com = () -> System.out.println("Computer is Running!!");
Goods young = () -> System.out.println("Youngji is stduying!!");
}
}
하지만 람다식을 사용하는 경우 위의 코드와 같이 아주 간결하게 표현됨을 볼 수 있다
위의 코드처럼 람다식을 매게변수에 대입하여 사용할 경우 람다식의 타입을 정의해야 하는데 이는 함수형 인터페이스로 정의한다
위에 Goods가 함수형 인터페이스이다
함수형 인터페이스란?
일반적으로 구현해야 할 추상 메소드가 하나만 정의된 인터페이스를 뜻한다
이러한 함수형 인터페이스는 람다식의 타입으로 사용된다
즉 람다 표현식을 변수에 대입하기 위해서는 람다 표현식의 타입이 필요한데 이는 함수형 인터페이스가된다
- 오라클 문서 인용 -
Functional interfaces provide target types for lambda expressions and method references.
함수형 인터페이스에 하나의 추상 메소드만 정의되어 있는 이유 - 어떤 식을 람다식으로 표현했는지 알수 없다(익명 함수이기 때문에)
함수형 인터페이스 어노테이션을 사용한다면 컴파일 타임에 알아서 에러를 잡아준다
-> @FunctionalInterface
예) 추상 메소드가 두개 이상 작성된 경우 알아서 에러를 띄워준다
'Java' 카테고리의 다른 글
[Java] - super(), this() (0) | 2020.10.10 |
---|---|
[Java] - 배열(Array)과 리스트(List) 에 대하여 (0) | 2020.09.03 |
[Java] - War, Jar의 차이 (0) | 2020.08.23 |
[Java 8] - Stream Api (0) | 2020.08.08 |
[Java] - 자바 특징 및 실행과정 (0) | 2020.07.28 |