개요
Kotlin의 Collection은 두가지 타입의 Interface를 제공한다. 한 가지는 변경 불가능(Immutable)한 Interface 이며 다른 하나는 변경 가능(Mutable)한 Interface이다.
더욱 자세히 들어가면 Immutable Interface와 Mutable Interface는 아래 [그림1]과 같은 상속 구조를 가진다. Immutable Interface에서는 값을 변경할 수 있는 함수를 제공하지 않으며, Immutable Interface를 확장하는 Mutable Interface에서 값을 변경하는 메서드를 제공한다.
필요성
Kotlin에서 이렇게 Immutable Interface와 Mutable Interface를 나눈 것은 코드 레벨에서 명확성과 안정성을 제공하기 위한 것이다. 예를 들어 함수형 프로그래밍에서는 동작에서 사용하는 변수의 상태가 변화할 시, 입력 값에 따라 출력 값이 달라지는 부수효과가 생길 수 있다. Kotlin에서는 Immutable Interface를 사용함으로써 부수효과를 코드 단에서 차단할 수 있다.
구현
그렇다면 실제 Collection 타입 사용 시 Immutable Interface와 Mutable Interface는 어떻게 구현되어 있는지 살펴보자. 아래는 List Interface에 대한 Interface의 상속구조이다.
MutableList는 List Interface와 MutableCollection Interface를 확장하며, ArrayList는 MutableList Interface를 확장한다. 이러한 방식을 통해 자바에서 사용되는 ArrayList는 자바의 코드에서 코드를 그대로 가져옴과 동시에 MutableList Interface를 상위 타입으로 갖는 것처럼 취급된다. 이러한 방식을 통해 코틀린은 자바 호환성을 제공하면서 Immutable Interface와 Mutable Interface를 나눈다.