더북(TheBook)

원본과 별도로 배열을 만들고 싶다면 copyOf() 함수를 사용해야 한다. copyOf()는 필요시 다른 크기의 배열을 만들어내기도 한다.

val numbers = squares.copyOf()
numbers[0] = 1000   // squares에는 영향이 없다
squares.copyOf(2)   // 뒤가 잘림: 1, 4
squares.copyOf(5)   // 부족한 부분에 0이 채워짐: 1, 4, 9, 16, 0

배열 타입 변수에 타입이 다른 배열을 대입할 수 없다는 점을 기억하라. 다음 코드는 컴파일 오류를 발생시킨다.

var a = arrayOf(1, 4, 9, 16)
a = arrayOf("one", "two") // Error: can't assign Array<String> to Array<Int>

자바 vs. 코틀린 자바에서는 상위 타입의 배열에 하위 타입의 배열을 대입할 수 있었다. 배열이 가변 데이터 구조이므로 이런 대입은 런타임 시 문제를 발생시킬 수 있다.

Object[] objects = new String[] { "one", "two", "three" };
objects[0] = new Object(); // ArrayStoreException 예외가 발생함

이런 이유로 코틀린 배열 타입은 (자신과 같은 타입을 제외하고) 모든 다른 배열 타입과 서로 하위 타입 관계가 성립하지 않는다고 간주되며, 이에 따라 앞에서 본 것 같은 대입도 금지된다. 코틀린에서 StringAny의 하위 타입이지만 Array<String>Array<Any>의 하위 타입이 아니다.

val strings = arrayOf("one", "two", "three")
val objects: Array<Any> = strings // 예외
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.