이 글은 Effective Java 를 완독하고, Kotlin 을 상용으로 사용하는 개발자 입장에서
Effective Kotlin 글 중 새로운 내용, remind 할 필요 있는 부분, 핵심 내용 등만 추려 정리한 내용입니다.
#
State 관리는 다음의 이유들로 힘들다.
- State 수가 많을수록 코드의 이해와 디버그가 힘들다. State 들이 상호 연관된 경우는 더더욱 어렵다.
- Mutable state 는 멀티스레드 환경에서 적절한 동기화를 필요로 한다.
- 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 대비 아래의 장점이 있다.
- 한번 생성되면 state 가 동일하기 때문에 코드 이해가 쉽다.
- 병렬처리가 쉽다.
- 변화가 없기 때문에 cache 로 사용하기도 좋다.
- 방어적 copy 를 할 필요도 없다.
- 다른 object 를 만들 때 전달하기에도 훌륭하다.
- 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
#
- var 보다는 val
- mutable 보다는 immutable property
- mutable object & class 보다는 immutable object & class 사용
- 변화가 필요하다면 immutable data class 로 만들고 copy 를 사용
- mutable collection 보다는 read-only collection
- 불필요한 mutation point 를 만들지 말고, 만들어야만 한다면 잘 관리해야 한다.
- mutable object 를 노출하지 말라.
#
성능 측면에서 mutability 가 필요한 경우가 있을 수 있다.
그 경우 관리를 잘 해야 한다.
끝
'프로그래밍 놀이터 > Kotlin, Coroutine' 카테고리의 다른 글
[Effective Kotlin] Item 3 : Eliminate platform types as soon as possible (0) | 2022.02.17 |
---|---|
[Effective Kotlin] Item2 : Minimize the scope of variables (0) | 2022.02.16 |
[coroutine] Back-pressure 대응하기 (0) | 2022.02.02 |
[coroutine] withContext vs async (0) | 2022.02.01 |
[Coroutine] Exception handling in coroutine (0) | 2022.01.30 |
댓글