이 포스팅은 고돈호 님의 이것이 안드로이드다 with 코틀린(한빛미디어)을 기반으로 작성되었습니다.

코틀린은 지연 초기화를 사용한다. 이를 통해 앞서서 포스팅한 Nullable의 남용을 방지한다.

일반적으로 Nullable로 선언한 방법은 다음과 같다.

 

1.1 lateinit

class Phone {
    var name: String? = null
    init {
    	name = "iphone"
    }
    fun process() {
       name?.plus("13 pro")
       print("핸드폰 이름의 길이 = ${name?.length}")
       print("모델명 = ${name?.substring(6, 6)}")
   }
}

'?.' 때문에 가독성을 헤치는 경우가 생긴다. 따라서 lateinit를 사용하여 가독성을 향상한다.

class Phone {
    lateinit var name: String
    init {
    	name = "iphone"
    }
    fun process() {
       name.plus("13 pro")
       print("핸드폰 이름의 길이 = ${name.length}")
       print("모델명 = ${name.substring(6, 6)}")
   }
}

전체 예시 코드는 다음과 같다.

package kr.co.ki.function

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        var p = Phone()
        Log.d("nullable", "핸드폰 종류는 ${p.name} 입니다")
        p.process()
    }
}

class Phone {
    var name: String? = null
    init {
        name = "iphone"
    }
    fun process() {
        name = name?.plus("13 pro")
        Log.d("nullable","핸드폰 이름의 길이 = ${name?.length}")
        Log.d("nullable","모델명 = ${name?.substring(6, 12)}")
    }
}

fun String.plus(word: String): String {
    return this + word
}

1.2 lazy

lateinit과 다르게 읽기 전용 변수인 val을 사용하는 지연 초기화이다. 사용법은 다음과 같다.

class Company {
    val person: Person by lazy{ Person() }
    init {
    	// lazy는 선언시에 초기화를 진행하므로 별도의 초기화 과정 필요 X
    }
    fun process() {
        print("person의 이름은 ${person.name}")
    }
}

lazy는 선언 시에 초기화를 하기 때문에 별도의 초기화 과정이 필요 없다.

lazy로 선언된 변수가 최초 호출되는 시점이 by lazy {} 안에 넣은 값으로 초기화가 된다. 즉 위의 코드를 보면 company 클래스가 초기화되더라도 person에 바로 Person()로 초기화되지 않고 process 메서드에서 person.name 이 호출되는 순간 초기화된다.

'안드로이드 앱 개발' 카테고리의 다른 글

8. 코틀린의 null  (0) 2021.12.23
7. 클래스  (0) 2021.12.21
6. 함수  (0) 2021.12.20
5. 반복문  (0) 2021.12.19
4. 배열과 컬렉션  (0) 2021.12.14

+ Recent posts