코틀린 (Kotlin) 함수 정리
식이 본문인 함수
코틀린은 루프를 제외한 대부분의 제어구조가 식입니다.if, when, try ...와 같은 제어문이 식으로 표현될 수 있습니다.
1. return 에 식으로 대입 할 수 있다.
fun max(a: Int, b: Int) : Int {
return if (a > b) a else b
}
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
}
}
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 = "|")
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 = "|")
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}"
}
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{
...
}
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") //바로 사용 가능
}
}
class Activity {
fun onCreate(savedInstanceState: Bundle?) {
makeText("kotlin") //바로 사용 가능
}
}
최상위 함수를 자바에서 사용하기
자바에서는 컴파일된 코틀린 파일 이름이 (파일이름)Kt.java 로 변경됩니다.그러므로 자바에서 코틀린 클래스로 접근하면 postfix 에 Kt를 붙여야합니다.
최상위 함수가 컴파일되면 파일이름이 클래스명(StringUtil.Kt) 로 변경되고 함수는 static 함수가 됩니다.
java 파일
StringUtilKt.makeText("kotlin") //파일이름kt 로 static 함수에 접근
StringUtilKt.makeText("kotlin") //파일이름kt 로 static 함수에 접근
최상위 함수에서 자바에 노출되는 클래스 이름 변경하기
package 보다 위에 @file:JvmName 을 추가해서 ...Kt.java 가 아닌 원하는 이름으로 자바에서 사용할 수 있습니다.
//패키지 위에 자바에서 사용하길 원하는 이름을 설정할 수 있음
@file:JvmName("StringUtil")
package com.zerogdev.mykotlin.function
fun makeText(...) : String{
...
}
//자바에서 사용할때
StringUtil.makeText("kotlin")
@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 //최상위 프로퍼티에 값 설정
}
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
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
댓글
댓글 쓰기