티스토리 뷰
함수 선언
-
중괄호 안의 코드가 한줄이면 중괄호와 return 키워드 생략 가능
-
잡플래닛 코드 예) MyProfileExperienceActivity.kt - uiEventObserve
fun convertScreenName(name : String) : String { return "HelloWorld $name!" } fun convertScreenName(name : String) : String = "HelloWorld $name!"
반환값이 없는 함수
-
반환 키워드(Unit)을 생략할 수 있음
-
Unit vs Void : 자바의 void는 아무것도 반환하지 않지만, Unit은 특수한 객체를 반환한다는 차이점이 존재함
fun onDetailSubItemClick(docUrl: String) : Unit { detailViewModelInterface.openWebBrowser(docUrl) } fun onDetailSubItemClick(docUrl: String) { detailViewModelInterface.openWebBrowser(docUrl) }
매개변수 함수 활용
-
매개변수의 기본값 지정 가능
fun onDetailSubItemClick(docUrl: String = "https://www.naver.com") = detailViewModelInterface.openWebBrowser(docUrl)
-
매개변수 이름과 함께 함수 호출 가능
fun setMeetingRoom(name: String, address: String) { // ... } fun main() { setMeetingRoom( name = "미팅룸1", address = "지하1층 B01" ) }
인자 갯수가 고정되지 않은 함수
-
vararg 키워드의 argument를 통해 여러개의 인자를 받아서 함수를 생성할 수 있음
private val numbers: IntArray = intArrayOf(1, 2, 3, 4, 5) private val intArray = intArrayOf(6, 7, 8, 9) private fun printNumberArray(vararg numbers: IntArray) { for (i in numbers) { println(i) } } fun main() { printNumberArray(numbers) printNumberArray(intArray) }
함수형 프로그래밍
- 순수함수를 작성하여 프로그램의 부작용을 줄이는 프로그래밍 기법
- 람다식 / 고차함수 사용
순수 함수
-
함수 외부의 어떤 상태도 바꾸지 않는다는 의미의 함수를 순수 함수라고 칭한다.
- 같은 인자에 대하여 항상 같은 값을 반환
- 함수 외부의 어떤 상태도 바꾸지 않는다.
// 동일한 인자 a,b를 입력받아 항상 a + b를 출력(부작용 X) fun sum(a : Int, b: Int) : Int = a + b
일급 객체
- 함수형 프로그래미에서는 함수를 일급 객체로 생각
- 특징
- 일급 객체는 함수의 인자로 전달할 수 있다.
- 일급 객체는 함수의 반환값에 사용할 수 있다.
- 일급 객체는 변수에 담을 수 있다.
- 특징
고차함수 및 람다식
-
다른 함수를 인자로 사용하거나 함수를 결과값으로 반환하는 함수
private fun highOrderFunction(sum: (Int, Int) -> Int, a: Int, b: Int): Int = sum(a, b) fun main() { println( highOrderFunction( { x, y -> x + y }, 20, 30 ) ) }
-
일반함수를 인자나 반환값으로 사용하는 고차함수
private fun sum(a: Int, b: Int): Int = a + b private fun sumFunction(): Int = sum(40, 2) fun main() { println("sunFunction result = ${sumFunction()}") }
- 람다식을 인자나 반환값으로 사용하는 고차함수
fun main() { val multiply = { x: Int, y: Int -> x * y } println("곱셈 결과 = ${multiply(8, 8)}") }
- 반환 자료형이 아예 없거나 매개변수가 하나만 있을때의 고차함수
val helloWorld: () -> Unit = { println("Hello World!") } val ourSelfSum : (Int) -> Int = { a -> a + a }
-
람다식 안에 람다식을 넣는 람다식 함수
val nestedLambda: () -> () -> Unit = { { println("nested 1") } } val nestedLambda: () -> () = { { println("nested 2") } }
-
인자와 반환값이 없는 람다식 함수
val print: () -> Unit = { println("print") } val print = { println("print") }
함수형 프로그래밍의 정의와 특징
- 순수 함수를 사용해야 한다.
- 람다식을 사용할 수 있다.
- 고차함수를 사용할 수 있다.
인라인 함수
-
해당 함수가 호출되는 곳에 함수 본문의 내용을 모두 복사하여 함수의 분기 없이 처리됨
-
인라인 함수는 람다식 매개변수를 가지고 있는 함수에서 동작
-
inlineFunc 함수가 두번 호출되는 것처럼 보이겠지만 디컴파일 시 inlineFunc 내용이 복사되어 보여지게 됨
inline fun inlineFunc(x: Int, out: (Int) -> Unit) = out(x) fun main() { inlineFunc(6) { println("First $it") } inlineFunc(1) { println("Second $it") } }
아웃라인 함수
-
인라인 함수의 매개변수 람다식 코드가 너무 길거나 인라인 함수의 본문자체가 길어지면 성능 오버헤드 이슈가 발생함
-
일부 람다식을 인라인되지 않기 위해 사용
inline fun sub(out1: () -> Unit, out2: () -> Unit) { } inline fun subToNoInline(out1: () -> Unit, noinline out2: () -> Unit) { }
확장 함수
-
기존 클래스에 내가 원하는 함수를 포함 시켜 확장하고 싶을 때 확장 함수 사용
-
잡플래닛의 extension에서 잘 사용하고 있음.
/** * 전화번호 하이픈(-) 넣기 */ fun String.convertNumberToPhoneNumber(): String { return try { val regexString = "(\\d{3})(\\d{3,4})(\\d{4})" return if (!Pattern.matches(regexString, this)) this else Regex(regexString).replace( this, "$1-$2-$3" ) } catch (e: ParseException) { e.printStackTrace() this }
중위 함수(infix)
-
클래스의 멤버를 호출할 때 사용하는 점(.)을 생략하고 함수 이름 뒤에 소괄호를 붙이지 않아 직관적인 이름을 사용할 수 있는 표현법
- 멤버 메서드 또는 확장함수 여야 한다.
- 하나의 매개변수를 가져야 한다.
- infix 키워드를 사용하여 정의한다.
infix fun Int.multiply(x: Int): Int { return this * x } fun main() { println("multiply result = ${3 multiply 10}") }
'프로그래밍 > Kotlin' 카테고리의 다른 글
[Kotlin] 클래스와 객체, 프로퍼티와 초기화 / 인터페이스 (1) | 2020.03.15 |
---|---|
[Kotlin] 흐름제어(조건문, 반복문) (0) | 2020.03.15 |
[Kotlin] 변수와 자료형 / 연산자 (0) | 2020.03.15 |
[Kotlin] Kotlin Coding Convention (0) | 2019.08.03 |
[Kotlin] 컬렉션(Collection) (0) | 2018.12.30 |
- Total
- Today
- Yesterday
- 1260
- a^b
- #kotlin
- kotlin
- 문자열
- 최대공약수와 최소공배수
- 조세퍼스 문제
- 영상처리
- 함수형사고 Kotlin Java
- 큰 수 A+B
- 2743
- 10757
- 1158
- algorithm
- OpenCV
- GCD 합
- 피보나치 수 4
- 단어 길이 재기
- #android #motionlayout
- mssql
- 10827
- constraintlayout
- algorihtm
- Eclipse
- 1237
- javacv
- 알고리즘
- 자동타입
- 10826
- 10828
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |