코틀린에는 읽기 전용 컬렉션들의 조상인 Collection
클래스가 있고
변경 가능한 컬렉션들의 조상인 MutableCollection
클래스가 있습니다.
그런데 Collection
을 상속 받은 읽기 전용 컬렉션들을 자바 메소드에 넘기면 불변성을 무너뜨릴 수 있습니다.
다음과 같이 List<Integer>
타입의 리스트를 매개변수로 받아서
원소들을 제곱하여 다시 저장하는 자바 메소드가 있다고 합시다.
public class Calculator {
public static void pow(List<Integer> numberList) {
for (int i = 0 ; i < numberList.size() ; i++) {
numberList.set(i, numberList.get(i) * numberList.get(i));
}
}
}
코틀린 코드에서 읽기 전용 리스트를 만든 뒤 위 메소드의 인자로 넘기면 어떻게 될까요?
자바에서의 Collection
은 기본적으로 읽기 전용이 아니기 때문에
위 메소드에서 원소를 변경할 수 있게 되고 코틀린에서는 이를 막을 방법이 전혀 없습니다.
따라서 다음 코틀린 코드에서는 읽기 전용 리스트가 변경된 것을 볼 수 있습니다.
fun main() {
val numberList = listOf(1, 2, 3, 4, 5)
Calculator.pow(numberList)
numberList.forEach { println(it) }
}
더 큰 문제는 null
에서 발생합니다.
기본적으로 null
을 포함하지 않도록 선언한 리스트를 인자로 보냈는데
자바 코드에서 임의로 null
값을 저장한다면?
non-null
타입에서 null
값을 확인할 수 있는 기괴한 일을 발생시킬 수 있습니다.
이도 코틀린에서는 막을 방법이 없기 때문에
사용하는 자바 코드와 통합하면서 이러한 사항들을 잘 고려해야 합니다.
자바 코드에서는 코틀린의 읽기 전용 컬렉션을 무시하고 변경이 가능하다.
따라서 코틀린 코드에서 자바 코드를 실행할 때에는 주의를 기울여야 할 것이다.