Functional Programing
함수형 프로그래밍은 다음과 같은 개념을 중시합니다.
순수 함수
- 동일한 입력을 받으면 항상 동일한 출력을 반환하고, 외부 상태를 변경하거나 부작용(side-effect)을 일으키지 않는 함수를 핵심으로 합니다.
불변성
- 데이터가 생성된 후에는 그 상태를 변경하지 않는 것을 중요하게 여깁니다.
데이터 변경 대신 새로운 데이터를 생성합니다.
1급 시민 함수
- 함수를 변수에 할당하거나, 다른 함수의 인자로 전달하거나, 함수의 반환 값으로 사용할 수 있습니다.
고차 함수
- 함수를 인자로 받거나 함수를 반환하는 함수를 사용합니다.
선언형 프로그래밍
- "어떻게"를 명시하기보다는 "무엇"을 계산할지를 설명하는 데 집중합니다.
이를 통해 다음과 같은 효과를 기대합니다.
- 높은 코드
가독성 및 유지보수성
- 순수 함수는 예측 가능하고 독립적이어서 이해하고 테스트하기 쉽습니다.
불변성은 코드의 안정성을 높여줍니다.
쉬운 테스트
- 순수 함수는 외부 상태에 의존하지 않으므로 격리된 환경에서 쉽게 테스트할 수 있습니다.
병렬 처리 용이성
- 불변성은 여러 스레드에서 동시에 데이터에 접근해도 안전하게 만들어 병렬 처리를 용이하게 합니다.
부작용이 없기 때문에 공유 자원에 대한 동기화 문제를 줄일 수 있습니다.
- 코드
재사용성 증대
- 작은 순수 함수들을 조합하여 더 복잡한 로직을 구축할 수 있어 코드 재사용성이 높아집니다.
엄격한 타입 시스템과의 궁합
- 많은 함수형 언어는 강력한 정적 타입 시스템을 가지고 있어 컴파일 시 에러를 줄이고 코드의 안정성을 높입니다.
✅ Java 에 Lambda 를 도입하면서 함수형 프로그래밍의 장점들을 활용할 수 있게 되었습니다.
Lambda & static method
❓ 람다식은 왜 static method 가 아니라 instance method 일까요?
람다식은 함수형 인터페이스에 정의된 abstract method 를 구현하는 익명 클래스의 인스턴스를 참조하는 것과 같습니다.
즉, 람다식을 사용하는 것은 이 추상 메서드를 인스턴스 메서드로 Overriding 하는 것입니다.
그렇다면 람다식을 사용하면서 구현 혹은 정의한 이 메서드는 인스턴스 멤버를 사용하는 일이 없고, 따라서 static method 가 되는 것이 더 자연스러운 것 아닐까요?
람다식이 instance method 인 이유는 다음과 같이 생각해 볼 수 있습니다.
-
함수형 인터페이스의 확장성을 위해서
- 인터페이스에서 정의될 수 있는 메서드는 default, static, abstract 3종류입니다.
- 만약 람다식이 static method 를 구현하는 방식이 되었다면, 함수형 인터페이스에는 더이상
static method 가 추가될 수 없습니다.
-
인터페이스의 목적과 일관성을 위해서
- 인터페이스의 본래 목적은
abstract method 의 집합입니다.
default, static 은 편의를 위해 이후에 추가된 개념입니다.
- 또한
익명 클래스는 이 인터페이스의 구현체의 인스턴스를 생성하니 인스턴스 메서드를 호출하는 것이 일관성이 있습니다.
-
Capturing 을 위해서
- Capturing 을 통해 람다식에서도
인스턴스 변수같은 기능을 사용할 수 있습니다.
익명 클래스가 외부 클래스의 멤버나 지역변수(final or effectively final)를 사용하듯 람다식도 사용 가능합니다.
- 내부 클래스의 static method 는 외부 클래스의 인스턴스 멤버를 사용할 수 없기에 람다식이 static method 가 된다면 Capturing 이 불가능해집니다.