일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 김성엽
- 리뷰
- 백준
- c++
- 배열
- VS ERROR
- tipssoft
- Windows
- 문법
- Direct2D
- c#
- 이지스퍼블리싱
- 티스토리
- Programming
- 지식나눔강좌
- Win32
- Tips프로그래밍강좌
- Javascript
- Kotlin
- 연산자
- Tips강좌
- 알고리즘
- Desktop
- doit코틀린프로그래밍
- 포인터
- c
- Visual Studio
- 함수
- CS
- 프로그래밍
- Yesterday
- Today
- Total
F.R.I.D.A.Y.
Kotlin: 15 함수형 프로그래밍 본문

이전 <14: 인라인 함수와 익명 함수> 파트의 끝머리에서 15번째 포스트는 람다식이 될 것이라고 했습니다. 그러나 람다식을 배우기 전에 꼭 알아두어야 할 필요가 있다고 생각한 것이 생겨서 람다식을 후순위로 미루게 되었습니다.
이번엔 함수형 프로그래밍이 무엇인지 알아봅니다.
Index
- 언어의 패러다임
- 절차 지향 프로그래밍(Procedural Programming)
- 객체 지향 프로그래밍(Object Oriented Programming)
- 함수형 프로그래밍(Functional Programming)
- 함수형 프로그래밍의 특징
- 순수 함수(Pure Function)
- 일급 객체(First Class Citizen)
- Next.
언어의 패러다임copy^
세상에는 많은 프로그래밍 언어가 존재합니다. C/C++, Java, C#을 시작으로 python, Go, Kotlin, Javascript[ECMAScript]까지. 이들 언어는 각자 필요에 의해 만들어진 언어로서 언어가 지향하는 방향과 그 패러다임이 다릅니다. 우리가 살펴볼 것은 Kotlin입니다. Kotlin은 함수형 프로그래밍 언어입니다. 동시에 객체 지향 프로그래밍 언어이죠.
절차 지향 프로그래밍(Procedural Programming)copy^
이름처럼 절차를 중시하는 패러다임입니다. 대표적으로 C언어가 이 패러다임을 가지고 있습니다. 폭포수의 물이 아래로 떨어지는 것처럼 명령어가 위에서부터 아래로 수행됩니다.
객체 지향 프로그래밍(Object Oriented Programming)copy^
이전의 절차 지향 프로그래밍은 프로젝트(프로그램)의 규모가 커지면 기능을 추가하는 등의 유지/보수 및 개발이 힘들어졌습니다. 그래서 새로 고안된 패러다임이 객체 지향 프로그래밍입니다. 특정 데이터와 그 데이터를 처리하는 일련의 과정을 하나의 객체로 관리하는 방식입니다.
함수형 프로그래밍(Functional Programming)copy^
Kotlin이 지향하는 함수형 프로그래밍은 수학적 함수의 조합으로 계산을 하는 방식입니다. 요즘은 객체 지향 프로그래밍과 더불어 함께 패러다임 구축에 자주 사용됩니다.
함수형 프로그래밍의 특징copy^
# 아래 내용은 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> 코드는 연산이 원본에 영향을 주지 않는 것을 알 수 있습니다.


순수 함수(Pure Function)copy^
함수형 프로그래밍의 핵심이라고 할 수 있습니다. 위에서 작성했던 int Abs(...) 함수를 기억하시나요? 이 함수가 바로 순수 함수입니다. 순수 함수란 무엇일까요?
부작용[2]이 없고 외부 상태에 일체 관여하지 않는[3] 함수를 일컬어 순수 함수라고 합니다.
일급 객체(First Class Citizen)copy^
이 패러다임에서는 함수를 일급 객체로 생각합니다. 일급 객체는 다음과 같은 특징을 가집니다.
* 일급 객체는 함수의 인자로 전달할 수 있다. * 일급 객체는 함수의 반환값에 사용할 수 있다. * 일급 객체는 변수에 담을 수 있다. |
이 때, 함수는 특별히 일급 함수라고 부르기도 합니다. 일급 함수라 불릴 수 있는 함수들 중, 이름이 없는 경우엔 람다식이라고 부르죠.
정말 오랜만에 돌아왔는데 Kotlin 언어보다는 프로그래밍의 패러다임에 대해 이야기하게 되었네요. 언제 다시 돌아올 수 있을지 모르겠지만 다음 편은 조금 더 어렵고 알차게 돌아오겠습니다.
Next.copy^
Kotlin: 16 고차 함수
이전 시간에 우리는 언어의 패러다임을 배웠습니다. 그 내용에는 일급 객체에 대한 내용도 함께 실려 있는데요, 이번 시간에는 일급 객체, 특히나 고차 함수에 대해 알아보겠습니다. 고차 함수
pang2h.tistory.com
'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 |