람다표현식
27 Jan 2019 | lambda자바람다식 = 익명함수 = 자바(익명메소드,익명객체를 말합니다)
람다식은 일반적으로 익명함수를 뜻한다
- 익명함수는 말그대로 이름이 없는 함수이다 ( 다른 말로는 1급 객체라고 말한다. )
- 반대의 뜻으로 선언적함수가 있다. 함수의 이름을 선언하는걸 선언적 함수라고 한다.
그럼 1급 객체의 조건은 무엇인가
- 변수(variables)에 담을수 있다.
- 인자(parameter)로 전달할 수 있다.
- 반환값(return)값으로 전달할 수 있다.
- 자바에서 1급 시민은 객체입니다. 객체는 변수에 담을수 있고, 인자로 전달 될 수 있으며, 반환값으로 전달될 수 있습니다.
- 즉 언어들중 람다표현법을 사용하는 언어들은 서로 비슷한 형태의 1급 시민을 가지고 있습니다.
자바에서 인터페이스중 메소드를 하나만 가지고 있는 인터페이스를 함수형 인터페이스 = 람다 인터페이스라고 부릅니다.
- 자바에서 메소드만 매개변수로 전달할수 없기 때문에 객체를 인스턴스로 만들어서 전달합니다.
- 그렇기 때문에 만약 객체가 아닌 구현하고 싶은 메소드만 전달 할 수 있었다면 얼마나 좋았을까?
- 이런 이유로 도입된 것이 자바 8부터 지원이 가능한 람다식입니다.
// 기존 표현식
new Thread(new Runnable() {
@Override
public void run() { // Runnable 인터페이스 있는 run 메소드 오버라이딩해서 실행합니다.
System.out.println("Hello World.");
}
}).start();
// 람다표현식
new Thread(()->{
// new Runnalbe() { @Override run 메소드 구현 하는 부분이 사라졌습니다.
// 이게 가능한 이유는 Runnable이 한개의 메소드만 가진 함수형 인터페이스 이기 때문에 가능합니다.
// 즉 기본적으로 람다식을 위한 인터페이스에서 추상 메소드는 반드시 하나여야합니다.
// 예외로 Object로 상속받는 equals, compareTo, toString 등등은 추상메소드와 같이 사용할 수 있습니다.
System.out.println("Hello World.");
}).start();
- 또한
@FunctionalInterface
어노테이션을 사용하면, 해당 인터페이스에 메소드가 2개 이상 선언되면 - 에러가 발생합니다.
금일 공부한 키워드
- 리플렉션 ( 스프링에서 구현하고 있는 자바기술 -> xml config파일 설정을 읽어오거나 DI 컨테이너를 구현하는 기술 )
- 프록시
- 람다표현식
- 다이나믹 프락시 ( 스프링 AOP에서 프록시 기반의 기술을 구현하고 있습니다 )
- 1급 객체
Comments