SlideShare a Scribd company logo
1 of 64
Download to read offline
@l2hyunwoo
KotlinConf’23 Global in Songdo
Mathpresso Inc. Android/React Native Developer
Functional Kotlin
Makes
Kotlin functional
HyunWoo Lee
함수형 프로그래밍과 오해
Lambda Algebra Monoid
Functor / Applicative Functor Tail recursion
Currying
함수형 프로그래밍과 오해
Lambda Algebra Monoid
Functor / Applicative Functor Tail recursion
Currying
정말 이게 실제 개발에 의미가 있을까요?
함수형 프로그래밍 접근
목적을 이해하고
어떻게 사용해야할 지 알아야 하며
그 이후에 무엇이 있는 지 파악해도 늦지 않다
Why we should use it?
함수형 프로그래밍을 활용하면
코드를 간결하게 작성할 수 있고 기능의 확장이 쉬우며
보다 안전한 코드를 작성할 수 있다
간결한 코드 작성하기
간결한 코드 작성하기
간결한 코드 작성하기
간결한 코드 작성하기
변동을 줄이면서 안정성 높이기
변동을 줄이면서 안정성 높이기
변동을 줄이면서 안정성 높이기
객체/외부 상태의
변동이 있는 부분은
블록 Scope으로
격리한다
잠깐! 이거 함수형 프로그래밍이 맞나요?
Functional Programming is sometimes treated as synonymous with
Purely functional programming.
When a pure function is called with some given arguments,
it will always return the same result,
and cannot be affected by any mutable state or other side effect.
-
Hudak, Paul (Conception, evolution and application of functional programming lauguages)
Pure Function and Side Effect
function sum(x: int, y: int)
Pure Function and Side Effect
function sum(x: int, y: int)
(
2, 5
)
Pure Function and Side Effect
function sum(x: int, y: int)
(
2, 5
)
7
function sum(x: int, y: int)
(
2, 5
)
7
입력이 동일하면
결과가 항상 같은 함수를
순수 함수
(
Pure Function)
라 한다
Pure Function and Side Effect
Pure Function and Side Effect
function sumWithSideEffect(x: int, y: int)
Pure Function and Side Effect
function sumWithSideEffect(x: int, y: int)
(
2, 5
)
1st
Pure Function and Side Effect
function sumWithSideEffect(x: int, y: int)
(
2, 5
)
7
1st
Pure Function and Side Effect
function sumWithSideEffect(x: int, y: int)
(
3, 6
)
2nd
Pure Function and Side Effect
function sumWithSideEffect(x: int, y: int)
(
3, 6
)
2nd
16
Pure Function and Side Effect
function sumWithSideEffect(x: int, y: int)
(
3, 6
)
2nd
16
Pure Function and Side Effect
Pure Function and Side Effect
함수 내에서 관장하지 않는,
전역 상태/변수 혹은 (파일, 화면) 입출력등을 포함한
외부 상태에 영향을 줄 수 있고 이를 관찰하는 행위를 포함하는 함수를
Side Effect라 한다.
Pure Function and Side Effect
함수형 프로그래밍을 활용하면
코드를 간결하게 작성할 수 있고 기능의 확장이 쉬우며
보다 안전한 코드를 작성할 수 있다
Pure Function and Side Effect
순수함수를 사용하면 동일한 결과를 예측할 수 있으므로 (참조 투명성)
함수 그 자체를 모듈화된 기능으로 사용할 수 있다.
또한 외부 가변 상태를 변경하지 않으므로
동시성 프로그래밍에서 공유 자원 변경에 대한 관심사를 제할 수 있다.
이런 이점으로 함수형 프로그래밍에서는 순수 함수의 사용을 지향한다.
Aspect of Functional Programming
그러면 순수 함수만을 사용하는 것이
함수형 프로그래밍 방식일까?
Aspect of Functional Programming
그렇기는 하나,
그래가지곤 간단한 기능 하나조차
제대로 만들 수 없다
Aspect of Functional Programming
외부 세계를 변경을 시켜야 하나
변경을 시키는 부분을 최소화하고 구분(격리)시키자
변동을 줄이면서 안정성 높이기
객체/외부 상태의
변동이 있는 부분은
블록 Scope으로
격리한다
고차함수를 활용한 기능 확장
고차함수를 활용한 기능 확장
CSV가 아닌 다른 파일 형식
혹은 Plain Text로 Append
하는 기능이 추가된다면?
고차함수를 활용한 기능 확장
객체를 String으로 전환하는 로직을
외부에서 주입시켜
공통 로직에 다형성을 제공
중간 점검
을 이해하고
사용해야할 지 알아야 하며
그 이후에 무엇이 있는 지 파악해도 늦지 않다
목적
어떻게
중간 점검
→ 안정성, 유지보수성, 가독성 증가
→ 순수함수 활용, Side Effect 격리
목적
어떻게
More, Functional Programming
고차함수를 활용하여 재사용성을 끌어올리고
보다 더 안정적으로 프로그래밍을 하고 싶다면?
More, Functional Programming
고차함수를 활용하여 재사용성을 끌어올리고
보다 더 안정적으로 프로그래밍을 하고 싶다면?
고차함수를 활용하는 객체(객체 컨테이너)의
특성을 알고, 이를 활용하면 된다
Category Theory
고차함수를 활용하여 새로운 타입/기능을 제공하기 위해선
이를 구성하는 타입에 대해 알아야 한다.
함수형에 적절한 “컨테이너"
Monad
함수형에 적절한 “컨테이너"
Monad는 엔도펑터 카테고리의 모노이드
Monad
함수형에 적절한 “컨테이너"
Monad는 엔도펑터 카테고리의 모노이드
Monad
Category Theory
범주론
(
Category Theory)에서는 구조체
(
Object)와
구조체들간의 관계
(
Morphism, 사상)를 다룬다
Functor
두 카테고리 간의 함수이고
구조체는 구조체로, 함수는 함수로 대응시키는 함수
Functor
이러면 어디서 많이본 것 같지 않나요?
Functor
Functor의 중첩 문제
Monoid
위의 성질을 만족하는 카테고리
Monoid
위의 성질을 만족하는 카테고리
(연산중 어느 일부분을 먼저 수행하더라도 괜찮다 정도의 의미)
Monad
Monad
Monad
이 성질을 활용하여 중첩된 타입을 벗길 수 있다
Monad
flatMap 함수를 생각해보자!
Monad
Nested Optional로 가득찼던 코드도
Monad
Monad 응용: 여러 케이스를 한 쪽으로
Monad 응용: 여러 케이스를 한 쪽으로
에러 발생 시 에러 타입을 Monad 타입으로 한번 더 감싸준다면?
Monad를 활용한 상태 처리의 이점
Monad 내부 상태를 아는 것과 상관없이
개발자가 로직을 체이닝해도 문제가 없도록 처리
할 수 있다
Monad is Everywhere
Spring Reactor(Mono)
Monad is Everywhere
RxJava (Kotlin)
Monad is Everywhere
Monad is Everywhere
Kotlin Result
Monad is Everywhere
Compose Modifier
Thanks!
@l2hyunwoo
KotlinConf’23 Global in Songdo
Mathpresso Inc. Android/React Native Developer
Slido

