(Kotlin/코틀린) 프로퍼티 get/set 사용 시 주의사항 - 성능, 스레드, SmartCast까지 정리

개요


1. Custom getter 사용 시 SmartCast 불가

// ❌ 문제 코드
val name: String?
get() = field

if (name != null) {
    println(name.length) // ❌ 컴파일 에러
}

// ✅ 해결 방법
val localName = name

if (localName != null) {
    println(localName.length)
}

2. var 프로퍼티 + SmartCast 제한

// ❌ 문제 코드
var user: User? = getUser()

if (user != null) {
    println(user.name) // ❌ SmartCast 불가
}

// 해결
val safeUser = user
if (safeUser != null) {
    println(safeUser.name)
}

3. getter에 로직 넣는 실수 (성능 문제)

❌ 안 좋은 패턴

val bitmap: Bitmap
get() = BitmapFactory.decodeFile(path)

✅ 권장 패턴

val bitmap: Bitmap by lazy {
    BitmapFactory.decodeFile(path)
}

fun loadBitmap(): Bitmap {
    return BitmapFactory.decodeFile(path)
}

4. setter에서 부작용(side effect) 발생

❌ 문제 코드

var text: String = ""
set(value) {
    field = value
    textView.text = value
} 

✅ 권장

fun updateText(value: String) {
    text = value
    textView.text = value
}

5. backing field(field) 사용 주의

var count: Int = 0
    set(value) {
        field = value * 2
    }

// 권장
var rawCount: Int = 0

val count: Int
get() = rawCount * 2

6. getter에서 상태 변경 금지

var count = 0
    get() {
        field++
        return field
    }

7. 멀티 스레드 환경에서의 문제

var data: String? = null
get() = field  // 👉 getter 결과가 항상 안전하지 않음

// 아래의 방식 권장
@Volatile
var data: String? = null

synchronized(lock) {
    data
}

8. open 프로퍼티 오버라이딩 이슈

open class Base {
    open val value: Int = 10
}

class Child : Base() {
    override val value: Int
        get() = computeValue()
}

9. 프로퍼티 vs 함수 선택 기준

상황 프로퍼티 함수
값 조회 O  
계산 있음   O
비용 큼   O
side effect 있음   O


Related Posts