본문 바로가기

Kotlin

[Kotlin] Java 컬렉션 Kotlin에서 사용하기, Kotlin 배열

#Java에서 선언된 컬렉션, Kotlin에서 사용

  • Java에서 정의한 타입을 코틀린에서는 플랫폼 타입으로 본다 (컬렉션 타입도 마찬가지)
  • 플랫폼 타입은 널관련 정보가 없으므로, Nullable Non-Nullable 2가지 타입 모두가 될 수 있다
  • 플랫폼 타입은 Mutable 관련 정보도 없으므로 Read Only, Mutable 2가지 타입 모두가 될 수 있다

즉, Java에서 선언된 컬렉션은 플랫폼 타입이며,  Nullable과 Mutable 모두 개발자가 판단해서 사용해야 한다

 

*[예제] Java에서 선언된 Interface, Kotlin에서 구현하기

-Interface의 시그니처에 컬렉션 타입이 들어 있는 경우

//********* Java *********

public interface JavaInterface {
    void testMethod(List<String> testList);
}
//********* Kotlin *********

class KotlinClass : JavaTest.JavaInterface {
/*
   [판단해서 사용해야 할 부분]
   1)List vs MutableList
   2)컬렉션 객체가 Nullable vs Non-Nullable
   3)컬렉션 원소가 Nullable vs Non-Nullable
   */
    override fun testMethod(testList: List<String?>?) {}
  
 //  상황에 따라 여러 형태의 타입 조합이 나올 수 있다
 //   override fun testMethod(testList: MutableList<String>) {}
}

 

 

#코틀린에서의 배열

  • 기본적으로 배열보다 컬렉션을 우선 사용해야하지만 배열을 사용하는 기존 Java API 사용을 위해 코틀린에서의 배열을 알아보자
  • 2가지 타입으로 구분 할 수 있다 1)객체의 배열 2)원시 타입의 배열

 

*객체의 배열 생성 방법

  1. arrayOf : 원소를 넘기면서 배열을 만듦
  2. arrayOfNulls : 크기를 인자로 받으며 모든 원소가 Null인 배열을 반환. 원소 타입이 Nullable이어야 사용할 수 있다.
  3. Array 생성자 이용 : 배열 크기와 람다를 인자로 받는다. 람다를 호출해서 각 배열 원소를 초기화 해준다
//1) arrayOf 사용
var array:Array<Int> = arrayOf(1, 2, 3) //[1,2,3]

//2) arrayOfNulls 사용
var nullArray:Array<Int?> = arrayOfNulls<Int>(3) //[null,null,null]

//3) Array 생성자 사용 -> 초기화 가능
val arrayWithInit = Array<Int>(3) { index -> index * 2 } //[0,2,4]

//3-2) Array 생성자 사용 -> 초기화 가능
val arrayLetters = Array<String>(26){i -> ('a'+i).toString()}  //println('a'.code) : ASCII CODE 98 출력됨

 

*원시타입의 배열 생성 방법(Int 의 경우로 예시)

- 위 예제의 arrayOf(1,2,3) 과 같이 Array<Int> 형태로 사용할 경우, 제네릭 타입에서처럼 배열 타입의 타입 인자도 항상 객체 타입이 된다 (1,2,3 같은 원소가 래퍼타입이 된다)

- (For 효율적 사용) 배열의 값을 박싱하지 않고 원시타입으로 사용하려면 IntArray를 사용하면 된다

  1. intArrayOf : 원소를 넘기면서 배열을 만듦 
  2. IntArray 생성자 이용(1) : 배열 크기와 람다를 인자로 받는다
  3. IntArray 생성자 이용(2) : 사이즈를 넘기면서 배열을 만듦 (원시타입의 Defualt 값으로 초기화 됨)
    //1) intArrayOf 사용
    val intArray: IntArray = intArrayOf(1, 2, 3) //[1,2,3]

    //2) IntArray 생성자 사용 (람다 초기화)
    val intArrayWithInit: IntArray = IntArray(3) { index -> index * 2 } //[0,2,4]

    //3) IntArray 생성자 사용 (원시 타입 Default값 초기화)
    val intArrayDefault: IntArray = IntArray(3) // [0,0,0]

 

* 박싱된 정수 배열은 java.lang.Integer[] 이 되고, 원시 타입 정수 배열은 int[] 로 컴파일 된다

코틀린에서 선언된 각각 박싱타입과 원시타임을 return 하는 함수를 Java에서 사용한 경우로 확인해 보자

//********* Kotlin - Array.kt *********
fun getArray(): Array<Int> {...}
fun getIntArray(): IntArray {...}
//********* Java *********
Integer[] array = ArrayKt.getArray();
int[] intArray = ArrayKt.getIntArray();

 

* '객체 타입 배열 -> 원시 타입 배열' 변환도 가능

val array:Array<Int> = arrayOf(1, 2, 3) 
//toIntArray 사용해서 '객체 타입 배열 -> 원시 타입 배열' 변환 
val intArray: IntArray = array.toIntArray()

 

* 코틀린의 배열은 컬렉션에서 사용하는 모든 확장함수를 제공 받는다 (filter, map ...)

val array:Array<Int> = arrayOf(1, 2, 3)
array.forEachIndexed{index, element->
println("[$index] $element")}

 

*기존 Collection을 배열로 변경하는 법  : toTypedArray 사용

val list:List<Int> = listOf(1,2,3)

//Collection<T>을 Array<T>로 변경
val array:Array<Int> = list.toTypedArray()

잘못된 내용이나 궁금한 내용 있으시면 댓글 달아주세요

좋은 하루 되세요!

 

출처 : Kotlin In Action - 에이콘 출판사

(위 도서를 학습하고 개인 학습용으로 정리한 내용입니다)