More Related Content

Similar to Functional Kotlin makes Kotlin functional

스프링 코어 강의 1부 - 봄 맞이 준비 운동
스프링 코어 강의 1부 - 봄 맞이 준비 운동스프링 코어 강의 1부 - 봄 맞이 준비 운동
스프링 코어 강의 1부 - 봄 맞이 준비 운동Sungchul Park
 
Ndc2010 김주복, v3. 마비노기2아키텍처리뷰
Ndc2010   김주복, v3. 마비노기2아키텍처리뷰Ndc2010   김주복, v3. 마비노기2아키텍처리뷰
Ndc2010 김주복, v3. 마비노기2아키텍처리뷰Jubok Kim
 
반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게Sungju Jin
 
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019min woog kim
 
Effective c++ chapter5 6_ 131039 신동찬
Effective c++ chapter5 6_ 131039 신동찬Effective c++ chapter5 6_ 131039 신동찬
Effective c++ chapter5 6_ 131039 신동찬Dong Chan Shin
 
주니어 개발자도 이해 할 수 있는 Go - Scope 편
주니어 개발자도 이해 할 수 있는 Go - Scope 편주니어 개발자도 이해 할 수 있는 Go - Scope 편
주니어 개발자도 이해 할 수 있는 Go - Scope 편Darion Kim
 
Open Source Engineering V2
Open Source Engineering V2Open Source Engineering V2
Open Source Engineering V2YoungSu Son
 
소프트웨어설계론
소프트웨어설계론소프트웨어설계론
소프트웨어설계론JeongDong Kim
 
[Td 2015]너에게만 나는 반응해 반응형 응용프로그램(이규원)
[Td 2015]너에게만 나는 반응해 반응형 응용프로그램(이규원)[Td 2015]너에게만 나는 반응해 반응형 응용프로그램(이규원)
[Td 2015]너에게만 나는 반응해 반응형 응용프로그램(이규원)Sang Don Kim
 
ScriptRunner 꼼지락꼼지락
ScriptRunner 꼼지락꼼지락ScriptRunner 꼼지락꼼지락
ScriptRunner 꼼지락꼼지락Yunseok Lee
 
Effective c++ chapter3, 4 요약본
Effective c++ chapter3, 4 요약본Effective c++ chapter3, 4 요약본
Effective c++ chapter3, 4 요약본Dong Chan Shin
 
