길이가 변할 수 있는 가변 인자 목록, varag
가변 인자 목록인 varag 키워드는 어떤 것이고, 어떻게 사용되는지 알아볼 수 있는 아톰이다.
지난 아톰인 리스트와의 차이가 헷갈릴 수 있기 때문에 차이점이 존재한다는 것을 알고 학습해 볼 예정이다,
[ 가변 인자 목록, varag ]
varag
: 가변 인자 목록인 variable argument list의 줄임말
: 함수나 메서드에 가변 개수의 인자(임의의 길이로 인자)를 전달할 수 있도록 하는 코틀린의 기능
: 모든 인자는 지정한 타입에 속해야 함
: varag를 통해 함수 호출 시 전달하는 인자의 개수를 동적으로 조절 가능
: 함수 정의 시 varag로 선언된 인자는 최대 하나만 존재해야 하며, 파라미터 이름을 통해 varag 인자에 접근 가능(이 때 Array 취급)
: Array 취급이 되기 때문에 List로 다룰 수 없음
: 일반적으로 마지막 파라미터를 varag로 선언하는것이 간편
: 간단한 시퀀스의 경우에는 varag가 아닌 list로 처리하고, 서드파티 API가 Array를 요구하거나 varag를 다뤄야 하는 경우에만 Array 사용을 권장
* Array는 항상 가변 객체
import atomictest.eq
fun sum(varag numbers:Int):Int{
var total = 0
for(n in numbers) total += n
return total
}
fun main(){
sum(13, 27, 44) eq 84 // True
sum(1, 3, 5, 7, 9, 11) eq 36 // True
sum() eq 0
}
- 함수 호출 시 인자로 여러개를 전달할 수 있기 때문에 sum(인자들)로 입력하더라도 varag로서 하나로서 전달되며, 함수 내부에서는 배열로서 처리
[ 스프레드 연산자 * ]
스프레드 연산자 *
: Array를 인자의 목록으로 변환하고 싶은 경우 사용
: 원시타입(Int, Double, Boolean 등)의 Array를 전달할 때 구체적인 타입 이름이 지정된 Array 함수를 사용해야 함
: varag로 받은 파라미터를 다시 다른 varag를 요구하는 함수에 전달할 때 유용
: 배열에만 적용 가능
import varags.sum
import atomictest.eq
fun main(){
val array = intArrayOf(4,5)
sum(1,2,3, *array, 5) eq 21
// sum(1,2,3,array,5) // 컴파일 불가능 - 하나의 인자로 받아야 하기 때문
val list = listOf(9,10,11)
sum(*list.toIntArray()) eq 30 // list는 Array로 변경 후 스프레드 연산자 적용
}
* Array<Int>와 IntArray는 둘 다 배열을 나타내지만, 서로 다른 클래스로 메모리 구조도 다름
[ Array<Int> vs IntArray ]
IntArray
: Kotlin의 표준 라이브러리의 기본적인 정수 배열
: 원시 타입인 int의 배열로서 Java의 int[]와 매핑
: 메모리 상에서 정수형 데이터를 효율적으로 저장하기에, 메모리 사용에 민감한 경우 좋음
: 스프레드 연산자를 사용할 때에는 타입이 일치해야 하기 때문에 Array<Int>를 IntArray로 변환해 주는 것이 필요할 수 있음
Array<Int>
: 제네릭한 배열로 정수형이 아닌 객체 타입도 담을 수 있는 배열
: Array 클래스는 기본적으로 객체를 담는 배열을 생성
: 메모리 상에서 추가적인 객체 정보를 갖음
[ 명령줄 인자 ]
fun main(args: Array<String>){
for(a in args) print(a)
}
- 명령줄에서 프로그램을 시작 시 프로그램에 원하는 만큼 인자를 전달할 수 있는데, 이 경우 함수에 미리 정해진 파라미터를 지정해야 함
- 자바에서도 커멘드라인 값 입력과 동일하게 코틀린에서도 동일
https://kcode-recording.tistory.com/187
[JAVA] main 메서드 매개값 String[] args (자바 커멘드라인 입력)
public static void main(String[] args) static : 프로그램이 실행되는 순간 메모리가 할당되며, Garbage Collector에 의한 메모리 정리 대상이 아님 : 따라서 static을 사용하여 메모리에 항상 상주하도록 설정해야
kcode-recording.tistory.com
[ 오늘의 학습 소감 ]
오늘은 가변 인자 목록인 varag에 대해서 학습했는데 Array인 배열이 나와서 자바와 동일할 것이라고 생각했는데, 비슷하면서도 매우 다른 개념의 배열인 가변 인자 목록 varag였다. 특히 Array<Int>와 IntArray가 동일한 배열이지만 다른 배열이라는 점, 스프레드 연산자가 있다는 것이 오늘 학습 중 가장 중요한 부분이 아니었을까 싶다.(물론 varag에 대한 기본적인 내용은 필수) 다른 컬렉션들은 과연 어떻게 쓰이고 자바와는 어떻게 다를지 기대가 되는 컬렉션에 대한 아톰의 시작이었다.
'공부 자료 > 코틀린[Kotlin]' 카테고리의 다른 글
[Atomic 27] 맵 (feat. Map) (1) | 2024.01.28 |
---|---|
[Atomic 26] 집합 (feat. Set) (0) | 2024.01.27 |
[Atomic 24] 리스트 (feat. List / MutableList) (1) | 2024.01.25 |
[Atomic 23] 예외 (feat. 예외의 기초) (0) | 2024.01.23 |
[Atomic 22] 테스트 (0) | 2024.01.22 |