Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- github action
- 백준
- 최댓값 최솟값
- 실버2
- 브론즈 1
- kotlin
- 2레벨
- compose
- gradlew
- capitalize
- suspend programming
- 개발하는 정대리
- Activirty
- LazyRow
- DB 기능
- .github
- navigation component
- 데이터베이스
- Myungpyo Shim
- 실버 4
- 브론즈1
- DB
- Bitrise
- keystore
- 성빈랜드
- LazyColumn
- 피보나치 수 2
- 프로그래머스
- Android
- 데이터베이스 첫걸음
Archives
- Today
- Total
plzy의 개발 블로그
[이펙티브 코틀린] 가변성을 제한하라 #1 본문
kotlin으로 프로그램을 만들다 보면 가변성으로 인하여 혼란을 겪은적이 있을 것이다.
가변성을 사용하면
- 프로그램을 디버깅하기 어렵다.
- 프로그램의 실행을 추론하기 어렵다.
- 프로그램을 테스트하기 어렵다.
- 상태 변경이 일어날 때 이러한 변경을 다른 부분에 알려야할 때가 있다.
예를 들어 정렬된 리스트에 가변 요소를 추가하면 요소를 추가할때마다 다시 정렬을 해야하는 문제점이 생긴다.
등등
이러한 문제점이 생긴다.
이를 막기위해 적절한 동기화를 사용해야 한다.
가변성을 제한하는 방법에는 총 3가지가 있다.
- 읽기전용 프로퍼티 만들기.
- 가변컬렉션과 읽기전용 컬렉션 구분하기
- 데이터 클래스의 copy
읽기전용 프로퍼티
읽기전용 프로퍼티 (val)은 이름과 다르게 값을 완전히 변경하지 못하는건 아니다.
mutable를 담고 있으면 된다.
val list = mutableListOf<Int>()
list.add(1)
또한 다른 프로퍼티를 활용하는 사용자 정의 게터로도 사용이 가능하다.
var name: String = "Kyung Min"
var surname: String = "Cha"
val fullName
get() = "$name $surname"
가변컬렉션과 읽용 전용 컬렉션 구분하기
일반 컬렉션 Set List,Iterable 뒤에 Mutable을 붙이면 가변 컬렉션이 된다.
이러한 이유가 뭘까?
불변으로 사용하지 않고 읽기전용 컬렉션으로 사용하면 좀더 많은 자유를 얻을수 있다.
하지만 다운캐스팅을 사용하면 안된다.
val list = listOf(1,2,3)
if(list is MutableList){
list.add(1)
}
어떠한 결과가 나올지 예측하지 못하기 때문이다.
읽거전용에서 가변으로 바꾸고 싶다면 copy를 통한 .toMutableList()같은 메서드를 사용하면 된다.
데이터 클래스의 copy
- immutable을 사용하면 이러한 장점이 있다.
- 코드를 이해하병렬처리를 안전하게 할 수 있다.
- 쉽게 캐시할 수 있다.
- 방어적 복사본을 만들 필요도 없고, 깊은 복사를 안해도 된다.
- 실행 예측하기 쉽다.
- Set 또는 Map 의 Key로 사용할 수 있다.
프로퍼티의 값을 변경하는 함수를 만들기엔 너무 귀찮다.
이때 data 한정자를 사용해 copy를 사용하면 된다.
'독서록' 카테고리의 다른 글
[Kotlin in Action] 코틀린의 철학 #2 (0) | 2022.05.12 |
---|---|
[Kotlin In Action] kotliin이란 무엇인가? #1 (0) | 2022.05.11 |