SlideShare a Scribd company logo
1 of 32
Download to read offline
함수형 사고
깊이 들어가기
@Scala @함수형패러다임 @FP
김정규
regular
Len
https://github.com/LenKIM
@다우기술
index
1. 완전수로알아보는함수형프로그래밍
2. 함수형프로그래밍의커링과부분적용
3. 함수형프로그래밍안에서디자인패턴
4. 함수형프로그래밍안에서리펙토오링
오늘의 장난감.
소스 코드
https://gist.github.com/LenKIM/384a4c9f44dea5ac4e53d02c715cfe50
Refactoring을 시작해보자.
다음 코드의 특징은 무엇일까?
1. 두 개의 내부 상태가 존재한다.
2. 많은 수의 작은 메서드로 세밀하게 분리되어 

서로의 의존관계를 가짐.
3. 보편적인 객체지향 프로그래밍.
같이한번 고쳐보자.
라이브 코딩으로 도전하기!
1. 내부상태가 존재하지 않는다.
2. 의존 관계가 서로 의존하지 않는다.
1. 두 개의 내부 상태가 존재한다.
2. 많은 수의 작은 메서드로 세밀하게 분리되어 

서로의 의존관계를 가짐.
3. 보편적인 객체지향 프로그래밍.
이번에는 자바8 로 짜보기!
라이브 코딩으로 도전하기!
https://gist.github.com/LenKIM/dcc6ae3b9b57e7a5bd15d17c9ad3640e
JAVA8 코드
커링 / 부분적용
• 함수형 프로그래밍에서 흔히 볼 수 있는 기법
• 커링이나 부분 적용은 함수나 메서드의 인수의 개수를 조작할 수
있게 해준다. 주로 인수 일부에 기본값을 주는 방법에 사용
• 그럼 커링과 부분 적용은 무엇일까?
이것은 그 변형 과정이지 변형된 함수를 실행하는 것을 지칭하는 것은 아님.
함수의 호출자가 몇 개의 인수를 고정 할지를 결정하며
적은 수의 인자를 가지는 함수를 유도해 낸다.
커링
: 다인수함수를 일인수 함수들의 체인으로 바꿔주는 방법.
function tripleSum(a : number, b : number, c : number) : number {
return a + b + c;
}
function tripleSumCurried(a : number) : number => number => number {
return function (b : number) : number => number {
return function (c : number) : number {
return a + b + c;
}
}
}
커링
커링
https://gist.github.com/LenKIM/99eb751ccab817a085f492ead0ecca55
커링 스칼라 코드
주어진 다인수함수를 생략될 인수의 값을 미리 정해서
더 적은 수의 인수를 받는 하나의 함수로 변형하는 방법이다.
이 방법은 이름이 의미하듯이
몇몇 인수에 값을 미리 적용하고
나머지 인수만 받는 함수를 리턴한다.
부분적용
부분적용
https://gist.github.com/LenKIM/5dae8bfc09673a81518391082687968b
부분적용
모두 몇몇 인수의 값만 주면
인수가 몇 개 빠져도 호출할 수 있는 함수를
RETURN
다만, 커링은 체인의 다음 함수를 RETURN하는 반면에,
부분 적용은 주어진 값을 인수에 BINDING 시켜서
인수가 더 작은 하나의 함수를 만들어 준다.
이 차이점은 인수의 수가 둘 이상인 함수를 살펴보면 명확해진다.
커링이나 부분 적용
공통점
차이점
함수형프로그래밍안에서의디자인패턴
함수
메세지
함수
함수
함수
함수
함수
함수
함수
함수
함수
메세지
함수
함수
함수
함수
함수
함수 수준의 재사용
합성(주어진 매개변수와 일급 함수들의 형태로 이루어진다) 은
함수형 프로그래밍 라이브러리에서 재사용의 방식으로 자주 사용된다.
https://gist.github.com/LenKIM/e84a544c2a0bc60089c3e66ff49d7278
템플릿 메소드 패턴
https://gist.github.com/LenKIM/c0038a7a940dddae3715d4ee20be5bda
전략 디자인 패턴
불필요한 구조물을 제거.
요즘은 IDE가 좋아서 얼마나 간결하게 느껴지는가는 모르겠...
그러나,
객체지향 프로그래밍은 움직이는 부분을 캡슐화하여 코드 이해를 돕고,
함수형 프로그래밍은 움직이는 부분은 최소화하여 코드 이해를 돕는다.
객체지향 프로그래밍은 움직이는 부분을 캡슐화하여 코드 이해를 돕고,
함수형 프로그래밍은 움직이는 부분은 최소화하여 코드 이해를 돕는다.
구조형 재사용 함수형 재사용
명령형 및 객체지향형 프로그래밍 스타일에서는
구조물과 메시징이 빌딩블록이다.
객체 지향 코드를 재사용하려면,
대상이 되는 코드를 다른 클래스로 옮기고
상속을 통해 접근해야 한다.
이것이 바로 커플링(coupling)
합성.
https://slidesplayer.org/slide/14110085/
구조물을 사용한 코드 재사용
Source Source
Common Common
Common
Source Source
구조물을 사용한 코드 재사용
구조물을 사용한 코드 재사용
합성을 사용한 코드 재사용
합성을 사용한 코드 재사용
합성을 사용한 코드 재사용
함수형으로 만든 코드를 리펙토링할 때는 커플링 대신 합성.
커플링과 합성의 차이점은?
https://slidesplayer.org/slide/14110085/
끄-읏!
궁금한 점?

