본문 바로가기
프로그래밍 놀이터/Kotlin, Coroutine

[Effective Kotlin] Item1 : Limit mutability

by 돼지왕 왕돼지 2022. 2. 15.
반응형

이 글은 Effective Java 를 완독하고, Kotlin 을 상용으로 사용하는 개발자 입장에서

Effective Kotlin 글 중 새로운 내용, remind 할 필요 있는 부분, 핵심 내용 등만 추려 정리한 내용입니다.

 

#
State 관리는 다음의 이유들로 힘들다.

  1. State 수가 많을수록 코드의 이해와 디버그가 힘들다. State 들이 상호 연관된 경우는 더더욱 어렵다.
  2. Mutable state 는 멀티스레드 환경에서 적절한 동기화를 필요로 한다.
  3. Mutable 은 테스트하기도 어렵다. (가능한 state 수가 더 많다고 볼 수 있다.)

 

#
Mutability 는 단점이 많아서, state mutation 을 아예 허용하지 않는 언어들도 있다.
순수한 functional programming 인 Haskell 이 그 대표적 예이다.
이런 언어들은 그 제한성 때문에 상용에서 잘 쓰이지 않는다.

 

#
State mutation 은 real world system 을 나타내기에 좋다.
그래서 사용을 안 하기는 힘들다.
다만 현명하게 꼭 필요한 부분만 mutable 을 사용하는 것이 필요하다.

 

 

Limiting mutability in Kotlin

#
Kotlin 은 mutability 제한을 지원하는 언어이다.
read-only property 인 val, immutable collection, data class 의 copy 등이 그 예이다.

 

 

Read-only properties val

#
val 이 immutable 을 '무조건' 제공해준다고 생각하면 안 된다.
getter 가 정의될 수도 있고, delegate 로 연결될 수도 있다.

 

 

Separation between mutable and read-only collections

#
Read-only collection 이 immutable 이 아닐 수 있다.
무슨 말이냐 하면, immutable interface 로 가려져 있을 뿐이지 실 객체는 mutable 일 수 있다는 이야기이다.

 

#
다음과 같은 down casting 은 절대 하지 말자

val list = listOf(1,2,3)
if(list is MutableList){
	list.add(4)
}

down casting 은 platform-specific 한 차이점도 있다는 것을 명심하자.

혹시 immutable 에 대해 mutable 속성이 필요하다면 down casting 대신 List.toMutableList() 함수 등을 활용하자.

 

 

Copy in data classes

#
Immutable 은 mutable 대비 아래의 장점이 있다.

  1. 한번 생성되면 state 가 동일하기 때문에 코드 이해가 쉽다.
  2. 병렬처리가 쉽다.
  3. 변화가 없기 때문에 cache 로 사용하기도 좋다.
  4. 방어적 copy 를 할 필요도 없다.
  5. 다른 object 를 만들 때 전달하기에도 훌륭하다.
  6. Set 이나 Map 의 key 등으로 사용하기도 좋다.

 

#
data class 는 copy 함수들을 자동 제공하기 때문에 boiler plate code 를 피하면서 값이 변경된 Immutable 을 생성하기 좋다.

data class User(
	val name: String,
	val surname: String
)

var user = User("Maja", "Matjiyo")
user = user.copy(surname="Mataguyo")

 

 

Different kinds of mutation points

#
Mutable property 는 delegate 를 사용하여 값 변화를 추적할 수 있다.

var names by Delegates.observable(listOf()){ _, old, new ->
	println("Names changed from $old to $new")
}
names += "Fabio" // names = names.plus("Fabio")
names += "Bill"

 

 

Do not leak mutation points

#
상태를 이루는 mutable object 를 노출하는 것은 아주 위험하다.

 

 

Summary

#

  1. var 보다는 val
  2. mutable 보다는 immutable property
  3. mutable object & class 보다는 immutable object & class 사용
  4. 변화가 필요하다면 immutable data class 로 만들고 copy 를 사용
  5. mutable collection 보다는 read-only collection
  6. 불필요한 mutation point 를 만들지 말고, 만들어야만 한다면 잘 관리해야 한다.
  7. mutable object 를 노출하지 말라.

 

#
성능 측면에서 mutability 가 필요한 경우가 있을 수 있다.
그 경우 관리를 잘 해야 한다.

 

 

반응형

댓글