-
[EffectiveKotlin] 가변성을 제한하라언어/Kotlin 2022. 2. 28. 22:49반응형
1. val, var
val는 읽기 전용 프로퍼티이며, var은 읽고 쓰기 전용 프로퍼티를 의미한다.
※ 읽기 전용 프로퍼티가 불변(immutable type)을 의미하는것은 아니다.
var name: String = "OneSeok" // 이름 var surname: String = "Song" // 성 val fullName get() = "$name $surname" fun main(args: Array<String>) { println(fullName) // OneSeok Song name = "OneStone" println(fullName) // OneStone Song }
fullName은 val로 선언되어 있지만, 변한다.
일단 val로 선언하고, 변경이 필요할 경우 var로 변경하는게 좋다.
2. listOf(), setOf(), mapOf()
listOf(), setOf(), mapOf()는 불변(immutable type) 컬렉션이며, mutableListOf(), mutableSetOf(), mutableMapOf()는 가변(mutable type) 컬렉션이다.
listOf(), setOf(), mapOf()가 반환하는 컬렉션은 add, remove 등의 삽입 삭제 메서드가 존재하지 않는다.
mutableListOf(), mutableSetOf(), mutableMapOf()는 add, remove등의 메소드가 존재한다.
일단 listOf(), setOf(), mapOf()로 선언하고, 변경이 필요할 경우 mutableListOf(), mutableSetOf(), mutableMapOf()로 변경하는게 좋다.
3. 불변 객체는 Set이나 map의 키로 사용할 수 있다.
Set과 Map은 내부적으로 해시 테이블을 사용하고, 해시 테이블은 처음 요소를 넣을 때 요소의 값을 기반으로 버킷을 결정한다. 따라서 요소에 수정이 일어나면 해시 테이블 내부에서 요소를 찾을 수 없게 되어 버린다.
4. 절대 사용해서는 안될 안티 패턴
val list = listOf(1, 2, 3) if (list is MutableList) { list.add(4) }
- 불변 컬렉션을 가변 컬렉션으로 캐스팅하지 말자.
var list = mutableListOf<Int>()
- 읽고 쓰기 전용 프로퍼티와 가변 컬렉션을 함께 사용하지 말자.
4. 결론
※ 가변적인 코드는 추적하기 힘들다. 가변성을 제한하자.
반응형'언어 > Kotlin' 카테고리의 다른 글
[EffectiveKotlin] 예외를 활용해 코드에 제한을 걸어라 (0) 2022.03.17 [EffectiveKotlin] 가독성을 목표로 설계하라 (0) 2022.03.16 [EffectiveKotlin] 타입을 명확하게 지정하라 (0) 2022.03.13 [EffectiveKotlin] 최대한 플랫폼 타입을 사용하지 말라 (0) 2022.03.10 [EffectiveKotlin] 변수의 스코프를 최소화하라 (0) 2022.03.07