함수형 프로그래밍(Functional Programming)이란?
자료를 찾아보면서 이해하기 가장 좋았던 예시는 파이프라인이었다. 아래는 설명 전 이해를 돕기 위해한 자료로 , 내가 생각하는 함수형 프로그래밍의 기본 틀을 그림으로 표현한 것과 이미지이다.
개념 설명
- 파이프라인( 코딩에서는 함수 )은 input을 넣으면 input에 고정된 output을 내보낸다.
- 그림에서 보이다시피 외부에서는 파이프라인 안에 접근할 수도 볼 수도 없다. 마찬가지로 파이프라인 안에서도 외부에 접근하거나 볼 수 없다.
- 함수형 프로그래밍은 이런 파이프라인들( 함수들 )을 묶고 연결해서 프로그램을 만들어가는 프로그래밍 패러다임을 말한다.
함수형 프로그래밍의 특징
- 순수함수 = 함수에서 외부의 상태값을 참조하거나 외부의 상태를 변경하는 것은 순수함수라고 할 수 없다. 동일한 인자를 넣었을 때 항상 동일한 결과값을 반환하고 언제 선언되었든 외부에 전혀 영향을 받지 않도록 함수를 작성해야 한다.
- Stateless , immutability ( 비상태 , 불변성 ) = 함수에 인자로 전달된 데이터를 절대 변경하지 않는다. 같은 형태의 데이터를 반환하고 싶으면 인자로 들어온 데이터의 값을 이용해 새로 만들어서 반환해줘야 한다. 그렇게 해야만 외부에 영향을 안 줄 수 있기 때문이다. ( 때문에 함수형 프로그래밍에서 map,filter같은 함수들(새로운 배열을 반환하는 함수들)를 자주 사용한다.)
이렇게 외부의 상태나 함수의 인자로 전달된 데이터의 상태를 변경하지 않음으로써 SideEffect 를 만들지 않게되고 , 그럼으로써 불변성을 유지하기 때문에 동시다발적인 멀티쓰레딩 환경에서도 안정적으로 동작할 수 있다.
( SideEffect = 부수효과 : 함수를 호출하면 외부의 상태가 변경되거나 , 예상하지 못한 에러가 발생하는 등의 부작용을 말한다. ) - Expressions Only , Not Statements = if , for , switch 같은 여러가지 명령문(Statements)을 사용하는 것은 함수형 프로그래밍이 아니다. 위와 같은 명령문들은 무엇을 어떻게 구현하는지에 초점이 맞춰져 있지만 , 함수형 프로그래밍에서는 표현식(Expressions)을 사용함으로써 무엇을 구현할 것인가에 초점이 맞춰져 있다.
- First-class and higher-order funtions
- first-class( 일급 ) function = 다른 데이터처럼 함수를 변수,데이터 구조에 할당하거나 , 함수의 인자로 전달될 수 있거나 , 반환값으로 사용될 수 있는 함수 , 즉 함수를 값처럼 다룰 수 있는 함수
- higer-order( 고차 ) function = 함수를 다른 함수의 인자로 전달하거나 , 함수를 반환하는 함수
예시
어떤 단어의 리스트가 있을 때 다음과 같은 문제가 주어졌다고 하자.
- 단어의 크기가 2 이상인 경우를 필터링한다.
- 모든 단어를 대문자로 변환한다.
- 모든 단어를 앞글자만 잘라내어 변환한다.
- 모든 단어를 스페이스로 구분한 하나의 문자열로 합친다.
명령문을 사용한 코드는 for문으로 루프를 돌리고 if문으로 조건을 달고 하겠지만 , 함수형 프로그래밍에서는 다음과 같이 함수들을 사용하여 프로그래밍한다.
public class WordProcessTest {
private final List<String> words = Arrays.asList("TONY", "a", "hULK", "B", "america", "X", "nebula", "Korea");
@Test
void wordProcessTest() {
String result = words.stream()
// 1.문자열의 길이가 1인지 판별
.filter(w -> w.length() > 1)
// 2.주어진 문자열을 대문자로 변환
.map(String::toUpperCase)
// 3.주어진 문자열의 첫단어만 뽑아냄
.map(w -> w.substring(0, 1))
// 4.주어진 문자열을 스페이스 간격으로 이어붙임
.collect(Collectors.joining(" "));
assertThat(result).isEqualTo("T H A N K");
}
}
장점
- 함수가 외부에 영향을 미치지 않기 때문에 공통으로 관리하는 상태들의 관리가 쉽고 함수 재사용의 안전성이 높다.
- SideEffect를 최소화하기 때문에 멀티쓰레드 환경에서 안정성이 높다.
- 불변성을 지향하기 때문에 프로그램의 동작 예측이 쉬워진다.
단점
- 순수함수의 구현은 가독성이 좋지 않을 수 있다.
- 순수함수의 사용은 쉬울 수 있지만 , 조합하는 것은 쉽지 않다.
- 규모있는 프로젝트에선 상태를 변경하는 SideEffect가 필연적이다. 이때 반드시 필요한 부분만 상태를 변경하는 코드를 사용하고 다른 부분은 순수함수로 최대한 SideEffect를 막아 예측 가능성을 높여야 한다.
- 함수형 프로그래밍에서의 반복은 재귀방식을 통해 루프를 대체하는데, 재귀적 코드는 무한루프에 빠질 위험이 있다.
참고자료
jongminfire.dev님의 블로그 - 함수형 프로그래밍이란?
얄코님 유튜브 : 함수형 프로그래밍이 뭔가요?
드림코딩 유튜브 : 함수형프로그래밍이 대세다?! (함수형 vs 객체지향)
'CS' 카테고리의 다른 글
API (Application Programming Interface ) 개념 설명 (0) | 2023.06.21 |
---|---|
추상클래스와 인터페이스 (0) | 2023.05.29 |
Spring DI 방법들 (0) | 2023.04.20 |
DTO , VO , Entity의 간단한 정리 및 비교 (0) | 2023.04.16 |
URI 와 URL (0) | 2023.04.14 |