Aliasing Bug by Reference Of Collections And Objects
가변 컬렉션과 읽기 전용 컬렉션
Aliasing Bug
Aliasing occurs when the same memory location is accessed through more than one reference.
Person me = new Person("BAEK Jung Ho");
me.setPhoneNumber("010-1234-1234");
Person articleAuthor = Baek;
me.setPhoneNumber("999");
assertEquals("999", articleAuthor.getPhoneNumber());
자바의 컬렉션은 가변(mutable) 컬렉션 이다. 따라서 Aliasing Bug 를 방지하기 위해서는 공유된 컬렉션을 변경하지 않아야 한다.
자바에서 UnmodifiableList 로 감싸면 컬렉션에서 상태 변경에 의존해서 생기는 문제를 해결할 수 있다. 하지만 원본 리스트를 변경할 수 있다면 UnmodifiableList 도 원본이 결코 변경되지 않음을 보장하지 못한다.
자바 10에서는 컬렉션을 AbstractImmutableList 로 복사해 주는 List.copyOf(collection) 이 생겼다. 이렇게 만든 AbstractImmutableList 객체는 변경이 불가능하며 원본 컬렉션의 변경과도 무관하다.
함수 경계에서 매번 방어적 복사를 수행하는 대신, 실무에서는 다음과 같은 전략을 기본으로 채택하는 것이 좋다.
서로 떨어진 두 코드 사이에 공유된 컬렉션이 있다면 이를 불변 컬렉션으로 취급하는게 좋다.
Read only Collection
가변이 아닌 코틀린 컬렉션에 대한 공식 용어는 불변(immutable)이 아닌 읽기 전용(read-only) 이다. 코틀린의 MutableList 는 List 의 하위 타입이며(List 를 상속) List 는 Collection 의 하위 타입이다. 따라서 List 의 모든 메서드를 MutableList 가 제공하고 호출 가능하기 때문에 List 가 필요한 코드에 MutableList 를 넘겨도 안전하다.
이러한 상속 관계 문제 때문에 읽기 전용 컬렉션은 불변이 아니다.
Links
References
- 자바에서 코틀린으로: 코틀린으로 리팩터링하기 / 냇프라이스 와 덩컨맥그레거 저 / O'REILLY