가변인자는 개수가 정해지지 않은 인자를 말합니다. 예를 들어, 아래 코드는 인자가 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) // *을 붙이면 배열을 가변인자로 취급
}
참고
Related Posts
- Kotlin - 배열에서 최소 값, 최대 값 찾기
- Kotlin - 2차원 배열 선언, 초기화 방법
- Kotlin - 배열 선언, 초기화 방법
- Kotlin - 리스트, 배열 길이 가져오기
- Kotlin - 리스트에서 최대, 최소 값 찾기
- Kotlin - for 반복문, 배열/리스트 순회
- Kotlin - Timer, 주기적으로 함수 실행
- Kotlin - sleep, 쓰레드 몇 초 지연
- Kotlin - Thread 생성 및 실행
- Kotlin에서 정규표현식 사용하기
- Kotlin - 문자열 길이 계산
- Kotlin - 문자열 비교 방법(equals, ==, compareTo)
- Kotlin - 2개의 배열 하나로 합치기
- Kotlin - 2개의 List 하나로 합치기
- Kotlin - 디렉토리의 모든 파일 리스트 출력
- Kotlin - 리스트 정렬 방법 (sort, sortBy, sortWith)
- Kotlin - 문자열 뒤집기 (Reverse String)
- Kotlin - 랜덤 숫자 생성 (Random, SecureRandom)
- Kotlin - Range, 숫자 범위 표현
- Kotlin - 음수를 양수로 변환, math.abs()
- Kotlin - List를 Set로 변환
- Kotlin - Set를 List로 변환
- Kotlin - 문자열에서 숫자(int)만 추출하는 방법
- Kotlin - Map을 List로 변환하는 방법
- Kotlin - File, Directory가 존재하는지 확인
- Kotlin - List를 Map으로 변환
- Kotlin - List의 중복 요소 제거
- Kotlin - List를 Array로 변환
- Kotlin - 엘비스 연산자 (Elvis Operation)
- Kotlin - Array를 List로 변환
- Kotlin - String을 Float으로 변환
- Kotlin - String을 Double으로 변환
- Kotlin - String을 Int로 변환
- Kotlin - String을 Long으로 변환
- Kotlin - String Null 또는 Empty 체크