Skip to content

읽기 전용 컬렉션의 불변성을 깨뜨리는 방법

이진혁 edited this page Jun 15, 2021 · 2 revisions

개요

코틀린에는 읽기 전용 컬렉션들의 조상인 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 값을 확인할 수 있는 기괴한 일을 발생시킬 수 있습니다.
이도 코틀린에서는 막을 방법이 없기 때문에
사용하는 자바 코드와 통합하면서 이러한 사항들을 잘 고려해야 합니다.

결론

자바 코드에서는 코틀린의 읽기 전용 컬렉션을 무시하고 변경이 가능하다.
따라서 코틀린 코드에서 자바 코드를 실행할 때에는 주의를 기울여야 할 것이다.

Clone this wiki locally