상세 컨텐츠

본문 제목

[JAVA] 함수형 프로그래밍 이란? (Functional Programming)

Programming language/자바

by choiDev 2018. 12. 25. 13:05

본문


함수형 프로그래밍 정의

함수의 입력만을 의존하여 출력을 만드는 구조로 외부에 상태를 변경하는 지양하는 패러다임의 부작용 발생을 최소화하는 방법론이라 할 수 있다.

함수형 프로그래밍의 원칙

- 입출력이 순수해야 합니다. (순수 함수)

- SideEffect가 없어야 합니다.

- 함수와 데이터 중점으로 생각합니다.

함수형 프로그래밍의 목적

1. 변경 가능한 상태를 불변 상태로 만들어 SideEffect를 없애자

2. 모든 것은 객체이다.

3. 코드를 간결하게 하고 가독성을 높여 구현할 로직에 집중 시키자

4. 동시성 작업을 보다 쉽게 안전하게 구현하자.


1. 변경 가능한 상태를 불변 상태를 만들어 SideEffect를 차단

변수보단 상수를 사용해 SideEffect를 차단

2. 모든 것은 객체이다.

- 함수형 언어에서는 모든 것이 객체이다.

- 클래스 외에 함수 또한 객체이기 때문에 함수를 값으로 할당할 수 있다.

- 파라미터로 전달 및 결괏값으로 반환이 가능합니다.

위 3가지를 만족하는 객체를 1급 객체라고 합니다. 자바 8 이전 함수는 위 3가지를 만족시키지 못하여 함수가 1급 객체가 아니었지만 함수형 프로그래밍 언어에서는 3가지 조건을 만족시켜 함수가 1급 객체입니다.

3. 코드를 간결하게 하고 가독성을 높여 구현할 로직에 집중 시키자.

람다 및 컬렉션, 스트림과 같은 API를 통해 보일러 플레이트 코드를 제거하고, 내부에 직접적인 함수 호출을 통해 가독성을 높일 수 있습니다. 또한 보일러 플레이트 코드를 제거함으로써 일을 위한 일들이 줄어들어 실제 구현할 로직에만 집중 가능합니다.

4. 동시성 작업을 보다 쉽게 안전하게 구현하자

불변 상태의 값을 사용해, 여러 스레드에서 접근하더라도 SideEffect를 발생시키지 않습니다. 또한 Lock, UnLock 같은 보호장치도 필요 없습니다.


단어 정리

순수 함수 (Pure Function)

부작용이 없는 함수로 함수의 실행이 외부의 상태를 변경시키지 않는 함수를 의미한다.

순수한 함수는 멀티 스레드 환경에서도 안전하고, 병렬처리 및 계산이 가능하다.

오직 입력에 의해서만 출력이 정해지고, 환경이나 상태에 영향을 받아서는 안된다는 의미이다.

보일러 플레이트 코드(상용구 코드)

수정하지 않거나 최소한의 수정만을 거쳐 여러 곳에 필수적으로 사용되는 코드

이와 같은 코드는 최소한의 작업을 하기 위해 많은 분량의 코드를 작성해야 하는 언어에서 자주 사용한다.

SideEffect

쉽게 말해서 실행 중에 어떤 객체를 접근해서 변화가 일어나는 행위(라이브러리 I/O, 객체 변경 등)입니다.

예제

X = 3+4;

위 표현식에는 1개의 side Effect가 있습니다.

Y = x++;

위 표현식에는 2개의 side 이펙트가 있습니다.

3 + 4

위 표현식은 side effect가 없습니다.

If (flag) {

Foo()

}

위 표현식은 flag가 true 일 경우에 한해서 잠재적 side effect가 있습니다.

1급 객체

아래와 같은 조건을 만족하는 객체

- 변수나 데이터 구조안에 담을 수 있다.

- 파라미터로 전달 할 수 있다.

- 반환값으로 사용 할 수 있다.

- 할당에 사용된 이름과 관계없이 고유한 구별이 가능하다.

- 동적으로 프로퍼티 할당이 가능하다.

관련글 더보기