[키워드]
익명 클래스 / 람다 / 함수형 프로그래밍 / @FunctionalInterface / 스트림 API / 메소드 레퍼런스
[질문]
- 자바의 람다식은 왜 등장했을까?
- 람다식과 익명 클래스는 어떤 관계가 있을까? - 람다식의 문법은 어떻게 될까?
[키워드]
- 익명클래스
- 익명 클래스는 내부 클래스(Inner class)일종으로 이름없는 클래스를 의미한다.
- 익명, 이름이 없다는 것은 다시 불러질 이유가 없다는 뜻을 내포한다.
- 프로그램에서 일시적으로 한번만 사용되고 버려지는 객체인 것이다(일회용 클래스)
- 보통 클래스의 자원을 상속받아 재정의하여 사용하기 위해서는 먼저 자식이 될 클래스를 만들고 상속(extends)후에 객체 인스턴스 초기화를 통해 가능하다.
- 하지만 익명 클래스는 클래스 정의와 동시에 객체를 생성할 수 있다.
- UI이벤트처리, 스레드 객체 등 단발성 이벤트 처리에 자주 이용된다.
- 람다
- 람다 표현식(Lambda Expression)이란 함수형 프로그래밍을 구성하기 위한 함수식이며, 간단히 말해 자바의 메소드를 간결한 함수식으로 표현한 것이다.
- 자바에서 메서드를 하나 표현하려면 클래스를 정의해야 했다. 하지만 람다식으로 표현하면 메서드의 이름과 반환값을 생략할 수 있고 이를 변수에 넣어 자바 코드가 매우 간결해지는 장점이 있다.
int add(int x, int y) {
return x + y;
}
// 위의 메서드를 람다 표현식을 이용해 아래와 같이 단축 시킬수 있다. (메서드 반환 타입, 메서드 이름 생략)
(int x, int y) -> {
return x + y;
};
// 매개변수 타입도 생략 할 수 있다.
(x, y) -> {
return x + y;
};
// 함수에 리턴문 한줄만 있을 경우 더욱 더 단축 시킬 수 있다. (중괄호, return 생략)
(x, y) -> x + y;
-
함수형 프로그래밍
- 함수형 프로그래밍은 하나의 프로그래밍 패러다임으로 정의되는 일련의 코딩 접근 방식이다
- 자료처리를 수학적 함수의 계산으로 취급하고 상태와 가변데이터를 멀리하는 프로그래밍 패러다임을 의미한다.
- 함수형 프로그래밍 언어로 설계된 클로저, 스칼라, 하스켈 등이 있다.
- 자바스크립트, 코틀린, 파이썬 등에도 함수형 프로그래밍 문법이 추가되고 있다.
-
@FunctionalInterface
- 함수형 인터페이스는 추상메서드가 1개만 정의된 인터페이스를 통힝하여 일컫는다. 이 인터페이스 형태의 목적은 자바에서 람다 표현식을 이용해 함수형 프로그래밍을 구현하기 위해서다.
- @FunctionalInterface 어노테이션을 인터페이스에 붙여주면 두개 이상의 메소드 선언 시 컴파일 오류를 발생시켜 실수를 줄여준다.
-
스트림 API
- 자바에서 배열이나 컬렉션을 사용할 떄 여기에 저장된 데이터에 접근하기 위해서는 반복문이나 반복자(Iterator)를 사용하여 데이터에 접근해야 했다.
- 그렇기 때문에 코드가 너무 길어지고 가독성도 떨어지고, 재사용이 거의 불가능한 상태의 코드가 만들어진다.
- 이런 문제점을 극복하기 위해 나온게 스트림API이다
- 보다 간결해지고, 데이터 소스에 대한 공통된 접근 방식을 제공하기 때문에 자주사용된다.
- 주요특징
- 원본 데이터를 변경하지 않는다.
- 내부 반복(internal iteration)을 통해 작업을 수행한다.
- 단 한번만 사용할 수 있다.
-
메소드 레퍼런스
- 미소드 참조(Method Reference)는 말 그대로 실행하려는 메소드를 참조해서 매개 변수의 정보 및 리턴 타입을 알아내어, 람다식에서 굳이 선언이 불필요한 부분을 생략하는 것을 말한다.
- 람다식은 복잡하고 길다란 로직보다 기존 메소드들을 단순히 호출만 하는 경우가 많다.
- 다음 함수의 형태를 :: 를 사용해서 줄여준다.
(x, y) -> Math.max(x, y)
Math::max; // (x, y) -> Math.max(x, y)
[질문]