SlideShare a Scribd company logo
1 of 61
Kotlin with FP
basic
우명인
Kotlin
• OOP 와 FP 둘다 가능한 멀티 패러다임 언어.
Kotlin
• OOP 와 FP 둘다 가능한 멀티 패러다임 언어.
• JetBrains 에서 개발한 언어
Kotlin
• OOP 와 FP 둘다 가능한 멀티 패러다임 언어.
• JetBrains 에서 개발한 언어
• JVM에서 실행되는 언어
• Java 와 100% 호환 (점진적으로 확대 적용 가능)
Kotlin
• OOP 와 FP 둘다 가능한 멀티 패러다임 언어.
• JetBrains 에서 개발한 언어
• JVM에서 실행되는 언어
• Java 와 100% 호환 (점진적으로 확대 적용 가능)
• Google I/O에서 Android 공식언어
Kotlin
• OOP 와 FP 둘다 가능한 멀티 패러다임 언어.
• JetBrains 에서 개발한 언어
• JVM에서 실행되는 언어
• Java 와 100% 호환 (점진적으로 확대 적용 가능)
• Google I/O에서 Android 공식언어
• Spring 5에서 공식 지원
FP
• Functional Programming이란 OOP와 전혀 다른 개념이 아
니다.
• OOP를 잘 이해하고 있어야 FP를 잘 사용 할 수 있다.
FP
• Functional Programming이란 OOP와 전혀 다른 개념이 아
니다.
• OOP를 잘 이해하고 있어야 FP를 잘 사용 할 수 있다.
• Immutable 한 자료구조를 사용해 SideEffect를 최소화.
FP
• Functional Programming이란 OOP와 전혀 다른 개념이 아
니다.
• OOP를 잘 이해하고 있어야 FP를 잘 사용 할 수 있다.
• Immutable 한 자료구조를 사용해 SideEffect를 최소화.
• 상태를 바꾸기 보다는 변경 불가능한 데이터와 순수 함수를
이용 한 프로그래밍.
FP
• Functional Programming이란 OOP와 전혀 다른 개념이 아
니다.
• OOP를 잘 이해하고 있어야 FP를 잘 사용 할 수 있다.
• Immutable 한 자료구조를 사용해 SideEffect를 최소화.
• 상태를 바꾸기 보다는 변경 불가능한 데이터와 순수 함수를
이용 한 프로그래밍.
• 모든 것은 객체다. (함수도 객체)
Variable
var testInt: Int = 32
Variable
var testInt: Int = 32
keyword name type
value
Variable
•(val or var) name: type = value
• var testInt: Int = 32
Variable
•(val or var) name: type = value
• var testInt: Int = 32
• var testInt = 32
Variable
•(val or var) name: type = value
• var testInt: Int = 32
• var testInt = 32
• val testStr: String = “Hello, World”
Variable
•(val or var) name: type = value
• var testInt: Int = 32
• var testInt = 32
• val testStr: String = “Hello, World”
• val testStr = “Hello, World”
Variable
• var
• variable
• read/write
• Java normal variable
• val
• value
• readOnly
• Java final variable
Variable
val immutable: String = "immutable"
var mutable: String = "mutable"
immutable = "test" // Error
mutable = "test" // Ok
Variable
val value: Int
value = 3 // Ok
value = 4 // Error
Variable
• 함수형 프로그래밍을 해보고 싶거나 SideEffect를 피하고
싶다면 var 보다는 val을 사용하는 습관이 좋습니다.
Variable
• 함수형 프로그래밍을 해보고 싶거나 SideEffect를 피하고
싶다면 var 보다는 val을 사용하는 습관이 좋습니다.
• 변수 선언 시: 타입 을 생략 하면 컴파일러가 추론합니다.,
하지만 명시적으로 타입을 선언해 주는게 가독성이나 유지
보수 측면에 좋습니다.
Variable
• 함수형 프로그래밍을 해보고 싶거나 SideEffect를 피하고
싶다면 var 보다는 val을 사용하는 습관이 좋습니다.
• 변수 선언 시: 타입 을 생략 하면 컴파일러가 추론합니다.,
하지만 명시적으로 타입을 선언해 주는게 가독성이나 유지
보수 측면에 좋습니다.
• ;(세미콜론) 은 한줄에 여러 변수를 선언하지 않는다면 생략
가능 합니다.
Function
fun add(x: Int, y: Int): Int {
return x + y
}
Function
fun add(x: Int, y: Int): Int {
return x + y
}
함수키워드 함수이름 파라미터 반환타입
Body
Function
fun add(x: Int, y: Int): Int = x + y
함수키워드 함수이름 파라미터 반환타입
Body
Function
• fun 키워드를 사용
Function
• fun 키워드를 사용
• 함수의 반환 타입을 생략 할수 없습니다. 생략이 가능 한 경우는 반환 타입
이 Unit일 경우에만 생략이 가능합니다.
Function
• fun 키워드를 사용
• 함수의 반환 타입을 생략 할수 없습니다. 생략이 가능 한 경우는 반환 타입
이 Unit일 경우에만 생략이 가능합니다.
• Unit은 Java의 Void와 비슷하게 생각하면 됩니다. 하지만 실제로 Unit은
Singleton 객체입니다.
Function
• fun 키워드를 사용
• 함수의 반환 타입을 생략 할수 없습니다. 생략이 가능 한 경우는 반환 타입
이 Unit일 경우에만 생략이 가능합니다.
• Unit은 Java의 Void와 비슷하게 생각하면 됩니다. 하지만 실제로 Unit은
Singleton 객체입니다.
• 리턴 타입을 생략하면 default 로 반환타입은 Unit이 됩니다.
Function
• fun 키워드를 사용
• 함수의 반환 타입을 생략 할수 없습니다. 생략이 가능 한 경우는 반환 타입
이 Unit일 경우에만 생략이 가능합니다.
• Unit은 Java의 Void와 비슷하게 생각하면 됩니다. 하지만 실제로 Unit은
Singleton 객체입니다.
• 리턴 타입을 생략하면 default 로 반환타입은 Unit이 됩니다.
• ;(세미콜론) 은 생략가능 합니다.
Function
• fun 키워드를 사용
• 함수의 반환 타입을 생략 할수 없습니다. 생략이 가능 한 경우는 반환 타입
이 Unit일 경우에만 생략이 가능합니다.
• Unit은 Java의 Void와 비슷하게 생각하면 됩니다. 하지만 실제로 Unit은
Singleton 객체입니다.
• 리턴 타입을 생략하면 default 로 반환타입은 Unit이 됩니다.
• ;(세미콜론) 은 생략가능 합니다.
• 함수의 Body가 한줄인 경우에는 { … } 대신 = 로 대신 할 수 있습니다.
Function
• fun 키워드를 사용
• 함수의 반환 타입을 생략 할수 없습니다. 생략이 가능 한 경우는 반환 타입
이 Unit일 경우에만 생략이 가능합니다.
• Unit은 Java의 Void와 비슷하게 생각하면 됩니다. 하지만 실제로 Unit은
Singleton 객체입니다.
• 리턴 타입을 생략하면 default 로 반환타입은 Unit이 됩니다.
• ;(세미콜론) 은 생략가능 합니다.
• 함수의 Body가 한줄인 경우에는 { … } 대신 = 로 대신 할 수 있습니다.
• class나 object 내부에 선언하지 않고 파일 레벨에 선언 할 수 있습니다.
실습
• https://try.kotlinlang.org
• -> My programs
First-class citizen
• 객체의 인자로 전달 할 수 있어야 한다.
• 객체의 반환값으로 반환 할 수 있어야 한다.
• 자료구조에 넣을 수 있어야 한다.
First-class citizen
• 객체의 인자로 전달 할 수 있어야 한다.
First-class citizen
• 객체의 인자로 전달 할 수 있어야 한다.
fun function(param: () -> Unit) {
param()
}
function({ println("Hello, World") })
// Hello, World
First-class citizen
• 객체의 반환값으로 반환 할 수 있어야 한다.
First-class citizen
• 객체의 반환값으로 반환 할 수 있어야 한다.
fun function(): () -> Unit {
return { println("Hello, World") }
}
First-class citizen
• 자료구조에 넣을 수 있어야 한다.
First-class citizen
• 자료구조에 넣을 수 있어야 한다.
fun function(): () -> Unit {
return { println("Hello, World") }
}
val value = function()
PureFunction
fun pureFunction(str: String): String {
return str + "Test"
}
PureFunction
fun pureFunction(str: String): String {
return str + "Test"
}
println(pureFunction("kotlin")) // kotlinTest
println(pureFunction("kotlin")) // kotlinTest
println(pureFunction("kotlin")) // kotlinTest
println(pureFunction("kotlin")) // kotlinTest
PureFunction
val strBuilder = StringBuilder()
fun nonePureFunction(str: String): String {
return str + strBuilder.append("Test").toString()
}
PureFunction
val strBuilder = StringBuilder()
fun nonePureFunction(str: String): String {
return str + strBuilder.append("Test").toString()
}
println(nonePureFunction("kotlin")) // kotlinTest
println(nonePureFunction("kotlin")) // kotlinTestTest
println(nonePureFunction("kotlin")) // kotlinTestTestTest
println(nonePureFunction("kotlin")) // kotlinTestTestTestTest
Higher-Order Function
fun simpleHighOrderFunction(sum: (Int, Int) -> Int, a: Int, b: Int): Int {
return sum(a, b)
}
fun simpleHighOrderFunction(a: Int, b: Int): () -> Int {
return { a + b }
}
Higher-Order Function
fun simpleHighOrderFunction(sum: (Int, Int) -> Int, a: Int, b: Int): Int {
return sum(a, b)
}
fun simpleHighOrderFunction(a: Int, b: Int): () -> Int {
return { a + b }
}
• 함수를 파라미터로 전달 받거나, 함수를 리턴하는 함수를
말합니다.
Higher-Order Function
interface Calcable {
int calc(int x, int y);
}
public class Sum implements Calcable {
@Override
public int calc(int x, int y) {
return x + y;
}
}
public class Minus implements Calcable {
@Override
public int calc(int x, int y) {
return x - y;
}
}
public class Product implements Calcable {
@Override
public int calc(int x, int y) {
return x * y;
}
}
/* Java */
Higher-Order Function
interface Calcable {
int calc(int x, int y);
}
public class Sum implements Calcable {
@Override
public int calc(int x, int y) {
return x + y;
}
}
public class Minus implements Calcable {
@Override
public int calc(int x, int y) {
return x - y;
}
}
public class Product implements Calcable {
@Override
public int calc(int x, int y) {
return x * y;
}
}
Calcable calcSum = new Sum();
Calcable calcMinus = new Minus();
Calcable calcProduct = new Multi();
int resultSum = calcSum.calc(1, 5); //6
int resultMinus = calcMinus.calc(5, 2); //3
int resultProduct = calcProduct.calc(4, 2); //8
/* Java */
Higher-Order Function
fun simpleHighOrderFunction(sum: (Int, Int) -> Int, a: Int, b: Int): Int {
return sum(a, b)
}
Higher-Order Function
fun simpleHighOrderFunction(sum: (Int, Int) -> Int, a: Int, b: Int): Int {
return sum(a, b)
}
val sum: (Int, Int) -> Int = { a, b -> a + b }
val product: (Int, Int) -> Int = { a, b -> a * b }
val minus: (Int, Int) -> Int = { a, b -> a - b }
Higher-Order Function
fun simpleHighOrderFunction(sum: (Int, Int) -> Int, a: Int, b: Int): Int {
return sum(a, b)
}
val sum: (Int, Int) -> Int = { a, b -> a + b }
val product: (Int, Int) -> Int = { a, b -> a * b }
val minus: (Int, Int) -> Int = { a, b -> a - b }
println(simpleHighOrderFunction(sum, 1, 5)) // 6
println(simpleHighOrderFunction(product, 5, 2)) // 10
println(simpleHighOrderFunction(minus, 4, 2)) // 8
Higher-Order Function
fun simpleHighOrderFunction(sum: (Int, Int) -> Int, a: Int, b: Int): Int {
return sum(a, b)
}
println(simpleHighOrderFunction({ x, y -> x + y }, 1, 5))
println(simpleHighOrderFunction({ x, y -> x - y }, 5, 2))
println(simpleHighOrderFunction({ x, y -> (x * y) + y }, 4, 2))
Anonymous Function
val value = sum(5, 10, { x, y -> x + y }
fun sum(x: Int, y: Int, function: (Int, Int) -> Int): Int {
return function(x, y)
}
Anonymous Function
val value = sum(5, 10, { x, y -> x + y }
fun sum(x: Int, y: Int, function: (Int, Int) -> Int): Int {
return function(x, y)
}
Anonymous Function
CallByValue
val function: () -> Unit = { println("Lezhin") }
fun callByValue(): Unit {
return function()
}
callByValue() // Lezhin
CallByName
val function: () -> Unit = { println("Lezhin") }
fun callByName(): () -> Unit {
return function
}
CallByName
val function: () -> Unit = { println("Lezhin") }
fun callByName(): () -> Unit {
return function
}
callByName() // nothing
CallByName
val function: () -> Unit = { println("Lezhin") }
fun callByName(): () -> Unit {
return function
}
callByName() // nothing
callByName().invoke() // Lezhin
callByName()() // Lezhin
CallByName
val function: () -> Unit = {
// 엄청 복잡하고 엄청 리소스가 많이 들고 엄청 오래걸리는 연산
println("OTL")
}
CallByName
val function: () -> Unit = {
// 엄청 복잡하고 엄청 리소스가 많이 들고 엄청 오래걸리는 연산
println("OTL")
}
fun firstClassCitizenFunction(func: () -> Unit, flag: Boolean) {
if (flag) {
func()
} else {
println("finish")
}
}
firstClassCitizenFunction(function, false) //finish
CallByName
val function: () -> Unit = {
// 엄청 복잡하고 엄청 리소스가 많이 들고 엄청 오래걸리는 연산
println("OTL")
}
fun firstClassCitizenFunction(func: () -> Unit, flag: Boolean) {
if (flag) {
func()
} else {
println("finish")
}
}
firstClassCitizenFunction(function, false) //finish
상황에 따라 특정 함수를 호출 할 수도 있고 호출 하지 않을 수 있다면 함수의 평가를 Lazy 하게
효율적으로처리 할 수 있습니다.

More Related Content

What's hot

스위프트 성능 이해하기
스위프트 성능 이해하기스위프트 성능 이해하기
스위프트 성능 이해하기Yongha Yoo
 
Swift3 generic
Swift3 genericSwift3 generic
Swift3 genericEunjoo Im
 
나에 첫번째 자바8 람다식 지앤선
나에 첫번째 자바8 람다식   지앤선나에 첫번째 자바8 람다식   지앤선
나에 첫번째 자바8 람다식 지앤선daewon jeong
 
Lambda 란 무엇인가
Lambda 란 무엇인가Lambda 란 무엇인가
Lambda 란 무엇인가Vong Sik Kong
 
Java8 & Lambda
Java8 & LambdaJava8 & Lambda
Java8 & Lambda기현 황
 
Swift3 subscript inheritance initialization
Swift3 subscript inheritance initializationSwift3 subscript inheritance initialization
Swift3 subscript inheritance initializationEunjoo Im
 
Swift3 typecasting nested_type
Swift3 typecasting nested_typeSwift3 typecasting nested_type
Swift3 typecasting nested_typeEunjoo Im
 
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로Oracle Korea
 
[2012 자바카페 OPEN 세미나] Introduction to google guava
[2012 자바카페 OPEN 세미나] Introduction to google guava[2012 자바카페 OPEN 세미나] Introduction to google guava
[2012 자바카페 OPEN 세미나] Introduction to google guava흥래 김
 
자바8 스트림 API 소개
자바8 스트림 API 소개자바8 스트림 API 소개
자바8 스트림 API 소개beom kyun choi
 
골때리는 자바스크립트 발표자료
골때리는 자바스크립트 발표자료골때리는 자바스크립트 발표자료
골때리는 자바스크립트 발표자료욱진 양
 
EcmaScript6(2015) Overview
EcmaScript6(2015) OverviewEcmaScript6(2015) Overview
EcmaScript6(2015) Overviewyongwoo Jeon
 
Python 활용: 이미지 처리와 데이터 분석
Python 활용: 이미지 처리와 데이터 분석Python 활용: 이미지 처리와 데이터 분석
Python 활용: 이미지 처리와 데이터 분석용 최
 

What's hot (20)

JDK 변천사
JDK 변천사JDK 변천사
JDK 변천사
 
Just java
Just javaJust java
Just java
 
스위프트 성능 이해하기
스위프트 성능 이해하기스위프트 성능 이해하기
스위프트 성능 이해하기
 
Swift3 generic
Swift3 genericSwift3 generic
Swift3 generic
 
나에 첫번째 자바8 람다식 지앤선
나에 첫번째 자바8 람다식   지앤선나에 첫번째 자바8 람다식   지앤선
나에 첫번째 자바8 람다식 지앤선
 
Lambda 란 무엇인가
Lambda 란 무엇인가Lambda 란 무엇인가
Lambda 란 무엇인가
 
Kotlin.md
Kotlin.mdKotlin.md
Kotlin.md
 
Java8 & Lambda
Java8 & LambdaJava8 & Lambda
Java8 & Lambda
 
Swift3 subscript inheritance initialization
Swift3 subscript inheritance initializationSwift3 subscript inheritance initialization
Swift3 subscript inheritance initialization
 
Swift3 typecasting nested_type
Swift3 typecasting nested_typeSwift3 typecasting nested_type
Swift3 typecasting nested_type
 
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로
 
[2012 자바카페 OPEN 세미나] Introduction to google guava
[2012 자바카페 OPEN 세미나] Introduction to google guava[2012 자바카페 OPEN 세미나] Introduction to google guava
[2012 자바카페 OPEN 세미나] Introduction to google guava
 
자바8 스트림 API 소개
자바8 스트림 API 소개자바8 스트림 API 소개
자바8 스트림 API 소개
 
골때리는 자바스크립트 발표자료
골때리는 자바스크립트 발표자료골때리는 자바스크립트 발표자료
골때리는 자바스크립트 발표자료
 
자바 8 학습
자바 8 학습자바 8 학습
자바 8 학습
 
EcmaScript6(2015) Overview
EcmaScript6(2015) OverviewEcmaScript6(2015) Overview
EcmaScript6(2015) Overview
 
Python 활용: 이미지 처리와 데이터 분석
Python 활용: 이미지 처리와 데이터 분석Python 활용: 이미지 처리와 데이터 분석
Python 활용: 이미지 처리와 데이터 분석
 
6 swift 고급함수
6 swift 고급함수6 swift 고급함수
6 swift 고급함수
 
Java8 람다
Java8 람다Java8 람다
Java8 람다
 
5 swift 기초함수
5 swift 기초함수5 swift 기초함수
5 swift 기초함수
 

Similar to Kotlin with fp

Feel functional
Feel functionalFeel functional
Feel functionalWonJun Lee
 
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)MIN SEOK KOO
 
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍Young-Beom Rhee
 
프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oopYoung-Beom Rhee
 
Scala, Scalability
Scala, ScalabilityScala, Scalability
Scala, ScalabilityDongwook Lee
 
자바스크립트 함수
자바스크립트 함수자바스크립트 함수
자바스크립트 함수유진 변
 
코딩인카페 C&JAVA 기초과정 C프로그래밍(3)
코딩인카페 C&JAVA 기초과정 C프로그래밍(3)코딩인카페 C&JAVA 기초과정 C프로그래밍(3)
코딩인카페 C&JAVA 기초과정 C프로그래밍(3)유익아카데미
 
안드로이드 설계코드 노하우 및 개발방법
안드로이드 설계코드 노하우 및 개발방법안드로이드 설계코드 노하우 및 개발방법
안드로이드 설계코드 노하우 및 개발방법mosaicnet
 
GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)
GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)
GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)Kyoungchan Lee
 
