코틀린 (Kotlin) 함수 정리



식이 본문인 함수

코틀린은 루프를 제외한 대부분의 제어구조가 식입니다.
if, when, try ...와 같은 제어문이 식으로 표현될 수 있습니다.

1. return 에 식으로 대입 할 수 있다.

fun max(a: Int, b: Int) : Int {
     return if (a > b) a else b
}

2. '=' 으로 식을 대입할 수 있습니다.

fun max(a: Int, b: Int) : Int = if (a > b) a else b

3. 함수에 반환타입을 생략하면 컴파일러는 리턴 타입을 추론하여 리턴할 수 있습니다.

  • 식이 본문이 함수만 생략가능합니다.
fun max(a: Int, b: Int) = if (a > b) a else b

블록이 본문인 함수

중괄호로 둘러 쌓인 함수를 블록이 본문인 함수라고 합니다.
  • 블록인 경우 return 으로 값을 반환해야됩니다. 
fun max(a: Int, b: Int) : Int {
        if (a > b) {
            return a
        } else {
            return b
        }
 }

코틀린 함수 - 이름 붙인 인자

함수에 파라메터가 많은 경우 파라메터를 순서에 맞게 잘 넣었는지 혼란스러울 때가 있습니다.
그런경우 코틀린 함수에서는 파라메터 인자에 이름을 붙여 명확하게 사용할 수 있습니다.
함수(파라메터 이름 = 값, 파라메터 이름 = 값, ... ) 처럼 사용할 수 있습니다.
다만, 두번째 파라메터부터 '파라메터 이름 = 값' 을 사용했다면, 이후 뒤에 있는 파라메터들은 모두 '파라메터 이름 = 값' 을 붙여야합니다.

//파라메터가 복잡합니다.
fun makeText(text: String, prefix: String, postfix: String, separator: String) : String{
     return "{$prefix}{$separator}{$text}{$separator}{$postfix}"
}

//prefix="hello~" 를 사용한 이후 인자들은 모두 이름을 붙여야 합니다.
makeText("kotlin", prefix = "hello~", postfix = "world", separator = "|")

코틀린 함수 - 디폴트 파라미터 사용하기

자바에서는 오버로딩된 메서드가 많아서 곤혹스러울 때가 있습니다.
코틀린에서는 디폴트 파라미터를 사용해서 오버로딩된 중복 코드를 줄일 수 있습니다.

prefix: String="hello~" 처럼 인자와 등호를 사용해서 디폴트 값을 지정할 수 있습니다.

//디폴트 파라미터 추가
fun makeText(text: String, prefix: String="hello~", postfix: String="world", separator: String="|") : String{
    return "{$prefix}{$separator}{$text}{$separator}{$postfix}"
}

//디폴트값을 사용해서 간단하게 함수 사용
makeText("kotlin")
makeText("kotlin", "hi")
makeText("kotlin", "hi", "world")
makeText("kotlin", "hi", separator = "|")

위 코드처럼 오버로딩 함수를 구현할 필요없이 다양한 조합으로 함수를 사용할 수 있습니다.
이름을 붙여 사용할 수도 있고 순서대로 디폴트 값외에 필요한 값을 넣어 사용할 수 있습니다.

자바에서는 디폴트 파라미터가 있는 함수를 사용할 수 없습니다.
대신 @JvmOverloads 를 사용하면, 컴파일러가 자동으로 맨 마지막 파라메터부터 제거된 메소드를 생성해 줍니다.

@JvmOverloads
fun makeText(text: String, prefix: String="hello~", postfix: String="world", separator: String="|") : String{
    return "{$prefix}{$separator}{$text}{$separator}{$postfix}"
}

코틀린 최상위 함수

보통 자바에서 유틸 클래스를 만들어 사용합니다.
StringUtil.empty() 처럼 클래스명을 붙여 사용합니다.
불필요한 클래스 생성대신 코틀린에서는 클래스 밖에 위치한 패키지 레벨의 멤버 함수를 정의할 수 있습니다.

StringUtil.kt

package com.zerogdev.mykotlin.function.other

//클래스 밖에 있는 함수
fun makeText(...) : String{
 ...
}

이렇게 정의된 최상위 함수는 import com.zerogdev.mykotlin.function.other.makeText 하여 클래스 없이 바로 사용할 수 있습니다.

import com.zerogdev.mykotlin.function.other.makeText //임포트

class Activity {
    fun onCreate(savedInstanceState: Bundle?) {
        makeText("kotlin") //바로 사용 가능
    }
}

최상위 함수를 자바에서 사용하기

자바에서는 컴파일된 코틀린 파일 이름이 (파일이름)Kt.java 로 변경됩니다.
그러므로 자바에서 코틀린 클래스로 접근하면 postfix 에 Kt를 붙여야합니다.
최상위 함수가 컴파일되면 파일이름클래스명(StringUtil.Kt) 로 변경되고 함수는 static 함수가 됩니다.

java 파일

StringUtilKt.makeText("kotlin") //파일이름kt 로 static 함수에 접근

최상위 함수에서 자바에 노출되는 클래스 이름 변경하기

package 보다 위에 @file:JvmName 을 추가해서 ...Kt.java 가 아닌 원하는 이름으로 자바에서 사용할 수 있습니다.

//패키지 위에 자바에서 사용하길 원하는 이름을 설정할 수 있음
@file:JvmName("StringUtil") 
package com.zerogdev.mykotlin.function

fun makeText(...) : String{
 ...
}

//자바에서 사용할때
StringUtil.makeText("kotlin")

최상위 프로퍼티

최상위 프로퍼티는 val 인경우 getter 를 통해 가져오고 var 인경우 getter/setter 를 사용합니다.

fun reportCount() {
    log("TYPE_ONE=$TYPE_ONE") //최상위 프로퍼티 값을 로그 출력
}

fun setCount(count:String) {
    TYPE_TWO = count //최상위 프로퍼티에 값 설정
}

상수로 사용될경우 const 변경자를 사용합니다.
const 변경자는 public static final 로 컴파일됩니다.
다만, const는 원시타입String 타입만 가능합니다.

val TYPE_ONE = "1" //getter 를 사용(getTYPE_ONE() 라는 getter()가 생성됨)
var TYPE_TWO = "2" //getter, setter 사용
const val TYPE_THREE = "3" //const 는 원시타입과 String 만 'public static final' 로 컴파일이 된다

//JAVA 에서 사용
String pOne = StringFunctions.getTYPE_ONE(); //getter
String pTwo = StringFunctions.getTYPE_TWO(); //getter
StringFunctions.setTYPE_TWO("two2"); //setter
String pThree = StringFunctions.TYPE_THREE; // public static final


댓글

이 블로그의 인기 게시물

코틀린 (Kotlin) filter, map, all, any, count, find, groupBy, flatMap 함수 정리

코틀린 (Kotlin) 인터페이스 정리

RecyclerView 에서 notifyItemChanged()의 payload 이해하기