KISS 함수Top level function@JvmName파라미터 정의블록바디로 만든 함수default arg와 named argvarargs ( 다중인자 )스프레드 연산자구조분해(Destructuring)open 키워드Unit vs Nothing
KISS 함수
fun greet() = "Hello" println(greet())
- 함수가 매우 짧은 single-expression function 이라면 함수 바디를 {} 로 만드는 대신 함수 정의 부분과 함수 바디를 = 로 구분할 수 있다.
- 코틀린은 {} 바디가 없는 함수에 대해 타입 추론을 해줌
- return 키워드는 single-expression function 에서 사용 불가
Top level function
코틀린에서는 top level 에 class를 정의하지 않고 function을 정의할 수 있음
이 function을 자바 코드에서 호출 시, 해당 파일의 이름을 가진 클래스의 정적 함수로써 인식하고 호출하게 됨
@JvmName

@JvmName을 통해 탑레벨 함수를 호출 시 클래스 이름을 변경할 수 있음
파라미터 정의
fun greet(name: String): String = "Hello $name" println(greet("Eve")) // Hello Eve
- 코틀린은 함수로 전달된 파라미터를 변경하는 것은 나쁜 생각이라는 결론을 내렸고, 함수나 메서드에서 파라미터의 값을 변화시키려는 시도는 컴파일 오류를 발생시킴
블록바디로 만든 함수
- {} 블록 바디를 이용하여 함수를 정의하면 항상 리턴 타입을 정의해줘야 함. 정의하지 않으면 리턴 타입
Unit(void)
로 추론됨!
default arg와 named arg
- 기본 아규먼트 기능을 쓰면 바이너리가 변경되므로 컴파일을 다시 해야 함
- default arg는 파라미터 리스트의 가장 마지막에. 람다표현식이 파라미터로 들어오면 해당 파라미터 바로 앞 자리
fun greet(name: String, msg: String = "Hello") : String = "$msg $name" println(greet("Eve"))// Hello Eve println(greet("Eve", "Howdy")) // Howdy Eve
fun createPerson(name: String, age: Int = 1, height: Int, weight : Int) { println("$name $age $height $weight") } createPerson(name = "Jake", age = 12, weight =43, height = 152)
varargs ( 다중인자 )
fun max(varargs numbers: Int) : Int { var large = Int.MIN_VALUE for (number in numbers) { large = if (number > large) number else large } return large }
스프레드 연산자
배열
이나리스트에
있는 값들을 vararg 인자로 함수에 전달하고 싶을 때
val values = intArrayOf(1, 21, 3) println(max(values)) // ERROR println(max(*values)) // 21
- 인자의 앞에
*
를 붙이는 것만으로 우리는 배열의 값들을 추출해서 vararg 파라미터에 다중인자로 넘기라고 요청하게 되는 것
- 배열에는 * 를 바로 적용 가능하지만, 리스트에는 불가능. 리스트를 배열로 변경후 적용해야 함
구조분해(Destructuring)
- 구조화란 다른 변수의 값으로 객체를 만드는 것
- 이미 존재하는 객체에서 값을 추출해 변수로 넣는 작업
- Javascript와는 다르게 코틀린의 구조분해는 속성의 이름이 아닌 속성의 위치를 기반으로 진행된다.
fun getFullName() = Triple("John", "Quincy", "Adams") val result = getFullName() val first = result.first val middle = result.middle val last = result.last println("$first $middle $last") // 위의 코드를 구조분해를 사용하면 아래와 같이 바꿀수 있다. val (first, middle, last) = getFullName()
open 키워드
open fun 을 붙이면 해당 fun 을 override 할 수 있음
Unit vs Nothing
- 함수가 아무것도 반환하지 않을때
Unit
으로 반환타입이 지정됨
- 반환타입을 아무것도 정의해주지 않았을 때도
Unit
으로 정의됨
- kotlin 에서는 throw 가 expression 이라, throw의 타입이
Nothing
임
- 반환 유형이 Nothing인 함수가 호출되면 이 함수 호출 이후로 실행되지 않고, 컴파일러에서 경고를 내보냄(Unreachable Code)