-
1. 함수 생성
fun greet() = "Hello" println(greet) // hello 출력
코틀린에서 함수는 fun 함수이름, 함수 파라미터, 함수 본문으로 구성된다. 함수 본문은 =이나 {}로 구성 할 수 있다.
리턴타입과 타입 추론
단일표현식이고 {} 블록으로 구현된 함수가 아닌 경우 리턴 타입 추론이 발생한다.
직접 리턴 타입을 명시할 때는 아래와 같이 할 수 있다.
fun hello(): String = "hello"
모든 함수는 표현식
코틀린에서 모든 함수는 표현식이다. 만약 아무것도 리턴할 것이 없으면 Unit 타입을 리턴 타입으로 추론한다.
fun unitFunction() { } println("result of unit function: ${unitFunction()}") //출력: result of unit function: kotlin.Unit
파라미터 정의하기
함수 파라미터는 반드시 타입을 붙여주어야한다. 코틀린에서 함수나 메소드의 파라미터 값은 바꿀 수 없다.
fun functionHasParameter(arg: String): String { return arg } fun functionChangeParameter(arg: String): String { arg = "abcd" // val cannot be reassigned 컴파일 에러 발생 }
블록바디로 만든 함수
{} 로 정의한 함수는 반드시 리턴 타입을 정의해주어야한다. 정의하지 않으면 Unit으로 추론된다.
= 과 {} 을 동시에 사용할 때는 조심해야한다. = 이후 {}으로 바디를 구현하면 익명 함수를 리턴하는 함수를 구현하는 것이다.
fun notReally() = {2} println(notReally()) // () -> kotlin.Int println(notReally()()) // 2
2. 기본 인자와 명시적 인자
기본인자
fun greet(name: String, msg: String = "Hello"): String = "$msg $name" println("기본 아규먼트" + greet("park")) // 출력: 기본 아규먼트Hello park println("기본 아규먼트 2" + greet("park", " Hi")) // 출력: 기본 아규먼트 2 Hi park
코틀린에서는 인자 타입 명시 이후에 기본 값을 줄 수 있다.
기본인자는 표현식으로 줄 수도 있다.
명시적 아규먼트
fun createItem(name: String, quantity: Int, price: Int, discountRate: Double) { println("name: $name quantity: $quantity price: $price discountRate: $discountRate") } println("명시적 아규먼트") createItem("Apple", 100, 1000, 0.0) createItem(name="Apple", quantity = 100, price=1000, discountRate=0.0) createItem("Apple", 100, discountRate = 0.0, price=1000) // 출력 명시적 아규먼트 name: Apple quantity: 100 price: 1000 discountRate: 0.0 name: Apple quantity: 100 price: 1000 discountRate: 0.0 name: Apple quantity: 100 price: 1000 discountRate: 0.0
코틀린에서는 함수를 호출할때 아규먼트 이름을 직접 정해서 값을 호출할 수도 있다.
3. 다중 인자와 스프레드
여러 개의 인자
fun max1(numbers: IntArray): Int { var maximum = Int.MIN_VALUE for(number in numbers) { maximum = if(number > maximum) number else maximum } return maximum } println("다중 인자") println(max1(intArrayOf(1, 2, 3, 4, 5))) fun max(vararg numbers: Int): Int { var maximum = Int.MIN_VALUE for(number in numbers) { maximum = if(number > maximum) number else maximum } return maximum } println("다중인자") println(max(1, 2, 3, 4, 5)) // 출력 다중인자 5 다중인자 5
위의 코드는 여러개의 숫자에서 가장 큰 값을 찾는 함수를 두 가지 방법으로 구현한 것이다.
vararg를 사용하면 여러 개의 인자를 받을 수 있다.
- vararg는 함수당 한 개만 사용할 수 있다.
- vararg는 마지막에 두는 것이 좋다. 마지막에 위치하지 않으면 명시적 인자를 사용해야 한다.
- 마지막 파라미터가 람다 표현식일 경우 마지막 파라미터 바로 전에 둔다.
스프레드 연산자
vararg가 여러 개의 파라미터를 받을 수 있는 특징이 있지만 배열을 넣으면 에러가 발생한다.
이럴때는 *를 이용하면 배열의 원소를 개별 인자로 늘려 넘겨줄 수 있다.
println(max(intArrayOf(1, 2, 3, 4, 5))) // 에러발생 println(max(*intArrayOf(1, 2, 3, 4, 5))) // 출력: 5 println(max(*listOf(1,2,3,4,5).toIntArray())) // 출력: 5
리스트를 사용할때는 배열로 변경해서 스프레드 연산자를 사용해야한다.
4. 구조분해
구조분해: 객체에서 값을 추출해 변수로 만드는 작업
코틀린의 구조 분해는 위치를 기반으로 해서 이뤄진다.
fun getName() = Triple("Park", "Kim", "Son") val result = getName() println("${result.first} ${result.second} ${result.third}") // Park Kim Son val (park, kim, son) = getName() println("$park $kim $son") // Park Kim Son val (a12, _, c1) = getName() println("$a12 $c1") // Park Son val (a1, b1) = getName() println("$a1 $b1") // Park Kim
받고싶지 않은 변수는 _ 로 넘길 수도 있다.
참고
다재다능 코틀린 프로그래밍 3장
'코틀린' 카테고리의 다른 글
[코틀린] 클래스와 상속 (0) 2022.03.13 [코틀린] 객체와 클래스 (0) 2022.03.13 [코틀린] 타입 안정성 (0) 2022.03.07 [코틀린] 컬렉션 (0) 2022.03.07 [코틀린] 외부 반복과 아규먼트 매칭 (0) 2022.03.07