함수형 프로그래밍

조 후임 : 함수형 프로그래밍이 뭐에여?
나 : 람다 대수를 기반으로 발전된 언어로, 변경 가능한 상태를 최대한 제거하여 사이드 이펙트를 제거하는 프로그래밍 방법이에요.

조 후임 : 잘 이해가 안가요
나 : 음 ....( 겉핥기 지식 ㅂㄷㅂㄷ..... 공부합시다)

함수형 프로그래밍은 프로그래밍 패러다임 중 하나


Q. 패러다임이란?
A. 한 시대 특정 분야의 사람들이 공유하는 이론, 법칙, 방법, 지식

Q. 프로그래밍 패러다임이란?
A. 소프트웨어 개발 과정에서 개발자들이 공유하는 이론, 법칙 방법, 지식
    소프트웨어를 바라보는 관점, 설계 및 개발에 대한 방법론 (절차, 객체지향, 함수형..)

Q. 프로그래밍 언어와 패러다임의 관계?
A. 프로그래밍 언어가 프로그래밍 패러다임을 지원한다.
    C++은 객체지향 언어지만, 절차지향으로도 코딩이 가능하다.
    즉, 어떤 언어가 프로그래밍 패러다임의 여러 방식을 지원한다면, 우린 그 중 하나의 방법론을 택해 소프트웨어를 설계 하고 개발하는 것이다.


객체지향 프로그래밍이 뭐야?  라는 질문에 아래와 같이 대답할 수 있을 것이다.
소프트웨어 설계 및 개발 과정에서, 실세계를 모델링하는 것 처럼 소프트웨어의 각 객체를 정의하고 그 객체들간의 데이터를 전달하고 공유하는 프로그래밍 방법이야.

그렇다면... 함수형 프로그래밍은 뭔데?


잠깐 위의 객체지향 프로그래밍에 대한 설명을 떠올려보자.
클래스를 정의하고 객체 인스턴스를 생성하여 객체간의 데이터를 전달해본 사람이라면, 위의 설명을 보고 '객체지향을 간단히 설명하는 방법 중 하나' 라고 이해하고 넘어 갈 것이다.
이렇게 생각한 사람들은 상속, 오버로딩, 오버라이딩, 추상메소드와 다형성 등, 객체지향에 사용되는 많은 개념과 기법들을 이해하고 있거나 한번쯤은 들어봤을 것이다.

함수형 프로그래밍은 객체지향 프로그래밍 처럼 프로그래밍 패러다임 중 하나이다.
즉 객체지향 프로그래밍 처럼 함수형 프로그래밍도 일급 함수 객체, 고차함수, 람다대수, 클로저 등, 함수형 프로그래밍에 관련된 많은 base와 개념, 지원하는 기법들이 있다.

각각에 대해 설명하고 이해하려면 적지 않은 시간이 걸리기 때문에 본 글에서는 함수형 프로그래밍이 무엇을 중요시하는지를 살펴보자.

함수형 프로그래밍의 컨셉!!


첫 번째도..두번쨰도,, N번째도!!! 부작용 (Side effect) 을 제거하자.!!!
이것이다. 이게 함수형 프로그래밍의 가장 중요한 컨셉이다.

그렇다면 부작용은 무엇을 말하는가? 아래 코드를 보자.
int z = 10;
int functionA(int x, int y)
     return x + y + z;
}

동일 입력에 대해 functionA의 출력은 변할 수 있다. (z 값에 의해)
z는 funtionA의 소스를 봐야 알 수 있는 숨겨진 입/출력이며,  함수형 프로그래밍에서는 숨겨진 입/출력을 부작용이라 부른다.
즉, 함수에서 동일 입력에 대해 동일한 출력이 나오지 않는 경우 부작용이 존재한다.

그럼 부작용은 어떻게 없앨 수 있어요? 이렇게
이제야 동일 입력에 대해 동일한 출력이 나오므로, 부작용이 존재하지 않는다.
int z = 10;
int functionA(int x, int y, int z)
     return x + y + z;
}

ㅇ ㅏ...그럼 함수형 프로그래밍에선, 부작용이 없는 함수를 선언하고 호출하나 보네여
그럼 부작용이 없어서 얻는 장점이 뭔데여?????

1. 코드 분석이 용이하며 단위 테스트가 쉽다.
 - 함수 내부에서 변경이 없다보니, 함수의 선언만 보고 기능을 추론하기 쉬우며 코드 분석이 쉽다.
 - 동일한 입력에 동일한 출력이 나오므로 단위 테스트가 쉽다.
2. 유지보수가 용이하다.,
 - 함수 내부에서 변경이 없고, 하는 기능이 명확하다 보니, 기능의 추가, 수정에서 훨씬 간단하다.
3. 기존 멀티 쓰레드 환경의 문제점이 사라진다.
 - 멀티 쓰레드를 공부하다 보면, 임계영역이라고 들어보았을 것이다. 여러 쓰레드에 의해 데이터가 공유되고 의도치 않게 변경될 수 있는 코드 영역을 임계 영역이라 한다. 임계영역에 대한 적절한 처리를 하지 못할 경우 발생되는 문제는 해결하기 매우 어렵다. (이건 경험해 봐야 알 수있음 ㅂㄷㅂㄷ) 하지만 함수형 프로그래밍에선 데이터의 변경을 기피하고 제거하기 때문에 멀티 쓰레드 환경에서 문제없이 동작한다.

Q. 함수형 프로그래밍은 정말 데이터의 변경이 하나도 존재하지 않나여?
- 존재한다. 함수는 반환값을 얻어내기도 하지만, 어떤 동작을 수행하기도 때문이다. 함수형 프로그래밍에선 그런 데이터의 변경을 최대한 제거하고, 제거할 수 없을 경우엔 통제한다.

Q. 함수형 프로그래밍 언어는 무엇인가?
- 부작용을 제거하고, 통제할 수 있도록 최대한 적극적으로 도와주는 언어. (Lisp, 하스켈, 클로져, 스칼라 등..)

함수형 프로그래밍의 컨셉을 아는 것과 실제로 구현하는 것은 다르다. 함수형 프로그래밍으로 개발하려면 공부해야 할 것들이 넘친다. (앞에 언급한 일급 함수 객체부터 ~~~ 줄줄)

적어도 본 글을 통해 함수형 프로그래밍은 이런 컨셉(개념을)을 가지고 있구나 라고 알 수있다면 좋겠다.

댓글 없음:

댓글 쓰기