1. 함수(Function)
함수를 선언하는 방식은 아래와 같다.
fun 식별자(): 반환타입 {
함수에 포함시킬 문장
}
샘플 코드를 살펴보자
함수 블록의 문장이 하나일 경우 한 줄로 축약할 수 있다.
타입을 추론할 수도 있기 때문에 함수의 반환 타입까지 생락이 가능하다.
fun main(args: Array<String>): Unit {
println(myFunction())
println(myFunction() + 10)
}
fun myFunction(): Int {
val a = 3
val b = 6
println("a: " + a + ", b: " + b)
return a + b
}
// 함수 블록의 문장이 하나일 경우 한 줄로 축약할 수 있다.
fun function(): Double {
return 3.0 + 7
}
// 위와 같이 문장이 하나뿐인 블록은 =를 이용하여 줄여쓸 수 있다.
fun function2(): Double = 3.0 + 7
// 타입을 추론해낼 수 있으므로 함수의 반환 타입까지 생략 가능
fun function3() = 3.0 + 7
2. Unit 타입
함수를 작성하다 보면 반환 값이 필요하지 않을 때가 있는데 이럴 때는 반환 타입을 Unit을 사용해주면 된다.
함수의 반환타입을 생략하면 자동으로 Unit 타입이 된다.
fun main(args: Array<String>): Unit {
celsiusToFah(27)
celsiusToFah2(27)
celsiusToFah3(27)
}
fun celsiusToFah(celsius: Int): Unit{
println(celsius * 1.8 + 32)
}
fun celsiusToFah2(celsius: Int){
println(celsius * 1.8 + 32)
}
// 함수에 포함된 문장이 한 개이므로, =로 축약 가능하다.
fun celsiusToFah3(celsius: Int) = println(celsius * 1.8 + 32)
코틀린의 Unit 타입은 자바의 void에 대응되는 개념이지만 둘이 완전히 같은 것은 아니다.
void는 반환 값이 없음을 의미하는 특수 타입이지만, Unit은 class 키워드로 정의된 일반 타입이기 때문이다.
Unit 타입을 반환하는 함수는 return을 생략한다고 해도 암묵적으로 Unit 타입의 객체를 return 하도록 되어 있다.
단, 그 Unit 객체는 싱글톤 인스턴스이기 때문에 매번 객체를 생성하지 않는다.
3. 디폴트 인수
디폴트 인수는 매개변수에 기본 값을 지정하는 방법이다.
인수를 생략할 때는 맨 오른쪽에서 하나씩 생략해야 된다. 중간에 있는 인수를 생략할 수 없다.
하지만, 인수를 전달할 매개변수의 이름을 직접 지정하면 중간에 있는 인수도 생략할 수 있다.
주의할 점은 매개변수의 이름을 지정한 인수는 일반 인수들보다 항상 오른쪽에 있어야 한다.
fun main(args: Array<String>): Unit {
println(getAverage(89, 96)) // 92.5
getAverage(100, 50, true) // 75.0
println(getAverage(90)) // 45.0
getAverage(66, print = true) // 33.0
getAverage(print = true) // 0.0
getAverage(print = true, a = 10, b = 30) // 20.0
getAverage(print = true, 10, 30) // Mixing named and positioned arguments is not allowed
getAverage(10, print = true, 30) // Mixing named and positioned arguments is not allowed
}
fun getAverage(a: Int = 0, b: Int = 0, print: Boolean = false): Double {
val result = (a + b) / 2.0
if(print) {
println("t" + result)
}
return result
}
4. 가변 인수
만약, N개의 인수를 받는 함수를 만들고 싶다면
매개변수 앞에 vararg 키워드를 붙여 여러 개의 인수를 받을 수 있게 만들면 된다.
가변 매개변수에는 아무 인수도 지정하지 않을 수 있다.
1) 가변 인수는 일반 인수와 함께 쓸 수도 있다.
fun function(something: Char, vararg numbers: Int): Int
아래와 같이 호출
function(Char 타입 인수, N개의 Int 타입 인수)
2) 일반 인수가 가변 인수보다 오른쪽에 있으면 호출시 인수에 매개변수 이름을 붙여야 한다.
fun function(vararg numbers: Int, something: Char): Int
아래와 같이 호출
function(N 개의 Int 타입 인수, something = Char 타입 인수)
fun main(args: Array<String>): Unit {
println(getSumOf(1, 2, 3, 4, 5, 6, 7))
println(getSumOf(32, 57, 12))
println(getSumOf())
}
fun getSumOf(vararg numbers: Int): Int {
val count = numbers.size; // 인수의 개수를 저장
var i = 0; var sum = 0
while(i < count) {
sum += numbers[i]
i += 1
}
return sum
}