More Related Content

Similar to Deep dive functional thinking

11장 시스템
11장 시스템11장 시스템
11장 시스템kidoki
 
Design pattern 4
Design pattern 4Design pattern 4
Design pattern 4Daniel Lim
 
가계부 리펙토링.pdf
가계부 리펙토링.pdf가계부 리펙토링.pdf
가계부 리펙토링.pdf동준 김
 
카사 공개세미나1회 W.E.L.C.
카사 공개세미나1회  W.E.L.C.카사 공개세미나1회  W.E.L.C.
카사 공개세미나1회 W.E.L.C.Ryan Park
 
LucideWorks Banana 소개
LucideWorks Banana 소개 LucideWorks Banana 소개
LucideWorks Banana 소개 SuHyun Jeon
 
[Dev rookie]designpattern
[Dev rookie]designpattern[Dev rookie]designpattern
[Dev rookie]designpattern대영 노
 
Refactoring Tutorial 1주차[ Refactoring 개요]
Refactoring  Tutorial 1주차[ Refactoring 개요]Refactoring  Tutorial 1주차[ Refactoring 개요]
Refactoring Tutorial 1주차[ Refactoring 개요]Bingu Shim
 
Refactoring Tutorial 1주차[ Refactoring 개요]
Refactoring  Tutorial 1주차[ Refactoring 개요]Refactoring  Tutorial 1주차[ Refactoring 개요]
Refactoring Tutorial 1주차[ Refactoring 개요]Bingu Shim
 
Architecture patterns with python (2)
Architecture patterns with python (2)Architecture patterns with python (2)
Architecture patterns with python (2)동환 김
 
[아꿈사] The C++ Programming Language 9장 소스 파일과 프로그램
[아꿈사] The C++ Programming Language 9장 소스 파일과 프로그램[아꿈사] The C++ Programming Language 9장 소스 파일과 프로그램
[아꿈사] The C++ Programming Language 9장 소스 파일과 프로그램해강
 
The art of readable code ch4 ch8
The art of readable code ch4   ch8The art of readable code ch4   ch8
The art of readable code ch4 ch8Ki Sung Bae
 
파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 Yong Joon Moon
 
Javascript refactoring workshop
Javascript refactoring workshopJavascript refactoring workshop
Javascript refactoring workshopJaehoon Oh
 
Effective c++ 4
Effective c++ 4Effective c++ 4
Effective c++ 4현찬 양
 
Refactoring tutorial 1주차[refactoring 개요]
Refactoring tutorial 1주차[refactoring 개요]Refactoring tutorial 1주차[refactoring 개요]
Refactoring tutorial 1주차[refactoring 개요]bbongcsu
 

Similar to Deep dive functional thinking (20)

11장 시스템
11장 시스템11장 시스템
11장 시스템
 
C++ api design 품질
C++ api design 품질C++ api design 품질
C++ api design 품질
 
Design pattern 4
Design pattern 4Design pattern 4
Design pattern 4
 
가계부 리펙토링.pdf
가계부 리펙토링.pdf가계부 리펙토링.pdf
가계부 리펙토링.pdf
 
