1.2.1 Declarative and Functional Programming
1.2.1 선언형과 함수형 프로그래밍
선언형 프로그래밍
선언형 프로그래밍(declarative programming)은 프로그램이 무엇을 하는지에 집중하는 패러다임입니다. 즉, 프로그램의 목적을 명확히 기술하며, 구현 세부 사항은 감추는 방식입니다. 이는 절차적 프로그래밍과 대조되는 개념으로, 절차적 프로그래밍은 어떻게 할 것인지에 집중합니다. 선언형 프로그래밍의 주요 특징은 코드가 더 간결하고 직관적이라는 점입니다.
선언형 프로그래밍 예시
스프링 부트(Spring Boot)에서는 데이터베이스에서 데이터를 조회하고 이를 REST API로 제공하는 예시를 보겠습니다.
엔티티(Entity) 클래스
리포지토리(Repository) 인터페이스
서비스(Service) 클래스
컨트롤러(Controller) 클래스
위 예시에서 각 클래스는 특정 역할에 집중하여 선언형 방식으로 작성되었습니다. 리포지토리 클래스는 데이터베이스 액세스를, 서비스 클래스는 비즈니스 로직을, 컨트롤러 클래스는 HTTP 요청 처리를 담당합니다.
함수형 프로그래밍
함수형 프로그래밍(functional programming)은 선언형 프로그래밍의 한 종류로, 프로그램을 함수의 집합으로 구성하는 패러다임입니다. 함수형 프로그래밍의 핵심은 순수 함수와 고차 함수입니다.
순수 함수 (Pure Function)
순수 함수는 동일한 입력에 대해 항상 동일한 출력을 반환하며, 함수 외부의 상태를 변경하지 않는 함수입니다. 이는 함수형 프로그래밍의 기본 단위이며, 코드의 예측 가능성과 안정성을 높입니다.
순수 함수 예시
스프링 부트 프로젝트에서 순수 함수의 예시는 다음과 같습니다.
위 예시에서 MathUtils
클래스의 add
와 multiply
메서드는 모두 순수 함수입니다. 동일한 입력에 대해 항상 동일한 출력을 반환하며, 외부 상태를 변경하지 않습니다.
고차 함수 (Higher-Order Function)
고차 함수는 함수를 인자로 받거나 함수를 반환하는 함수입니다. 이는 함수형 프로그래밍의 중요한 특징 중 하나로, 코드의 재사용성을 높이고 모듈화를 용이하게 합니다.
고차 함수 예시
다음은 스프링 부트 프로젝트에서 고차 함수를 사용하는 예시입니다.
DiscountService
클래스의 getDiscountFunction
메서드는 할인율을 인자로 받아 가격에 적용하는 함수를 반환합니다.
컨트롤러에서의 사용
위 예시에서 applyDiscount
메서드는 DiscountService
의 고차 함수를 사용하여 주어진 가격에 할인율을 적용합니다.
함수형 프로그래밍의 특징
불변성 (Immutability)
함수형 프로그래밍에서는 데이터의 불변성을 강조합니다. 이는 상태 변경을 피하고, 데이터를 변경할 필요가 있을 때는 기존 데이터를 복사하여 새로운 데이터를 생성합니다.
불변성 예시
위 예시에서 applyDiscount
메서드는 원본 리스트 products
를 변경하지 않고, 각 제품에 할인율을 적용한 새로운 리스트를 반환합니다.
고차 함수의 사용
고차 함수는 함수형 프로그래밍에서 빈번하게 사용됩니다. 이는 코드의 재사용성과 가독성을 높이는 데 도움이 됩니다.
고차 함수 사용 예시
위 예시에서 filterProducts
메서드는 Predicate
를 인자로 받아, 해당 조건을 만족하는 제품만을 필터링하여 반환합니다.
함수형 프로그래밍의 장점
모듈화: 함수 단위로 프로그램을 분할하여 재사용성과 유지보수성을 높입니다.
예측 가능성: 순수 함수의 사용으로 함수의 결과를 예측할 수 있습니다.
테스트 용이성: 순수 함수는 독립적이기 때문에 테스트가 용이합니다.
병렬 처리: 상태를 변경하지 않으므로 병렬 처리와 같은 최적화가 용이합니다.
함수형 프로그래밍의 단점
학습 곡선: 함수형 프로그래밍의 개념을 이해하고 익히는 데 시간이 걸릴 수 있습니다.
실행 성능: 불변성을 유지하기 위해 데이터를 복사하는 과정에서 실행 성능이 저하될 수 있습니다.
디버깅 어려움: 함수가 중첩되거나 고차 함수가 많이 사용될 경우 디버깅이 어려울 수 있습니다.
결론
함수형 프로그래밍은 선언형 프로그래밍의 한 종류로, 순수 함수와 고차 함수를 중심으로 프로그램을 구성하는 패러다임입니다. 이는 코드의 재사용성, 가독성, 예측 가능성을 높이며, 병렬 처리와 같은 최적화에도 유리합니다.
Last updated