• [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. 결론

    ※ 가변적인 코드는 추적하기 힘들다. 가변성을 제한하자.

     

    반응형

    댓글

Designed by Tistory.