HolubOnPatterns/chapter3_3
HolubOnPatterns/chapter3_3HolubOnPatterns/chapter3_3
HolubOnPatterns/chapter3_3suitzero
 
Javascript 교육자료 pdf
Javascript 교육자료 pdfJavascript 교육자료 pdf
Javascript 교육자료 pdfHyosang Hong
 
Python programming for Bioinformatics
Python programming for BioinformaticsPython programming for Bioinformatics
Python programming for BioinformaticsHyungyong Kim
 
포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++KWANGIL KIM
 
Javascript - Function
Javascript - FunctionJavascript - Function
Javascript - Functionwonmin lee
 
I phone 2 release
I phone 2 releaseI phone 2 release
I phone 2 releaseJaehyeuk Oh
 
Let's Go (golang)
Let's Go (golang)Let's Go (golang)
Let's Go (golang)상욱 송
 
스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오Taeoh Kim
 

Similar to Kotlin with fp (20)

Feel functional
Feel functionalFeel functional
Feel functional
 
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)
 
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
 
프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop
 
Scala, Scalability
Scala, ScalabilityScala, Scalability
Scala, Scalability
 
Scalability
ScalabilityScalability
Scalability
 
Swift2
Swift2Swift2
Swift2
 
자바스크립트 함수
자바스크립트 함수자바스크립트 함수
자바스크립트 함수
 