System+os study 4
System+os study 4System+os study 4
System+os study 4
 
7 8 1
7 8 17 8 1
7 8 1
 
카사 공개세미나1회 W.E.L.C.
카사 공개세미나1회  W.E.L.C.카사 공개세미나1회  W.E.L.C.
카사 공개세미나1회 W.E.L.C.
 
LucideWorks Banana 소개
LucideWorks Banana 소개 LucideWorks Banana 소개
LucideWorks Banana 소개
 
[Dev rookie]designpattern
[Dev rookie]designpattern[Dev rookie]designpattern
[Dev rookie]designpattern
 
React Redux React Native
React Redux React NativeReact Redux React Native
React Redux React Native
 
Refactoring Tutorial 1주차[ Refactoring 개요]
Refactoring  Tutorial 1주차[ Refactoring 개요]Refactoring  Tutorial 1주차[ Refactoring 개요]
Refactoring Tutorial 1주차[ Refactoring 개요]
 
Refactoring Tutorial 1주차[ Refactoring 개요]
Refactoring  Tutorial 1주차[ Refactoring 개요]Refactoring  Tutorial 1주차[ Refactoring 개요]
Refactoring Tutorial 1주차[ Refactoring 개요]
 
Architecture patterns with python (2)
Architecture patterns with python (2)Architecture patterns with python (2)
Architecture patterns with python (2)
 
[아꿈사] The C++ Programming Language 9장 소스 파일과 프로그램
[아꿈사] The C++ Programming Language 9장 소스 파일과 프로그램[아꿈사] The C++ Programming Language 9장 소스 파일과 프로그램
[아꿈사] The C++ Programming Language 9장 소스 파일과 프로그램
 
The art of readable code ch4 ch8
The art of readable code ch4   ch8The art of readable code ch4   ch8
The art of readable code ch4 ch8
 
파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 파이썬 플라스크 이해하기
파이썬 플라스크 이해하기
 
EC 789
EC 789EC 789
EC 789
 
Javascript refactoring workshop
Javascript refactoring workshopJavascript refactoring workshop
Javascript refactoring workshop
 
Effective c++ 4
Effective c++ 4Effective c++ 4
Effective c++ 4
 
Refactoring tutorial 1주차[refactoring 개요]
Refactoring tutorial 1주차[refactoring 개요]Refactoring tutorial 1주차[refactoring 개요]
Refactoring tutorial 1주차[refactoring 개요]
 

More from Jeong-gyu Kim

근육 기억으로 주도하는 테스트 주도 개발 입문하기
근육 기억으로 주도하는 테스트 주도 개발 입문하기근육 기억으로 주도하는 테스트 주도 개발 입문하기
근육 기억으로 주도하는 테스트 주도 개발 입문하기Jeong-gyu Kim
 
Api first design 개발의 선순환
Api first design 개발의 선순환Api first design 개발의 선순환
Api first design 개발의 선순환Jeong-gyu Kim
 
Design by contract(계약에의한설계)
Design by contract(계약에의한설계)Design by contract(계약에의한설계)
Design by contract(계약에의한설계)Jeong-gyu Kim
 
JPA Study - 1주차(SLIPP)
JPA Study - 1주차(SLIPP)JPA Study - 1주차(SLIPP)
JPA Study - 1주차(SLIPP)Jeong-gyu Kim
 
얼굴인식 - 기초
얼굴인식 - 기초얼굴인식 - 기초
얼굴인식 - 기초Jeong-gyu Kim
 
02.cnn - CNN 파헤치기 3탄
02.cnn - CNN 파헤치기 3탄02.cnn - CNN 파헤치기 3탄
02.cnn - CNN 파헤치기 3탄Jeong-gyu Kim
 
01.cnn - 본격CNN논문 파헤치기
01.cnn - 본격CNN논문 파헤치기01.cnn - 본격CNN논문 파헤치기
01.cnn - 본격CNN논문 파헤치기Jeong-gyu Kim
 
코드 재사용에 대해서 생각해보기
코드 재사용에 대해서 생각해보기 코드 재사용에 대해서 생각해보기
코드 재사용에 대해서 생각해보기 Jeong-gyu Kim
 
Spark로 알아보는 빅데이터 처리
Spark로 알아보는 빅데이터 처리Spark로 알아보는 빅데이터 처리
Spark로 알아보는 빅데이터 처리Jeong-gyu Kim
 
