#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)원시 타입의 배열
*객체의 배열 생성 방법
- arrayOf : 원소를 넘기면서 배열을 만듦
- arrayOfNulls : 크기를 인자로 받으며 모든 원소가 Null인 배열을 반환. 원소 타입이 Nullable이어야 사용할 수 있다.
- 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를 사용하면 된다
- intArrayOf : 원소를 넘기면서 배열을 만듦
- IntArray 생성자 이용(1) : 배열 크기와 람다를 인자로 받는다
- 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 - 에이콘 출판사
(위 도서를 학습하고 개인 학습용으로 정리한 내용입니다)
'Kotlin' 카테고리의 다른 글
[Kotlin]Coroutine - 백그라운드에서의 실행 (2) | 2022.01.04 |
---|---|
[Kotlin] 5. Not-null assertion, let 함수, lateinit (0) | 2021.12.15 |
[Kotlin] 5. Nullable 타입, Safe Call, 엘비스 연산자, Safe Cast (0) | 2021.12.12 |
[Kotlin] CoRoutines (0) | 2021.12.07 |
[Kotlin] 4. 람다 - with/apply (1) | 2021.12.05 |