코딩인카페 C&JAVA 기초과정 C프로그래밍(3)
코딩인카페 C&JAVA 기초과정 C프로그래밍(3)코딩인카페 C&JAVA 기초과정 C프로그래밍(3)
코딩인카페 C&JAVA 기초과정 C프로그래밍(3)
 
Scala
ScalaScala
Scala
 
안드로이드 설계코드 노하우 및 개발방법
안드로이드 설계코드 노하우 및 개발방법안드로이드 설계코드 노하우 및 개발방법
안드로이드 설계코드 노하우 및 개발방법
 
GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)
GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)
GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)
 
HolubOnPatterns/chapter3_3
HolubOnPatterns/chapter3_3HolubOnPatterns/chapter3_3
HolubOnPatterns/chapter3_3
 
Javascript 교육자료 pdf
Javascript 교육자료 pdfJavascript 교육자료 pdf
Javascript 교육자료 pdf
 
Python programming for Bioinformatics
Python programming for BioinformaticsPython programming for Bioinformatics
Python programming for Bioinformatics
 
포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++
 
Javascript - Function
Javascript - FunctionJavascript - Function
Javascript - Function
 
I phone 2 release
I phone 2 releaseI phone 2 release
I phone 2 release
 
Let's Go (golang)
Let's Go (golang)Let's Go (golang)
Let's Go (golang)
 