'객체지향의 사실과 오해' 북 리뷰 세미나
'객체지향의 사실과 오해' 북 리뷰 세미나'객체지향의 사실과 오해' 북 리뷰 세미나
'객체지향의 사실과 오해' 북 리뷰 세미나Jeong-gyu Kim
 
Functional thinking - 책 리뷰 1탄
Functional thinking - 책 리뷰 1탄Functional thinking - 책 리뷰 1탄
Functional thinking - 책 리뷰 1탄Jeong-gyu Kim
 
Intern pt sw_r&d_len_second_mission
Intern pt sw_r&d_len_second_missionIntern pt sw_r&d_len_second_mission
Intern pt sw_r&d_len_second_missionJeong-gyu Kim
 
Log Parser Story In Python3
Log Parser Story In Python3Log Parser Story In Python3
Log Parser Story In Python3Jeong-gyu Kim
 
Node.js를 활용한 웹 크롤링(Crawling)
Node.js를 활용한 웹 크롤링(Crawling)Node.js를 활용한 웹 크롤링(Crawling)
Node.js를 활용한 웹 크롤링(Crawling)Jeong-gyu Kim
 

More from Jeong-gyu Kim (18)

Id generator
Id generatorId generator
Id generator
 
근육 기억으로 주도하는 테스트 주도 개발 입문하기
근육 기억으로 주도하는 테스트 주도 개발 입문하기근육 기억으로 주도하는 테스트 주도 개발 입문하기
근육 기억으로 주도하는 테스트 주도 개발 입문하기
 
Api first design 개발의 선순환
Api first design 개발의 선순환Api first design 개발의 선순환
Api first design 개발의 선순환
 
Design by contract(계약에의한설계)
Design by contract(계약에의한설계)Design by contract(계약에의한설계)
Design by contract(계약에의한설계)
 
JPA Study - 1주차(SLIPP)
JPA Study - 1주차(SLIPP)JPA Study - 1주차(SLIPP)
JPA Study - 1주차(SLIPP)
 
얼굴인식 - 기초
얼굴인식 - 기초얼굴인식 - 기초
얼굴인식 - 기초
 
02.cnn - CNN 파헤치기 3탄
02.cnn - CNN 파헤치기 3탄02.cnn - CNN 파헤치기 3탄
02.cnn - CNN 파헤치기 3탄
 
01.cnn - 본격CNN논문 파헤치기
01.cnn - 본격CNN논문 파헤치기01.cnn - 본격CNN논문 파헤치기
01.cnn - 본격CNN논문 파헤치기
 
00.cnn basic
00.cnn basic00.cnn basic
00.cnn basic
 
코드 재사용에 대해서 생각해보기
코드 재사용에 대해서 생각해보기 코드 재사용에 대해서 생각해보기
코드 재사용에 대해서 생각해보기
 
Spark로 알아보는 빅데이터 처리
Spark로 알아보는 빅데이터 처리Spark로 알아보는 빅데이터 처리
Spark로 알아보는 빅데이터 처리
 
'객체지향의 사실과 오해' 북 리뷰 세미나
'객체지향의 사실과 오해' 북 리뷰 세미나'객체지향의 사실과 오해' 북 리뷰 세미나
'객체지향의 사실과 오해' 북 리뷰 세미나
 
Functional thinking - 책 리뷰 1탄
Functional thinking - 책 리뷰 1탄Functional thinking - 책 리뷰 1탄
Functional thinking - 책 리뷰 1탄
 
Intern pt sw_r&d_len_second_mission
Intern pt sw_r&d_len_second_missionIntern pt sw_r&d_len_second_mission
Intern pt sw_r&d_len_second_mission
 
Log Parser Story In Python3
Log Parser Story In Python3Log Parser Story In Python3
Log Parser Story In Python3
 
Stampfood 2.0
Stampfood 2.0Stampfood 2.0
Stampfood 2.0
 
You dont know_js
You dont know_jsYou dont know_js
You dont know_js
 
Node.js를 활용한 웹 크롤링(Crawling)
Node.js를 활용한 웹 크롤링(Crawling)Node.js를 활용한 웹 크롤링(Crawling)
Node.js를 활용한 웹 크롤링(Crawling)
 

Deep dive functional thinking