함수형 프로그래밍과 객체 지향 프로그래밍의 교집합
경계의 구분 관점
내부 세계와 외부 세계를 구분한다.
함수형
함수형은 데이터, 순수 함수, 비순수함수로 나눠지며, 순수 함수와 비순수 함수의 경계를 구분한다.
비순수 함수는 외부 세계라고 볼 수 있고, 순수 함수는 내부 세계라고 볼 수 있다.
이는 비순수 함수는 같은 입력에도 실행 시점이나 호출 횟수에 따라 다른 결과가 나오기 때문이다.
함수형 프로그래밍은 외부 세계와의 상호작용을 비순수함수에 격리한다.
객체지향
- 핵심 로직 : 순수 함수를 포함한 비즈니스 로직
- 인프라스트럭쳐(외부 시스템 연동) : 비순수 함수를 포함한 외부 세계와의 상호작용
- 비순수 부분을 인터페이스로 추상화
public class OrderService {
private final OrderRepository repository; // 비순수 함수 영역
// 순수 함수와 비순수 함수 영역이 명확하게 분리된다.
public Order processOrder(Order order) {
// 순수 함수 영역: 비즈니스 로직
Order validatedOrder = order.validate();
Order calculatedOrder = validatedOrder.calculateTotals();
// 비순수 함수 영역: 외부 상호작용
return repository.save(calculatedOrder);
}
}
객체지향에서 객체는 외부 세계로부터 분리되어있으며, 상호작용한다.
객체는 내부 상태를 입력으로 받아, 새로운 상태를 반환한다는 점에서 순수 함수라고 볼 수 있다.
불변 객체일 경우 순수 함수의 특성을 더욱 만족한다.
외부세계에서 데이터베이스에 접근하거나, 외부 서비스와 통신하는 등 상태에 의존하는 작업은 비순수 함수와 닮았다.
예측 가능한 코드 관점
- 함수형 : 순수 함수의 조합으로, 버그 없이 예측 가능한 코드를 만든다.
- 객체지향 : 역할에 따라 객체를 만들어 캡슐화한다.
- 객체와 관련된 코드가 하나로 뭉친다. 그에 따라 객체의 상태를 내부에서 결정할 수 있다.
의존성(부작용) 분리 관점
- 함수형 프로그래밍은 최대한 비순수 함수(계산)을 쪼개어 순수 함수와 데이터로 분리한다. 비순수 함수는 복잡한 부작용을 관리한다.
- 객체지향은 객체로부터 의존성을 추상화하여 분리한다. 객체를 직접 의존하기 보다 인터페이스를 의존하도록 하여 확장성을 높이고 테스트를 용이하게 한다.
순수 함수와 객체는 모두 테스트하기 쉽다.
느낀점
우테코에서 람다를 학습하면서, 람다는 java에서 함수형 프로그래밍을 도입하기 위한 것이라는 것을 알게 되었다.
그런데 함수형 프로그래밍이 와닿지 않아서, 글을 읽다보니 프로그램을 과연 순수 함수의 조합만으로 만들 수 있을까? 라는 의문이 들었다.
따라서 함수형 코딩이라는 책을 읽게 되었는데, 함수형 프로그래밍을 실용적인 관점에서 바라볼 때 비순수 함수와 순수 함수를 모두 사용하고, 순수 함수로 분리하는 기술들이 많은 개발 방식임을 알게 되었다.
또한 함수형 프로그래밍은 객체 지향과 대척점에 있는 것이 아닌, 객체 지향 프로그래밍을 하면서 적용할 수 있는 개념이라는 것을 깨달았다.
함수형 프로그래밍에 대한 지식과 기술을 통해 순수 함수적 특성과 불변성을 추구하면서 개발할 수 있을 것 같다. (그렇게 되려면 더 공부가 필요할 것 같다..)
그런 관점에서 지금까지 공부해왔던 객체 지향 프로그래밍과 새로 알게된 함수형 프로그래밍의 교집합을 정리해보았다.
'설계' 카테고리의 다른 글
함수형 프로그래밍이란? (0) | 2025.02.21 |
---|---|
인터페이스, 추상 클래스, 합성 사용 시점 (6) | 2024.12.02 |
[오브젝트] 상속과 다형성 (2) | 2024.12.01 |
[오브젝트] 객체 지향 설계 (0) | 2024.12.01 |
[설계] Okky ERD 분석하기 (0) | 2024.04.26 |