F.R.I.D.A.Y.

Kotlin: 15 함수형 프로그래밍 본문

DEV/Kotlin

Kotlin: 15 함수형 프로그래밍

F.R.I.D.A.Y. 2020. 6. 6. 23:22
반응형

 이전 <14: 인라인 함수와 익명 함수> 파트의 끝머리에서 15번째 포스트는 람다식이 될 것이라고 했습니다. 그러나 람다식을 배우기 전에 꼭 알아두어야 할 필요가 있다고 생각한 것이 생겨서 람다식을 후순위로 미루게 되었습니다.

 이번엔 함수형 프로그래밍이 무엇인지 알아봅니다.


언어의 패러다임

 세상에는 많은 프로그래밍 언어가 존재합니다. C/C++, Java, C#을 시작으로 python, Go, Kotlin, Javascript[#ECMAScript 현재 JS는 기존의 오명을 씻고 표준을 잘 제정해 여태 이 언어를 싫어하던 개발자들도 포섭하는 행태를 보이고 있습니다. 이전의 JS와는 많은 차이를 보이고 있으니 관심 있게 지켜보셔도 좋습니다]까지. 이들 언어는 각자 필요에 의해 만들어진 언어로서 언어가 지향하는 방향과 그 패러다임이 다릅니다. 우리가 살펴볼 것은 Kotlin입니다. Kotlin은 함수형 프로그래밍 언어입니다. 동시에 객체 지향 프로그래밍 언어이죠.

절차 지향 프로그래밍(Procedural Programming)

 이름처럼 절차를 중시하는 패러다임입니다. 대표적으로 C언어가 이 패러다임을 가지고 있습니다. 폭포수의 물이 아래로 떨어지는 것처럼 명령어가 위에서부터 아래로 수행됩니다.

객체 지향 프로그래밍(Object Oriented Programming)

 이전의 절차 지향 프로그래밍은 프로젝트(프로그램)의 규모가 커지면 기능을 추가하는 등의 유지/보수 및 개발이 힘들어졌습니다. 그래서 새로 고안된 패러다임이 객체 지향 프로그래밍입니다. 특정 데이터와 그 데이터를 처리하는 일련의 과정을 하나의 객체로 관리하는 방식입니다.

함수형 프로그래밍(Functional Programming)

 Kotlin이 지향하는 함수형 프로그래밍은 수학적 함수의 조합으로 계산을 하는 방식입니다. 요즘은 객체 지향 프로그래밍과 더불어 함께 패러다임 구축에 자주 사용됩니다.


함수형 프로그래밍의 특징

# 아래 내용은 C언어로 설명하겠습니다.

 

 C언어에서는 포인터 변수를 이용해 호출할 함수에 변경 가능하도록 값을 넘길 수 있습니다.

// Code 1
#include <stdio.h>

void functionA(int* value){
    *value += 3;
}

int main(void){
    int num = 5;
    printf("%d\n", num);
    functionA(&num);
    printf("%d\n", num);
    
    return 0;
}

 이 코드에서 main 함수의 num은 main 함수 내에서의 변화는 없지만 functionA 함수에서 조작을 가하기 때문에 기존 5였던 값이 8이 됩니다. 이 방식은 경우에 따라 기법으로 운영하기도 하지만, 때론 독으로 작용합니다. 특히나 구조를 제대로 설계하지 않았다면 말이죠.

 함수형 프로그래밍이 지향하는 것은 "입력 데이터에는 영향을 주지 않는다"입니다.

void Abs(int* value){
    if(*value < 0) *value = -*value;
}

바로 위 코드는 <Code 1>과 마찬가지로 함수에 입력으로 들어오는 값을 조작합니다. 다음 코드를 다시 보겠습니다.

int Abs(int value){
    return value > 0 ? value : -value;
}

 입력으로 정수 하나를 받지만 해당 정수를 수정하지는 않습니다. 정수를 연산한 결과를 반환할 뿐입니다.

더보기

# 만들어진 Abs 함수 이용하기

// test 1
#include <stdio.h>
void Abs(int* value){
    if(*value < 0 ) *value = -*value;
}

int main(void){
    
    int num = -5;
    
    printf("%d\n", num);
    Abs(&num);
    
    printf("%d\n", num);
    
    return 0;
}
// test 2
#include <stdio.h>
int Abs(int value){
    return value > 0 ? value : -value;
}
int main(void){
    
    int num = -5;
    int result;
    printf("%d\n", num);
    result = Abs(num);
    
    printf("%d %d\n", result, num);
    
    return 0;
}

 실행 해보면 <test 1> 코드의 경우 기존 num 값이 변경되는데 반해, <test 2> 코드는 연산이 원본에 영향을 주지 않는 것을 알 수 있습니다.

test 1 결과
test 2 결과

순수 함수(Pure Function)

 함수형 프로그래밍의 핵심이라고 할 수 있습니다. 위에서 작성했던 int Abs(...) 함수를 기억하시나요? 이 함수가 바로 순수 함수입니다. 순수 함수란 무엇일까요?

 부작용[# 같은 입력이더라도 상황에 따라 다른 결과를 반환하는 것]이 없고 외부 상태에 일체 관여하지 않는[# 외부 변수의 값을 참조하거나 변경하는 행위] 함수를 일컬어 순수 함수라고 합니다.

일급 객체(First Class Citizen)

 이 패러다임에서는 함수를 일급 객체로 생각합니다. 일급 객체는 다음과 같은 특징을 가집니다.

* 일급 객체는 함수의 인자로 전달할 수 있다.
* 일급 객체는 함수의 반환값에 사용할 수 있다.
* 일급 객체는 변수에 담을 수 있다.

 이 때, 함수는 특별히 일급 함수라고 부르기도 합니다. 일급 함수라 불릴 수 있는 함수들 중, 이름이 없는 경우엔 람다식이라고 부르죠.

 


 정말 오랜만에 돌아왔는데 Kotlin 언어보다는 프로그래밍의 패러다임에 대해 이야기하게 되었네요. 언제 다시 돌아올 수 있을지 모르겠지만 다음 편은 조금 더 어렵고 알차게 돌아오겠습니다.

 

Next.

 

Kotlin: 16 고차 함수

 이전 시간에 우리는 언어의 패러다임을 배웠습니다. 그 내용에는 일급 객체에 대한 내용도 함께 실려 있는데요, 이번 시간에는 일급 객체, 특히나 고차 함수에 대해 알아보겠습니다. 고차 함수

pang2h.tistory.com

 

# index

728x90
반응형

'DEV > Kotlin' 카테고리의 다른 글

Kotlin: 17 람다식(Lambda Expression) part1. Basic  (0) 2020.08.23
Kotlin: 16 고차 함수  (0) 2020.07.22
Kotlin: 14 인라인 함수와 익명 함수  (0) 2020.04.06
Kotlin: 13 예외 처리  (1) 2020.04.05
Kotlin: 12 흐름 제어하기  (0) 2020.04.04
Comments