[코틀린 기초] Function 함수 예제 모음.
코틀린은 자바보다 다양한 함수 사용 스타일을 보여준다.
default Parameter나 named argument를 봤을 때는 자바를 사용하는 실무에서 마주칠법한 오류에 많은 도움이 될 것 같아보였다. 다른 내용들은 기본적인 내용이므로 코틀린을 많이 작성하다 보면 잘 익어갈만한 내용으로 보인다!
기본적인 함수
fun sum(num1 : Int, num2 : Int) : Int {
return num1 + num2
}
표현식 스타일 함수
fun sum2(num1 : Int, num2 : Int) : Int = num1 + num2
표현식과 반환 타입을 생략 가능한 함수
fun sum3(num1 : Int, num2 : Int) = num1 + num2
(단계가 어째 자바 람다식 축약하는 것 같다...)
코틀린에서 함수는 몸통({})이 있는 경우 반환 타입을 제거하면 컴파일 오류가 발생한다.
// 몸통이 있는 함수는 반환 타입을 제거하면 컴파일 오류
fun sum4(num1 : Int, num2 : Int) : Int /* 이거 제거하면 안됨. */ {
return num1 + num2
}
코틀린에서는 void라는 키워드가 없고 Unit 이라는 키워드가 있다. 아래의 함수는 자바로 치면 void 코틀린 Unit을 반환하는 함수이다.
// 반환 타입이 없는 함수는 Unit을 반환한다. (Void)
fun printSum(num1 : Int, num2 : Int) {
println("$num1 + $num2 = ${num1 + num2}")
}
Default Parameter
fun greeting(message: String = "디폴트 파라미터 셋팅!!") {
println(message)
}
fun main() {
greeting()
greeting("다른 파라미터 전달!!!")
}
// 디폴트 파라미터 셋팅!!
// 다른 파라미터 전달!!!
코틀린에서는 함수를 작성할 때 파라미터 영역에 값을 미리 설정할 수 있다.
자바에서는 메소드의 파라미터 선언에서는 값을 설정할 수 없고 메소드 몸통 내에서 실행흐름을 갖을 때 바로 대입해주어야 했을텐데 코틀린에서는 이러한 기능을 문법적으로 제공한다.
Named Argument
fun log(level: String = "INFO", message: String) {
println("[$level] $message")
}
fun main() {
log(message = "인포 로그")
log(level = "DEBUG", "디버그 로그")
log("WARN", "워닝 로그")
log(level = "ERROR", message = "에러 로그")
}
// [INFO] 인포 로그
// [DEBUG] 디버그 로그
// [WARN] 워닝 로그
// [ERROR] 에러 로그
디폴트 파라미터와 혼용된 모습인데. 우선 log라는 함수를 호출할 때, 함수의 파라미터에 값을 대입하듯 대입식을 argument로 전달할 수 있다는 모습으로 보인다. 여기서 대입식을 전달할때 함수에 쓰여진 파라미터 순서는 대입식에는 영향을 끼치지 못한다는 것이다.
message = "에러로그" 로 전달된 named argument는 message 파라미터 변수에 할당될 뿐이지 level 변수에 영향을 끼치지는 않는다는 것이다.
아래를 보자.
fun log(level: String = "INFO", message: String) {
println("[$level] $message")
}
fun main() {
log("디버그 로그", "DEBUG")
log(message = "디버그 로그", level = "DEBUG")
}
// [디버그 로그] DEBUG
// [DEBUG] 디버그 로그
위의 두 함수 호출 결과는 정반대로 발생한다. 전달하는 argument의 순서는 동일한것 같으나 첫번째 호출에서는 둘다 String 값이다보니 어느 변수에 정확히 할당되는지 개발자가 런타임을 확인한 후에 알 수 있었다.
두번째 호출은 named argument를 활용하여 전달하였기 때문에 argument는 parameter에 값이 할당될 때 parameter 변수명을 보고 개발자가 의도한 대로 할당된다.
해당 게시물은 아래의 강의를 토대로 작성된 예제입니다.