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

Jaychy·2021년 6월 22일
0

알아가는 것

목록 보기
6/11
post-thumbnail

Github 코틀린으로 개발하면서 궁금했던 점에 대해 고찰하는 곳.

개요

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

결론

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

profile
아름다운 코드를 꿈꾸는 백엔드 주니어 개발자입니다.

0개의 댓글