가변인자는 개수가 정해지지 않은 인자를 말합니다. 예를 들어, 아래 코드는 인자가 1개로 고정되어있습니다. 그렇기 때문에 인자를 2개로 늘리려면 코드를 변경해야 합니다.
fun printString(string : String): Unit {
println(string)
}
fun main() {
printString("Hello World!")
// printString("Hello World!", "Variable arguments") => compile error, 코드 변경해야 함
}
가변인자 사용 방법
가변인자는 인자의 개수를 유동적으로 받을 수 있습니다. 가변인자를 사용한다면 인자의 개수가 변경된다고 해도 코드를 변경하지 않아도 됩니다. 아래 코드는 함수에 가변인자를 적용한 예제입니다.
인자 앞에 vararg
를 선언하면 코틀린은 이 변수를 가변인자로 취급합니다. main을 보시면 printString()은 다양한 개수의 인자를 받을 수 있습니다. 가변인자는 배열처럼 인식되기 때문에 for (string in strings)
처럼 사용할 수 있습니다.
fun printString(vararg strings : String): Unit {
for (string in strings) {
println(string)
}
}
fun main() {
printString("vararg1")
printString("vararg1", "vararg2")
printString("vararg1", "vararg2", "vararg3")
}
인자와 가변인자 함께 사용하기
가변인자를 사용할 때, 꼭 가변인자만 사용해야 하는 것은 아닙니다. 일반 인자와 섞어 쓸 수 있습니다. 아래 코드는 인자와 가변인자를 섞어 사용한 예제입니다. 인자들 중에 가변인자는 맨 마지막에 위치해야 합니다. 그렇지 않으면 몇번째 인자가 title인지 컴파일러가 알기 어렵기 때문입니다.
fun printString(title: String, vararg strings: String): Unit {
println(title)
for (string in strings) {
println(string)
}
}
fun main() {
printString("Title", "varargs1", "varargs2", "varargs3")
}
만약 가변인자를 마지막에 사용하기 싫다면, 컴파일러가 가변인자와 일반인자를 구분할 수 있게 해줘야 합니다. 아래 코드는 가변인자가 앞에 있고, 인자가 마지막에 위치한 예제입니다. 호출할 때 일반 인자를 구분할 수 있게 명시적으로 인자의 이름을 써주었습니다.
fun printString(vararg strings: String, title: String): Unit {
println(title)
for (string in strings) {
println(string)
}
}
fun main() {
printString("vararg1", "vararg2", "vararg3", title = "Title")
}
인자들 중 가변인자가 가운데 위치하는 경우도 위와 동일하게 적용할 수 있습니다. 첫번째 인자는 명시적으로 인자 이름을 지정해주지 않아도 컴파일러가 일반인자로 인식하기 때문에 다음과 같이 마지막 인자만 명시적으로 입력해주면 됩니다.
fun printString(prefix: String, vararg strings: String, title: String): Unit {
println(title)
for (string in strings) {
println(prefix + string)
}
}
fun main() {
printString("prefix ", "vararg1", "vararg2", "vararg3", title = "Title")
}
배열을 가변인자로 넘기기
이미 존재하는 스트링 배열을 가변인자로 넘기고 싶을 수 있습니다. 굳이 길게 인자를 입력하고 싶지 않거든요.
이런 경우 배열 이름 앞에 *
를 붙여주면 배열이 가변인자로 취급되어 전달됩니다.
아래 코드를 보시면 더 명확합니다. *
를 사용하지 않을 때와 사용할 때 두가지 방식으로 함수를 호출하고 있습니다.
fun printString(vararg strings : String): Unit {
for (string in strings) {
println(string)
}
}
fun main() {
val strings = arrayOf("vararg1", "vararg2", "vararg3")
printString(strings[0], strings[1], strings[2]) //개수가 많아지면 힘들다
printString(*strings) // *을 붙이면 배열을 가변인자로 취급
}
참고
Recommended Posts:
- Kotlin - Collections와 Sequences의 차이점
- Kotlin - Reified를 사용하는 이유?
- Kotlin - Sealed class 구현 방법 및 예제
- Kotlin - inline functions 이해하기
- Kotlin - Destructuring Declaration
- KotlinTest로 Unit Test 작성하는 방법
- Kotlin - Collections 소개 및 사용법 정리 (List, Map, Set)
- Kotlin - Data class 이해 및 구현 방법
- Kotlin에서 자주 사용하는 annotation 정리
- Kotlin - Generics 클래스, 함수를 정의하는 방법
- Kotlin - lateinit과 Delegates.notNull의 차이점
- Kotlin - Delegates로 프로퍼티를 Observerable로 만들기
- Kotlin - Null을 안전하게 처리하는 방법 (Null safety, 널 안정성)