모던 자바 인 액션 18장 : 함수형 관점으로 생각하기

Adam·2024년 7월 15일
0

모던 자바 인 액션

목록 보기
17/20
post-thumbnail

시스템 구현과 유지 보수

공유된 가변 데이터

공유 가변 데이터 구조를 사용하면 프로그램 전체에서 데이터 갱신 사실을 추적하기 어려워진다

순수 메서드: 자신을 포함한 클래스의 상태 그리고 다른 객체의 상태를 바꾸지 않으며 return 문을 통해서만 자신의 결과를 반환하는 메서드

불변 객체: 예상하지 못한 상태로 바뀌지 않아서 스레드 안정성을 제공

선언형 프로그래밍

객체지향 프로그래밍: 어떻게에 집중하는 프로그래밍, 명령형 프로그래밍이라고 부르기도 한다

선언형 프로그래밍: 무엇을에 집중하는 프로그래밍, 우리가 원하는 것이 무엇이고 시스템이 어떻게 그 목표를 달성할 것인지 등의 규칙을 정한다

문제 자체가 코드로 명확하게 드러난다는 점이 선언형 프로그래밍의 강점

왜 함수형 프로그래밍인가?

유지보수하는데 도움을 준다

이유1. 선언형 프로그래밍을 따르는 대표적인 방식

이유2. 부작용 없는 계산을 지향

함수형 프로그래밍이란 무엇인가?

함수: 인수가 같다면 수학적 함수를 반복적으로 호출했을 때 항상 같은 결과가 반환

함수형: 수학의 함수처럼 부작용이 없음

순수 함수형 프로그래밍: 함수 그리고 if-then-else등의 수학적 표현만 사용하는 방식

함수형 프로그래밍: 시스템의 다른 부분에 영향을 미치지 않는다면 내부적으로는 함수형이 아닌 기능도 사용하는 방식

함수형 자바

함수나 메서드는 지역 변수만을 변경해야 함수형

객체의 모든 필드가 final이어야 하고 모든 참조 필드는 불변 객체를 직접 참조해야 한다

메서드 내에서 생성한 객체의 필드는 갱신할 수 있지만 새로 생성한 객체의 필드 갱신이 외부에 노출되지 않아야 하고 다음에 메서드를 다시 호출한 결과에 영향을 미치지 않아야 한다

함수형이라면 함수나 메서드가 어떤 예외도 일으키지 않아야 한다→ Optional을 잘 활용해야 한다

비함수형 동작을 감출 수 있는 상황에서만 부작용을 포함하는 라이브러리 함수를 사용해야 한다

참조 투명성

참조적으로 투명한 함수: 같은 인수로 함수를 호출했을 때 항상 같은 결과를 반환

비싸거나 오랜 시간이 걸리는 연산을 기억화 또는 캐싱을 통해 다시 계산하지 않고 저장하는 최적화 기능도 제공

객체지향 프로그래밍과 함수형 프로그래밍

자바 소프트웨어 엔지니어는 좀 더 함수형에 다가가게 될것

현재 객체지향형과 함수형 프로그래밍을 혼용해서 하는 방식으로 대부분 프로그래밍하고 있음

재귀와 반복

순수 함수형 프로그래밍에서는 반복문을 사용하지 않는다

이론적으로 반복을 이용하는 모든 프로그램은 재귀로도 구현할 수 있는데 재귀를 이용하면 변화가 일어나지 않는다

하지만 재귀 함수를 호출할 때마다 호출 스택에 각 호출시 생성되는 정보를 저장할 새로운 스택 프레임이 만들어지기 때문에 메모리 사용량이 증가한다는 단점이 있다

꼬리 호출 최적화를 사용하면 컴파일러가 하나의 스택 프레임을 재활용할 가능성이 생겨서 보다 효율적으로 재귀를 사용하는 것이 가능

profile
Keep going하는 개발자

0개의 댓글