Kotlin/Kotlin문법

[Kotlin 문법] 함수

Happy._. 2024. 4. 23. 16:12

함수 : 코드를 사용할 수 있는 최소 단위

 

함수의 기본 구조

  • 반환하는 값이 있을 경우 반환타입을 명시해야 한다.
  • 반환타입과 return 값을 정의하지 않으면 반환값이 없는 함수가 된다.
  • 파라미터명을 정의하지 않으면 입력값이 없는 함수가 된다.
fun 함수명(파라미터 이름: 타입): 반환 타입 {
    return 값
}

 

단일 함수 표현식

함수가 단일 표현식을 사용할 경우 중괄호({}) 없이 다음과 같이 작성할 수 있다.

fun add(x: Int, y: Int) = x + y

 

함수의 사용

  • 함수를 사용하기 위해서는 함수명 옆에 괄호()가 있어야 실행된다. → 함수명(값)
  • 파라미터가 없는 경우 값을 입력하지 않는다. → 함수명()
  • 반환값이 없는 경우는 변수에 대입 없이 사용한다.
    • 반환값이 없는 경우도 변수에 대입은 가능하다. 
    • 반환타입이 Unit이 되며, println()으로 출력 시 kotlin.Unit가 출력된다.
  • 반환값이 있는 경우 대입 연산자(=)로 변수에 대입 후 사용한다.
// 입력값이 없는 경우
call()

// 반환값이 없는 경우 - return X, kotlin.Unit
user("name")

// 반환값이 있는 경우
val result = add(2, 3)
println(result) // 5

 

함수 파라미터 정의

  • 함수 파라미터를 통해 입력되는 모든 값은 immutable로 val 키워드가 생략된 형태라 할 수 있다.
  • 다음 이미지는 파라미터 x에 Int 값을 대입했을 때 에러가 발생하는 상황이다.

fun setUser(name: String, age: Int) { /* 실행코드 */ }

 

파라미터의 기본값 설정

파라미터의 기본값을 설정하면 함수 호출 시 값을 생략했을 때 기본값으로 사용된다.

fun setUser(name: String, age: Int = 10) {
    println("${name}의 나이는 ${age}입니다.")
}

setUser("yoyo") // yoyo의 나이는 10입니다.

setUser(10, "yoyo") // X, 파라미터의 순서를 지키지 않아서 X
// The integer literal does not conform to the expected type String
// Type mismatch: inferred type is String but Int was expected

 

파라미터의 이름으로 값 입력

  • 파라미터의 이름으로 값을 입력하면 순서와 상관없이 정의된 파라미터에 값이 입력된다.
  • 함수에 정의된 파라미터가 많아 입력하는 값의 의미가 명확하지 않을 때 이름을 지정해서 입력하므로 어떤 파라미터를 사용하는지 알기 쉽다.
fun setUser(name: String, age: Int) {
    println("${name}의 나이는 ${age}입니다.")
}

setUser(age = 30, name = "yoyo") // yoyo의 나이는 30입니다.

setUser("yoyo", age = 10) // O

setUser(age = 10, "yoyo") // X, 명명된 인수와 위치 지정된 인수 혼합 X
// Mixing named and positioned arguments is not allowed
// No value passed for parameter 'name'

 

가변 길이 함수 파라미터 - vararg

  • vararg 키워드를 사용하면 지정된 데이터 타입의 파라미터를 임의의 개수만큼 받을 수 있다.
  • 여러 타입의 값을 가변 길이로 받으려면 파라미터의 타입을 Any로 지정한다.
  • vararg 파라미터가 맨 뒤에 있는게 아니라면 뒤에 오는 파라미터는 파라미터 이름으로 값을 넣어야 한다.
fun strings(vararg strings: String) {
    strings.forEach { println(it) }
}

strings("one", "two", "three", "four") // one two three four

fun displayAnythings(vararg anythings: Any) {
    anythings.forEach { println(it) }
}

displayAnythings("one", 2, "three", '4') // one 2 three 4

 

람다 표현식

람다 표현식의 선언 구문은 다음과 같다.

{ 파라미터 이름: 타입, ... -> /* 람다 표현식 */  }
  • 람다 표현식은 변수에 할당할 수 있다.
  • 람다 안의 마지막 표현식은 반환값으로 사용된다. (return 키워드 X)
val printMessage = { println("Hello World") }
printMessage() // Hello World

val add = { a: Int, b: Int -> a + b }
println(add(2, 3)) // 5

val result = { println("Hello World");  true}
println(result()) // Hello World true

 

함수 참조 연산자(::)

fun multiply (x: Int, y: Int) = x * y

val mul = ::multiply // 함수 참조

println(mul(5, 5))

val add = { a: Int, b: Int -> a + b }
val add2 = ::add // X, 람다 함수는 이름이 없으므로 :: 연산자로 참조할 수 없음

 

고차 함수

함수나 람다를 인수로 받거나 결괏값으로 반환하는 함수이다.

fun operate(calculation: (Int, Int) -> Int, x: Int, y: Int) = calculation(x, y)

fun add(x: Int, y: Int) = x + y

val result1 = operate(::add, 2, 3) // 함수 참조
val result2 = operate({ x, y -> x + y }, 2, 3) // 람다 표현식

println(result1) // 5
println(result2) // 5