자바 초기부터 존재해있던 익명 클래스는 코드의 간결성, 단순한 로직구현및 인터
페이스를 간단하게 구현등의 생산성 상승의 장점을 가지고 사용했다.
장점
1. 클래스를 정의하고 구현하는 과정을 간결하게 처리가 가능하다.
인터페이스 구현시 클래스를 따로 정의하지 않고도 바로 구현이 가능하다. 특히 하나의 메서드만 정의되어 있을 때 유용하다.
익명 클래스 생성시 추가적인 클래스 파일의 생성이 필요치 않아 프로젝트 구조를 단순하게 유지가 가능하다.
단점
1. 익명 클래스의 경우 많이 사용되고 코드가 길어질수록 되려 코드의 가독성을 헤칠수가있다.
클래스의 이름이 명확하지가 않아 디버깅시 스택 트레이스에서도 클래스의 이름이 정확히 명시되지 않을 수 있다.
익명 클래스는 한 번만 사용되므로 재사용이 어렵다. 만약 비슷한 로직을 여러 곳에서 사용해야 한다면 익명 클래스 대신 별도의 클래스로 분리하는 것이 좋습니다.
외부에서 익명 클래스에 접근하거나 모의 객체(Mock Object)를 만들기가 어렵다.
코드의 간결성을 위해 사용하던 익명 클래스는 사용할수록 되려 코드의 가독성이 떨어지고 작성해야하는 코드의 양이 늘어나는 단점이 있었다.
이를 개선하고자 자바 8에서 탄생한것이 람다식이며, 람다식이란 함수를 하나의 식으로 표현한 것이다. 또한 함수형 프로그래밍을 지원하기 위해 함수를 매개변수로 넘겨줄 수 있다는 특징도 가지게 되었다.
장점
1. 코드를 간결하게 만들 수 있다.
식에 개발자의 의도가 명확히 드러나 가독성이 좋아진다.
함수를 만드는 과정이 없어 생산성이 증가한다.
컴파일러가 람다식의 파라미터 타입을 유추할 수 있기 때문에 타입을 명시적으로 지정할 필요가 없습니다.
단점
1. 람다식 역시 이름이 없는 익명 함수이기에 디버깅 자체는 여전히 어렵다.
여러 줄의 코드 블록을 포함하는 경우에는 코드의 의도를 파악하기 어려울 수 있다.
람다식은 내부적으로 클래스를 생성하고 인스턴스를 생성하기에 메모리 사용량이 증가할 가능성이 있습니다.
함수형 프로그래밍이란 객체지향 프로그래밍처럼 하나의 프로그래밍 패러다임이다.
시대가 변하고 기술이 발전할수록 CPU의 성능은 발전하고 2코어, 4코어, 8코어 이처럼 늘어남에 따라 효율적인 병렬처리에 대한 요구가 증가했다.
그래서 함수형 프로그래밍에 대한 관심도가 높아지게 되었고 자바에서도 이러한 요구에 걸맞춰 함수형 프로그래밍을 지원하기 위해 만들어진 것이 람다식, 람다식을 보조하기 위해 만들어진 것이 함수형 인터페이스 이다.
특징
1. 불변(Immutability)
- 불변인 함수는 부수 효과(side effect)가 없다.
- 불변이기에 같은 값을 넣으면 항상 같은 값을 준다는 것을 보장할 수 있다.
- 불변이기에 상태를 갖지 않는다. 상태를 갖지 않기에 병렬처리에 유리하다.
- 외부 환경에 영향을 받지 않는 함수를 함수형 프로그래밍에서 "순수 함수 (Pure function)" 이라고 불러준다.
일급 함수
함수를 매개변수로 넘길 수 있어야 한다.
함수를 리턴값으로 던질 수 있어야 한다.
함수를 변수나 자료구조에 담을 수 있어야 한다
고차 함수
함수의 인자로 함수를 받을 수 있어야 한다
함수의 리턴 값으로 함수를 던질 수 있어야 한다
함수의 합성
lazy 평가
메서드를 한 개만 가지는 인터페이스이다. 이는 추상 메서드가 람다식과 일대일로 매칭이 되어야 하기 때문이므로 추상 메서드가 2개 이상이라면 함수형 인터페이스가 아니다. 람다식이 어떤 추상 메서드를 구현한 것인지 알 수 없기 때문이다. 이는 람다식이 아니라 익명 클래스로 쓰인다.
*자바에서 람다식을 다룰 수 있는 유일한 도구
*@FunctionalInterface 함수형 인터페이스임을 표시하는 어노테이션으로 붙이지 않아도 작동하나 컴파일러의 도움을 받기위해서는 표시해주어야 한다.
Java는 객체지향 언어로 함수형 프로그래밍을 지원하지 않는다. 하지만 Java8 부터 Stream API와 람다식, 함수형 인터페이스 등을 지원하면서 Java를 이용해 함수형으로 프로그래밍할 수 있는 API 들을 제공해주고 있다. 그 중에서 Stream API는 데이터를 추상화하고, 처리하는데 자주 사용되는 함수들을 정의해두었다. 여기서 데이터를 추상화하였다는 것은 데이터의 종류에 상관 없이 같은 방식으로 데이터를 처리할 수 있다는 것을 의미하며, 그에 따라 재사용성을 높일 수 있다.
참고 자료
https://www.inflearn.com/course/%EC%9E%90%EB%B0%94-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%EC%84%9C%EB%B2%84%EA%B0%9C%EB%B0%9C-%EC%98%AC%EC%9D%B8%EC%9B%90/dashboard
https://mangkyu.tistory.com/112
https://sedangdang.tistory.com/289