스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오
 

More from Myeongin Woo

DroidKnight 2018 State machine by Selaed class
DroidKnight 2018 State machine by Selaed classDroidKnight 2018 State machine by Selaed class
DroidKnight 2018 State machine by Selaed classMyeongin Woo
 
Lezhin kotlin jetbrain
Lezhin kotlin jetbrainLezhin kotlin jetbrain
Lezhin kotlin jetbrainMyeongin Woo
 
Kotlin collections
Kotlin collectionsKotlin collections
Kotlin collectionsMyeongin Woo
 
토이 프로젝트를 하자.Pptx
토이 프로젝트를 하자.Pptx토이 프로젝트를 하자.Pptx
토이 프로젝트를 하자.PptxMyeongin Woo
 

More from Myeongin Woo (8)

Goodbye null
Goodbye nullGoodbye null
Goodbye null
 
DroidKnight 2018 State machine by Selaed class
DroidKnight 2018 State machine by Selaed classDroidKnight 2018 State machine by Selaed class
DroidKnight 2018 State machine by Selaed class
 
Lezhin kotlin jetbrain
Lezhin kotlin jetbrainLezhin kotlin jetbrain
Lezhin kotlin jetbrain
 
Kotlin collections
Kotlin collectionsKotlin collections
Kotlin collections
 
