함수형 프로그래밍
쿠재아이
김재경
왜 이런 주제를?
390회에서 발표한 Reactive Programming
스터디 前
• 오늘은 어떤 내용일까 기대
• 처음이자 마지막으로 예습도 함
스터디 後
• 예상과는 달리 난해한 내용
• 설명을 들어도 이해가 안 됨
• 뭔가 새롭다는 건 알겠는데…
?????
스터디 後
• 발표는 Reactive가 중심
• 하지만 Functinal이 더 끌렸음
• 한 번 알아보고 싶다고 생각
스터디 後
이 PPT도 호기심을 자극했었음
2017 NDC
올해 NDC에서도 등장
근데 왜 이 주제를?
이 2개는 Reactive에 초점을 맞춰서 Functional 설명은 좀…
※ 개인적인 생각입니다
근데 왜 이 주제를?
상당히 만족스러운데 뭔가 2% 부족한 느낌
※ 개인적인 생각입니다
함수형 프로그래밍
쿠재아이
김재경
이제 뭔지 알아봅시다
Think
객체 지향 프로그래밍
Think
객체 지향 프로그래밍에서
처음에 무엇이 제일 궁금했나요?
Think
객체지향 프로그래밍에서
처음에 무엇이 제일 궁금했나요?
Think
그럼 함수형 프로그래밍은?
Think
그럼 함수형 프로그래밍은?
함수
function
함수?
• 내가 알고 있는 함수와 다른가?
• 다르면 어떤 점이?
• ‘함수’형 프로그래밍이라 할만큼 중요한가?
1. First-class function
• 함수를 변수에 저장할 수 있음
• 함수를 인자로 넘기거나 리턴이 가능 함
• 이후 소개할 특징의 기본이 되는 개념
2. Higher-order function
• 고차함수 or 고계함수로 번역
• 하나 이상의 함수를 인자로 받거나
• 함수를 리턴하는 함수
• 고차함수를 이용하여 데이터를 처리
2. Higher-order function
2. Higher-order function
String을 Integer로 바꾸고
2. Higher-order function
짝수만 골라낸 뒤
2. Higher-order function
합을 리턴
3. Anonymous function
• C++11에서는 람다 표현식이라 부름
• 인자로 전달되는 함수나
• 리턴되는 함수로 사용
3. Anonymous function
람다가 없으면 함수를 인자로 넘기기 위해 따로 만들어야 함
3. Anonymous function
람다를 사용하면 따로 함수를 만들 필요 없음
함수형 프로그래밍에서 람다가 없으면 매우 끔찍 할 듯
4. Nested function
• 중첩 함수
• 함수 안에 다른 함수가 정의된 함수
4. Nested function
출력 값은?
4. Nested function
4. Nested function
4. Nested function
그런데 말입니다
4. Nested function
어떻게 외부 함수의 변수에 접근할 수 있지?
5. Closure
• 내부에서 참조되는 모든 인수에 대한 묵시적 바인딩을
지닌 함수를 말함
• 자신이 참조하는 문맥(context)를 포함한다
• C++11에서는 람다 표현식으로 생성
• 다만 람다 밖의 변수는 Capture를 통해 접근
• 이해가 잘 안되면 Functor를 생각하면 됨
5. Closure
클로저 객체가 생성되고 바로 실행
5. Closure
• C++에서는 왜 Capture를 통해서 외부 변수에
접근하도록 했을까?
6. Pure function
• 함수의 결과값이 오직 입력 인자 값들에 의해서만 결정
• Side effects가 없음
int abs(int n);
int atoi(const char *str);
int getDefaultPort(bool https) {
return https ? 443 : 80;
}
int rand();
time_t time (time_t* timer);
bool g_https = false;
int getDefaultPort() {
return g_https ? 443 : 80;
}
6. Pure function
• 참조 투명성을 가짐
- 어떤 표현식을 그 표현식의 결과값으로 교체해도
전체 프로그램의 실행결과에 영향을 주지 않는 성질
• 컴파일러에게 다양한 최적화 기회를 제공
- Memoization
- Lazy evaluation
불변성
Immutability
불변성
• 내용의 변경은 새로운 객체를 생성할 때만 가능
• 생성, 테스트, 사용법이 단순하고 쉬움
• Thread-Safe
• 쉬운 캐쉬 – 이름이 같으면 내용도 같음
• Temporal coupling 줄임
• Identity mutability problem 없음
Temporal coupling
HttpRequest request;
request.SetUrl("https://hostname/api");
request.SetSSL(true);
request.SetCACert("ca-bundle.crt");
request.Post();
HttpRequest request;
request.SetUrl("https://hostname/api");
request.SetSSL(true);
request.Post(); // Error!
Temporal coupling
class HttpRequest {
public:
HttpRequest(const std::string& url, bool ssl,
const std::string& cacert);
// no setters
...
};
HttpRequest request("https://hostname/api", true,
"ca-bundle.crt");
request.Post();
Identity mutability problem
using MonsterPtr = std::shared_ptr<Monster>;
std::map<int64_t, MonsterPtr> monsters;
MonsterPtr p1 = std::make_shared<Monster>(1234, “Murloc");
monsters.insert(std::make_pair(p1.id(), p1));
p1->setID(2234); // ???
불변성
잠깐
불변성
• 객체를 변경하려면 새로 생성해야 된다고?
• 너무 비효율적인거 같은데…
• 캐릭터가 이동할 때마다 새로 생성해야 되는거 실화?
• 기본 자료구조는 어떻게 구현?
• 성능 이슈는?
이건 물론 가변성으로 만들겠죠
영속성 자료 구조
Persistent data structure
영속성 자료 구조
• 수정될 때 항상 이전 버전의 데이터를 보존하는 자료 구조
• 리스트 2개가 있다고 가정
• xs = [0, 1, 2]
ys = [3, 4, 5]
• zs = xs + ys 는?
영속성 자료 구조
• 완전히 새로 생성하지 않고
기존의 구조를 이용하여 생성
영속성 자료 구조
• 트리
• xs = [a, b, c, d, e, f, g, h]
• ys = insert(“e”, xs)는?
영속성 자료 구조
메모이제이션
Memoization
메모이제이션
• 동일한 계산을 반복해야 할 때, 이전에 계산한 값을 메모리에
저장함으로써 동일한 계산의 반복 수행을 제거하여
프로그램 실행 속도를 빠르게 하는 기술
• 동적 계획법의 핵심
메모이제이션
• 메모이제이션 X
• 중복되는 함수 호출
• 매우 비효율적
메모이제이션
미리 계산한 값을 사용하여 실행 속도가 빠름
메모이제이션
• 언어에서 기본으로 제공
• 함수의 리턴 값을 자동적으로 캐싱
게임에서 적용은?
게임에서 적용은?
• Thread-safe 하니까 가장 먼저 생각난 곳은 서버
이 발표에서 함수형 언어가 언급
게임에서 적용은?
게임에서 적용은?
출처
• Functional Reactive Programming With RxSwift
- https://www.slideshare.net/sunhyouplee/functional-reactive-programming-with-rxswift-62123571
• NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기
- https://www.slideshare.net/jongwookkim/ndc14-rx-functional-reactive-programming
• 더 좋은 코드를 위한 함수형 프로그래밍
- https://www.slideshare.net/isaacjeon/ndc17-ppt-fpinmodernc
• 위키피디아 Functional programming
- https://en.wikipedia.org/wiki/Functional_programming
• 위키피디아 Persistent data structure
- https://en.wikipedia.org/wiki/Persistent_data_structure
• 클로저라는 훌륭한 도구와 영속 불변 자료 구조
- goo.gl/m6aAWN
• 값중심의 프로그래밍
- http://ropas.snu.ac.kr/~kwang/paper/maso/1.pdf
출처
• Nested function
- http://ajaxlab.net/?p=182
• 함수형 프로그래머가 되고 싶다고? (Part 1~6)
- goo.gl/CWyhjd
• 나무위키 메모이제이션
- https://namu.wiki/w/%EB%A9%94%EB%AA%A8%EC%9D%B4%EC%A0%9C%EC%9D%B4%EC%85%98
• 함수형 사고
- http://www.hanbit.co.kr/store/books/look.php?p_code=B6064588422
Q / A

More Related Content

PPTX
리플렉션과 가비지 컬렉션
PDF
Direct x 12 초기화
PDF
Game programming patterns
PDF
테라로 살펴본 MMORPG의 논타겟팅 시스템
PDF
Game programming patterns 2
PDF
UE4 Garbage Collection
PDF
Memory & object pooling
PDF
이승재, 사례로 배우는 디스어셈블리 디버깅, NDC2014
리플렉션과 가비지 컬렉션
Direct x 12 초기화
Game programming patterns
테라로 살펴본 MMORPG의 논타겟팅 시스템
Game programming patterns 2
UE4 Garbage Collection
Memory & object pooling
이승재, 사례로 배우는 디스어셈블리 디버깅, NDC2014

What's hot (20)

PDF
NDC14 - 사례로 배우는 디스어셈블리 디버깅
PDF
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013
PDF
Effective c++ chapter 1,2 요약
PPTX
Go lang(goroutine, channel, 동기화 객체)
PDF
임태현, MMO 서버 개발 포스트 모템, NDC2012
PPTX
Concurrent programming 2
PDF
게임서버프로그래밍 #4 - 멀티스레드 프로그래밍
PDF
임태현, 서버점검 제로에의 도전, NDC2011
PPTX
Effective c++ 정리 1~2
PPTX
병렬 프로그래밍 패러다임
PDF
Exception&log
PPT
effective c++ chapter 3~4 정리
PPTX
Effective C++ Chaper 1
PDF
Project anarchy로 3d 게임 만들기 part_5_waste of time shoveling
PDF
Effective c++ chapter3, 4 요약본
PDF
More effective c++ 항목30부터
PPTX
Effective c++ 2
PPTX
Windows system - memory개념잡기
PPTX
Effective c++ 1
PDF
[NDC08] 최적화와 프로파일링 - 송창규
NDC14 - 사례로 배우는 디스어셈블리 디버깅
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013
Effective c++ chapter 1,2 요약
Go lang(goroutine, channel, 동기화 객체)
임태현, MMO 서버 개발 포스트 모템, NDC2012
Concurrent programming 2
게임서버프로그래밍 #4 - 멀티스레드 프로그래밍
임태현, 서버점검 제로에의 도전, NDC2011
Effective c++ 정리 1~2
병렬 프로그래밍 패러다임
Exception&log
effective c++ chapter 3~4 정리
Effective C++ Chaper 1
Project anarchy로 3d 게임 만들기 part_5_waste of time shoveling
Effective c++ chapter3, 4 요약본
More effective c++ 항목30부터
Effective c++ 2
Windows system - memory개념잡기
Effective c++ 1
[NDC08] 최적화와 프로파일링 - 송창규
Ad

Similar to 함수형 프로그래밍 (20)

PPTX
Nexon Developers Conference 2017 Functional Programming for better code - Mod...
PDF
함수형 프로그래밍
PDF
Functional Kotlin makes Kotlin functional
PPTX
불어오는 변화의 바람, From c++98 to c++11, 14
PPTX
Functional programming
PPTX
About Visual C++ 10
PPTX
NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기
PDF
C++20 Key Features Summary
PPTX
Changes in c++0x
PDF
초보를 위한 C++11
PDF
Finding Functional Programming
PDF
C++ Advanced 강의 5주차
PPTX
Cpp에서 활용해보는 Lambda식
PPTX
강의자료 2
PDF
스칼라와 스파크 영혼의 듀오
PDF
프로그래밍 대회: C++11 이야기
PDF
Pure Function and Rx
PDF
7 8 1
PDF
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
PDF
웹 프론트엔드 개발자의 얕고 넓은 Rx 이야기
Nexon Developers Conference 2017 Functional Programming for better code - Mod...
함수형 프로그래밍
Functional Kotlin makes Kotlin functional
불어오는 변화의 바람, From c++98 to c++11, 14
Functional programming
About Visual C++ 10
NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기
C++20 Key Features Summary
Changes in c++0x
초보를 위한 C++11
Finding Functional Programming
C++ Advanced 강의 5주차
Cpp에서 활용해보는 Lambda식
강의자료 2
스칼라와 스파크 영혼의 듀오
프로그래밍 대회: C++11 이야기
Pure Function and Rx
7 8 1
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
웹 프론트엔드 개발자의 얕고 넓은 Rx 이야기
Ad

More from QooJuice (12)

PDF
캐릭터 애니메이션
PDF
Screen space ambient occlusion
PDF
Compute shader
PDF
Picking
PDF
코루틴(Coroutine)
PDF
행렬
PDF
벡터
PDF
노말 맵핑(Normal mapping)
PDF
부팅
PDF
절차지향 vs 객체지향
PDF
Segmentation and Paging
PDF
Move semantics
캐릭터 애니메이션
Screen space ambient occlusion
Compute shader
Picking
코루틴(Coroutine)
행렬
벡터
노말 맵핑(Normal mapping)
부팅
절차지향 vs 객체지향
Segmentation and Paging
Move semantics

함수형 프로그래밍