본문 바로가기

공부 자료/코틀린[Kotlin]

[Atomic 25] 가변 인자 목록

길이가 변할 수 있는 가변 인자 목록, 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에 대한 기본적인 내용은 필수) 다른 컬렉션들은 과연 어떻게 쓰이고 자바와는 어떻게 다를지 기대가 되는 컬렉션에 대한 아톰의 시작이었다.