카사 공개세미나1회 W.E.L.C.
카사 공개세미나1회  W.E.L.C.카사 공개세미나1회  W.E.L.C.
카사 공개세미나1회 W.E.L.C.Ryan Park
 
(편집-테스트카페 발표자료) 1인 QA 수행사례로 발표한 자료 (W프로젝트 사례)
(편집-테스트카페 발표자료) 1인 QA 수행사례로 발표한 자료 (W프로젝트 사례)(편집-테스트카페 발표자료) 1인 QA 수행사례로 발표한 자료 (W프로젝트 사례)
(편집-테스트카페 발표자료) 1인 QA 수행사례로 발표한 자료 (W프로젝트 사례)SangIn Choung
 
프로그래밍 언어 기초(델파이,C++)
프로그래밍 언어 기초(델파이,C++)프로그래밍 언어 기초(델파이,C++)
프로그래밍 언어 기초(델파이,C++)Devgear
 
Effective c++chapter4
Effective c++chapter4Effective c++chapter4
Effective c++chapter4성연 김
 
[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규
[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규
[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규ChangKyu Song
 
The Cucumber for Java
The Cucumber for JavaThe Cucumber for Java
The Cucumber for JavaJonghwa Lee
 

Similar to Functional Kotlin makes Kotlin functional (20)

스프링 코어 강의 1부 - 봄 맞이 준비 운동
스프링 코어 강의 1부 - 봄 맞이 준비 운동스프링 코어 강의 1부 - 봄 맞이 준비 운동
스프링 코어 강의 1부 - 봄 맞이 준비 운동
 
Ndc2010 김주복, v3. 마비노기2아키텍처리뷰
Ndc2010   김주복, v3. 마비노기2아키텍처리뷰Ndc2010   김주복, v3. 마비노기2아키텍처리뷰
Ndc2010 김주복, v3. 마비노기2아키텍처리뷰
 
반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게
 
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
 
C++ api design 품질
C++ api design 품질C++ api design 품질
C++ api design 품질
 
Effective c++ chapter5 6_ 131039 신동찬
Effective c++ chapter5 6_ 131039 신동찬Effective c++ chapter5 6_ 131039 신동찬
Effective c++ chapter5 6_ 131039 신동찬
 
주니어 개발자도 이해 할 수 있는 Go - Scope 편
주니어 개발자도 이해 할 수 있는 Go - Scope 편주니어 개발자도 이해 할 수 있는 Go - Scope 편
주니어 개발자도 이해 할 수 있는 Go - Scope 편
 
Open Source Engineering V2
Open Source Engineering V2Open Source Engineering V2
Open Source Engineering V2
 
소프트웨어설계론
소프트웨어설계론소프트웨어설계론
소프트웨어설계론
 
[Td 2015]너에게만 나는 반응해 반응형 응용프로그램(이규원)
[Td 2015]너에게만 나는 반응해 반응형 응용프로그램(이규원)[Td 2015]너에게만 나는 반응해 반응형 응용프로그램(이규원)
[Td 2015]너에게만 나는 반응해 반응형 응용프로그램(이규원)
 
ScriptRunner 꼼지락꼼지락
ScriptRunner 꼼지락꼼지락ScriptRunner 꼼지락꼼지락
ScriptRunner 꼼지락꼼지락
 
Design patterns
Design patternsDesign patterns
Design patterns
 
Effective c++ chapter3, 4 요약본
Effective c++ chapter3, 4 요약본Effective c++ chapter3, 4 요약본
Effective c++ chapter3, 4 요약본
 
카사 공개세미나1회 W.E.L.C.
카사 공개세미나1회  W.E.L.C.카사 공개세미나1회  W.E.L.C.
카사 공개세미나1회 W.E.L.C.
 
(편집-테스트카페 발표자료) 1인 QA 수행사례로 발표한 자료 (W프로젝트 사례)
(편집-테스트카페 발표자료) 1인 QA 수행사례로 발표한 자료 (W프로젝트 사례)(편집-테스트카페 발표자료) 1인 QA 수행사례로 발표한 자료 (W프로젝트 사례)
(편집-테스트카페 발표자료) 1인 QA 수행사례로 발표한 자료 (W프로젝트 사례)
 
프로그래밍 언어 기초(델파이,C++)
프로그래밍 언어 기초(델파이,C++)프로그래밍 언어 기초(델파이,C++)
프로그래밍 언어 기초(델파이,C++)
 
팀장 잔소리
팀장 잔소리팀장 잔소리
팀장 잔소리
 
Effective c++chapter4
Effective c++chapter4Effective c++chapter4
Effective c++chapter4
 
[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규
[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규
[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규
 
The Cucumber for Java
The Cucumber for JavaThe Cucumber for Java
The Cucumber for Java
 

Functional Kotlin makes Kotlin functional