Kotlin standard
Kotlin standardKotlin standard
Kotlin standard
 
Kotlin class
Kotlin classKotlin class
Kotlin class
 
Kotlin expression
Kotlin expressionKotlin expression
Kotlin expression
 
토이 프로젝트를 하자.Pptx
토이 프로젝트를 하자.Pptx토이 프로젝트를 하자.Pptx
토이 프로젝트를 하자.Pptx
 

Kotlin with fp

  • 2. Kotlin • OOP 와 FP 둘다 가능한 멀티 패러다임 언어.
  • 3. Kotlin • OOP 와 FP 둘다 가능한 멀티 패러다임 언어. • JetBrains 에서 개발한 언어
  • 4. Kotlin • OOP 와 FP 둘다 가능한 멀티 패러다임 언어. • JetBrains 에서 개발한 언어 • JVM에서 실행되는 언어 • Java 와 100% 호환 (점진적으로 확대 적용 가능)
  • 5. Kotlin • OOP 와 FP 둘다 가능한 멀티 패러다임 언어. • JetBrains 에서 개발한 언어 • JVM에서 실행되는 언어 • Java 와 100% 호환 (점진적으로 확대 적용 가능) • Google I/O에서 Android 공식언어
  • 6. Kotlin • OOP 와 FP 둘다 가능한 멀티 패러다임 언어. • JetBrains 에서 개발한 언어 • JVM에서 실행되는 언어 • Java 와 100% 호환 (점진적으로 확대 적용 가능) • Google I/O에서 Android 공식언어 • Spring 5에서 공식 지원
  • 7. FP • Functional Programming이란 OOP와 전혀 다른 개념이 아 니다. • OOP를 잘 이해하고 있어야 FP를 잘 사용 할 수 있다.
  • 8. FP • Functional Programming이란 OOP와 전혀 다른 개념이 아 니다. • OOP를 잘 이해하고 있어야 FP를 잘 사용 할 수 있다. • Immutable 한 자료구조를 사용해 SideEffect를 최소화.
  • 9. FP • Functional Programming이란 OOP와 전혀 다른 개념이 아 니다. • OOP를 잘 이해하고 있어야 FP를 잘 사용 할 수 있다. • Immutable 한 자료구조를 사용해 SideEffect를 최소화. • 상태를 바꾸기 보다는 변경 불가능한 데이터와 순수 함수를 이용 한 프로그래밍.
  • 10. FP • Functional Programming이란 OOP와 전혀 다른 개념이 아 니다. • OOP를 잘 이해하고 있어야 FP를 잘 사용 할 수 있다. • Immutable 한 자료구조를 사용해 SideEffect를 최소화. • 상태를 바꾸기 보다는 변경 불가능한 데이터와 순수 함수를 이용 한 프로그래밍. • 모든 것은 객체다. (함수도 객체)
  • 12. Variable var testInt: Int = 32 keyword name type value
  • 13. Variable •(val or var) name: type = value • var testInt: Int = 32
  • 14. Variable •(val or var) name: type = value • var testInt: Int = 32 • var testInt = 32
  • 15. Variable •(val or var) name: type = value • var testInt: Int = 32 • var testInt = 32 • val testStr: String = “Hello, World”
  • 16. Variable •(val or var) name: type = value • var testInt: Int = 32 • var testInt = 32 • val testStr: String = “Hello, World” • val testStr = “Hello, World”
  • 17. Variable • var • variable • read/write • Java normal variable • val • value • readOnly • Java final variable
  • 18. Variable val immutable: String = "immutable" var mutable: String = "mutable" immutable = "test" // Error mutable = "test" // Ok
  • 19. Variable val value: Int value = 3 // Ok value = 4 // Error
  • 20. Variable • 함수형 프로그래밍을 해보고 싶거나 SideEffect를 피하고 싶다면 var 보다는 val을 사용하는 습관이 좋습니다.
  • 21. Variable • 함수형 프로그래밍을 해보고 싶거나 SideEffect를 피하고 싶다면 var 보다는 val을 사용하는 습관이 좋습니다. • 변수 선언 시: 타입 을 생략 하면 컴파일러가 추론합니다., 하지만 명시적으로 타입을 선언해 주는게 가독성이나 유지 보수 측면에 좋습니다.
  • 22. Variable • 함수형 프로그래밍을 해보고 싶거나 SideEffect를 피하고 싶다면 var 보다는 val을 사용하는 습관이 좋습니다. • 변수 선언 시: 타입 을 생략 하면 컴파일러가 추론합니다., 하지만 명시적으로 타입을 선언해 주는게 가독성이나 유지 보수 측면에 좋습니다. • ;(세미콜론) 은 한줄에 여러 변수를 선언하지 않는다면 생략 가능 합니다.
  • 23. Function fun add(x: Int, y: Int): Int { return x + y }
  • 24. Function fun add(x: Int, y: Int): Int { return x + y } 함수키워드 함수이름 파라미터 반환타입 Body
  • 25. Function fun add(x: Int, y: Int): Int = x + y 함수키워드 함수이름 파라미터 반환타입 Body
  • 27. Function • fun 키워드를 사용 • 함수의 반환 타입을 생략 할수 없습니다. 생략이 가능 한 경우는 반환 타입 이 Unit일 경우에만 생략이 가능합니다.
  • 28. Function • fun 키워드를 사용 • 함수의 반환 타입을 생략 할수 없습니다. 생략이 가능 한 경우는 반환 타입 이 Unit일 경우에만 생략이 가능합니다. • Unit은 Java의 Void와 비슷하게 생각하면 됩니다. 하지만 실제로 Unit은 Singleton 객체입니다.
  • 29. Function • fun 키워드를 사용 • 함수의 반환 타입을 생략 할수 없습니다. 생략이 가능 한 경우는 반환 타입 이 Unit일 경우에만 생략이 가능합니다. • Unit은 Java의 Void와 비슷하게 생각하면 됩니다. 하지만 실제로 Unit은 Singleton 객체입니다. • 리턴 타입을 생략하면 default 로 반환타입은 Unit이 됩니다.
  • 30. Function • fun 키워드를 사용 • 함수의 반환 타입을 생략 할수 없습니다. 생략이 가능 한 경우는 반환 타입 이 Unit일 경우에만 생략이 가능합니다. • Unit은 Java의 Void와 비슷하게 생각하면 됩니다. 하지만 실제로 Unit은 Singleton 객체입니다. • 리턴 타입을 생략하면 default 로 반환타입은 Unit이 됩니다. • ;(세미콜론) 은 생략가능 합니다.
  • 31. Function • fun 키워드를 사용 • 함수의 반환 타입을 생략 할수 없습니다. 생략이 가능 한 경우는 반환 타입 이 Unit일 경우에만 생략이 가능합니다. • Unit은 Java의 Void와 비슷하게 생각하면 됩니다. 하지만 실제로 Unit은 Singleton 객체입니다. • 리턴 타입을 생략하면 default 로 반환타입은 Unit이 됩니다. • ;(세미콜론) 은 생략가능 합니다. • 함수의 Body가 한줄인 경우에는 { … } 대신 = 로 대신 할 수 있습니다.
  • 32. Function • fun 키워드를 사용 • 함수의 반환 타입을 생략 할수 없습니다. 생략이 가능 한 경우는 반환 타입 이 Unit일 경우에만 생략이 가능합니다. • Unit은 Java의 Void와 비슷하게 생각하면 됩니다. 하지만 실제로 Unit은 Singleton 객체입니다. • 리턴 타입을 생략하면 default 로 반환타입은 Unit이 됩니다. • ;(세미콜론) 은 생략가능 합니다. • 함수의 Body가 한줄인 경우에는 { … } 대신 = 로 대신 할 수 있습니다. • class나 object 내부에 선언하지 않고 파일 레벨에 선언 할 수 있습니다.
  • 34. First-class citizen • 객체의 인자로 전달 할 수 있어야 한다. • 객체의 반환값으로 반환 할 수 있어야 한다. • 자료구조에 넣을 수 있어야 한다.
  • 35. First-class citizen • 객체의 인자로 전달 할 수 있어야 한다.
  • 36. First-class citizen • 객체의 인자로 전달 할 수 있어야 한다. fun function(param: () -> Unit) { param() } function({ println("Hello, World") }) // Hello, World
  • 37. First-class citizen • 객체의 반환값으로 반환 할 수 있어야 한다.
  • 38. First-class citizen • 객체의 반환값으로 반환 할 수 있어야 한다. fun function(): () -> Unit { return { println("Hello, World") } }
  • 39. First-class citizen • 자료구조에 넣을 수 있어야 한다.
  • 40. First-class citizen • 자료구조에 넣을 수 있어야 한다. fun function(): () -> Unit { return { println("Hello, World") } } val value = function()
  • 41. PureFunction fun pureFunction(str: String): String { return str + "Test" }
  • 42. PureFunction fun pureFunction(str: String): String { return str + "Test" } println(pureFunction("kotlin")) // kotlinTest println(pureFunction("kotlin")) // kotlinTest println(pureFunction("kotlin")) // kotlinTest println(pureFunction("kotlin")) // kotlinTest
  • 43. PureFunction val strBuilder = StringBuilder() fun nonePureFunction(str: String): String { return str + strBuilder.append("Test").toString() }
  • 44. PureFunction val strBuilder = StringBuilder() fun nonePureFunction(str: String): String { return str + strBuilder.append("Test").toString() } println(nonePureFunction("kotlin")) // kotlinTest println(nonePureFunction("kotlin")) // kotlinTestTest println(nonePureFunction("kotlin")) // kotlinTestTestTest println(nonePureFunction("kotlin")) // kotlinTestTestTestTest
  • 45. Higher-Order Function fun simpleHighOrderFunction(sum: (Int, Int) -> Int, a: Int, b: Int): Int { return sum(a, b) } fun simpleHighOrderFunction(a: Int, b: Int): () -> Int { return { a + b } }
  • 46. Higher-Order Function fun simpleHighOrderFunction(sum: (Int, Int) -> Int, a: Int, b: Int): Int { return sum(a, b) } fun simpleHighOrderFunction(a: Int, b: Int): () -> Int { return { a + b } } • 함수를 파라미터로 전달 받거나, 함수를 리턴하는 함수를 말합니다.
  • 47. Higher-Order Function interface Calcable { int calc(int x, int y); } public class Sum implements Calcable { @Override public int calc(int x, int y) { return x + y; } } public class Minus implements Calcable { @Override public int calc(int x, int y) { return x - y; } } public class Product implements Calcable { @Override public int calc(int x, int y) { return x * y; } } /* Java */
  • 48. Higher-Order Function interface Calcable { int calc(int x, int y); } public class Sum implements Calcable { @Override public int calc(int x, int y) { return x + y; } } public class Minus implements Calcable { @Override public int calc(int x, int y) { return x - y; } } public class Product implements Calcable { @Override public int calc(int x, int y) { return x * y; } } Calcable calcSum = new Sum(); Calcable calcMinus = new Minus(); Calcable calcProduct = new Multi(); int resultSum = calcSum.calc(1, 5); //6 int resultMinus = calcMinus.calc(5, 2); //3 int resultProduct = calcProduct.calc(4, 2); //8 /* Java */
  • 49. Higher-Order Function fun simpleHighOrderFunction(sum: (Int, Int) -> Int, a: Int, b: Int): Int { return sum(a, b) }
  • 50. Higher-Order Function fun simpleHighOrderFunction(sum: (Int, Int) -> Int, a: Int, b: Int): Int { return sum(a, b) } val sum: (Int, Int) -> Int = { a, b -> a + b } val product: (Int, Int) -> Int = { a, b -> a * b } val minus: (Int, Int) -> Int = { a, b -> a - b }
  • 51. Higher-Order Function fun simpleHighOrderFunction(sum: (Int, Int) -> Int, a: Int, b: Int): Int { return sum(a, b) } val sum: (Int, Int) -> Int = { a, b -> a + b } val product: (Int, Int) -> Int = { a, b -> a * b } val minus: (Int, Int) -> Int = { a, b -> a - b } println(simpleHighOrderFunction(sum, 1, 5)) // 6 println(simpleHighOrderFunction(product, 5, 2)) // 10 println(simpleHighOrderFunction(minus, 4, 2)) // 8
  • 52. Higher-Order Function fun simpleHighOrderFunction(sum: (Int, Int) -> Int, a: Int, b: Int): Int { return sum(a, b) } println(simpleHighOrderFunction({ x, y -> x + y }, 1, 5)) println(simpleHighOrderFunction({ x, y -> x - y }, 5, 2)) println(simpleHighOrderFunction({ x, y -> (x * y) + y }, 4, 2))
  • 53. Anonymous Function val value = sum(5, 10, { x, y -> x + y } fun sum(x: Int, y: Int, function: (Int, Int) -> Int): Int { return function(x, y) }
  • 54. Anonymous Function val value = sum(5, 10, { x, y -> x + y } fun sum(x: Int, y: Int, function: (Int, Int) -> Int): Int { return function(x, y) } Anonymous Function
  • 55. CallByValue val function: () -> Unit = { println("Lezhin") } fun callByValue(): Unit { return function() } callByValue() // Lezhin
  • 56. CallByName val function: () -> Unit = { println("Lezhin") } fun callByName(): () -> Unit { return function }
  • 57. CallByName val function: () -> Unit = { println("Lezhin") } fun callByName(): () -> Unit { return function } callByName() // nothing
  • 58. CallByName val function: () -> Unit = { println("Lezhin") } fun callByName(): () -> Unit { return function } callByName() // nothing callByName().invoke() // Lezhin callByName()() // Lezhin
  • 59. CallByName val function: () -> Unit = { // 엄청 복잡하고 엄청 리소스가 많이 들고 엄청 오래걸리는 연산 println("OTL") }
  • 60. CallByName val function: () -> Unit = { // 엄청 복잡하고 엄청 리소스가 많이 들고 엄청 오래걸리는 연산 println("OTL") } fun firstClassCitizenFunction(func: () -> Unit, flag: Boolean) { if (flag) { func() } else { println("finish") } } firstClassCitizenFunction(function, false) //finish
  • 61. CallByName val function: () -> Unit = { // 엄청 복잡하고 엄청 리소스가 많이 들고 엄청 오래걸리는 연산 println("OTL") } fun firstClassCitizenFunction(func: () -> Unit, flag: Boolean) { if (flag) { func() } else { println("finish") } } firstClassCitizenFunction(function, false) //finish 상황에 따라 특정 함수를 호출 할 수도 있고 호출 하지 않을 수 있다면 함수의 평가를 Lazy 하게 효율적으로처리 할 수 있습니다.