부수효과(Side Effect)
함수형 프로그래밍(Functional Programming)의 정의를 설명할 때, 중요하게 언급되는 2가지 개념은 바로 '부수 효과'와 '참조 투명성'이다.
먼저 '부수 효과'는 함수 내의 실행으로 인해 함수 외부가 영향을 받는 것을 의미한다.
함수의 매개 변수의 값이 변경되어, 이로 인해 함수를 사용하는 코드에 영향을 주거나, 함수의 외부 세계인 데이터베이스, 파일 시스템, 네트워크 등으로 데이터 이동이 발생하는 것을 말한다.
함수형 프로그래밍에서 함수는 부수효과를 발생하지 않는다.
public static int add(int a, int b) {
while (b > 0) {
a++;
b--;
}
return a;
}
위의 메서드는 함수적이다. 정수형 a, b를 매개 변수로 받은 후, 그것들의 값을 변경하지 않고 결과를 반환한다. 만약 a, b의 값을 변경한다고 해도 이는 함수적이다. 왜냐면 매개 변수로 전달된 a, b는 pass by value 형태로 전달되었기 때문에, 함수 내에서 아무리 변경해도 함수를 벗어난 후에는 외부 세계에 아무런 영향을 주지 못한다.
참조 투명성(Referential Transparency)
2번째로 언급되는 것이 바로 '참조 투명성'이다. 참조 투명성은 함수(또는 메서드)가 함수 외부의 영향을 받지 않는 것을 의미한다. 다른 말로 하면, 함수의 결과를 입력 파라미터에만 의존하고, 함수의 외부 세계인 입력 콘솔, 파일, 원격 URL, 데이터베이스, 파일 시스템 등에서 데이터를 읽지 않는다.
함수 외부의 값을 변경하거나, 외부 세계의 의존하지 않는 코드를 가리켜 '참조 투명성이 있다', '참조 투명하다'라고 말한다.
참조 투명성을 가진 코드는 아래와 같은 특징을 가진다.
- 자기 충족적이다 (self-contained). 함수 외부에 의존하는 코드가 없고, 함수 사용자 입장에서는 유효한 매개변수만 전달하면 된다.
- 결정론적이다 (deterministic). 동일한 매개변수에 대해서 항상 동일한 결과가 나온다.
- 예외 (Exception)를 던지지 않는다. out of memory error 혹은 stack overflow error는 발생할 수 있지만, 이러한 에러들은 버그로 취급되며, 함수의 사용자가 다룰 수 있는 것은 아니다.
- 다른 코드가 예기치 않게 실패하는 조건을 만들지 않는다. 예를 들어, 참조 투명성을 가진 함수는 매개 변수의 값을 변경하거나 함수 외부의 데이터를 변경하지 않는다.
- 데이터베이스, 파일 시스템, 네트워크 등의 외부 기기로 인해 동작이 멈추지(hang) 않는다.
함수형 프로그래밍을 통해서 얻을 수 있는 이득
- 함수형 프로그램은 결정론적이기 때문에, 원인을 찾기가 더 쉽다. 함수형 코드는 특정한 입력에 대해서 항상 동일한 결과를 반환한다. 이를 통해 프로그램의 광범위하게 테스트하는 대신 개별 함수 테스트를 통해 올바른 프로그램임을 증명할 수 있다.
- 함수형 프로그램은 테스트하기가 쉽다. 부수효과가 없기 때문에, mock을 만들지 않아도 된다.
- 함수형 프로그램은 조립하기가 쉽다. 함수형 프로그램은 함수들의 조합으로 구성된다. 다루어야 할 부수 효과가 없고, 예외가 없으며, 값의 변경이 일어나지 않는다. 게다가 동시성 문제도 발생하지 않는다.
- 함수형 프로그램은 구성, 재구성이 쉽다. 함수형 프로그램을 작성할 때, 기반이 되는 함수들을 먼저 작성한 후에, 상위 레벨에서 함수들을 조합한다. 원하는 함수를 가질 때까지 함수들을 조합한다. 모든 함수는 참조 투명하기 때문에, 다른 프로그램을 작성할 때도 재사용하기가 쉽다.
참조 사이트
'프로그래밍 > 함수형 프로그래밍' 카테고리의 다른 글
함수형 프로그래밍 관련 개념 정리 (0) | 2024.03.22 |
---|---|
재귀 vs 꼬리 재귀 (1) | 2024.03.15 |
C#으로 함수형 프로그래밍을 해보자 (0) | 2024.03.14 |
문 스타일(statement style) vs 식 스타일(expression style) (0) | 2024.03.04 |
C# 함수형으로 구현한 팩토리얼 함수 (0) | 2024.03.04 |
댓글