함수 : 코드를 사용할 수 있는 최소 단위
함수의 기본 구조
- 반환하는 값이 있을 경우 반환타입을 명시해야 한다.
- 반환타입과 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
'Kotlin > Kotlin문법' 카테고리의 다른 글
[Kotlin 문법] 반복문 (1) | 2024.04.19 |
---|---|
[Kotlin 문법] 배열(Array), 리스트(List), 셋(Set), 맵(Map) (0) | 2024.04.19 |
[Kotlin 문법] 조건식(if, when) (0) | 2024.04.14 |
[Kotlin 문법] 변수 & 기본 데이터 타입(자료형) (0) | 2024.04.14 |