지연초기화

황승현·2023년 12월 7일
0

코틀린 강의 정리

목록 보기
23/36

지연초기화

변수나 상수의 값을 나중에 초기화하는 문법

  • 코틀린은 클래스를 설계할 때 안정성을 위해 반드시 변수의 값을 초기화해야 됨

    • 클래스를 설계할 때 초기의 값을 정의하기 애매함
    • 이럴 때 나중에 초기화하는 것이 지연초기화 문법
  • lateinit, lazy 키워드를 활용

    변수: lateinit

    상수: lazy

  • 저사양으로 제한되어 있는 환경에서 메모리를 더욱 효율적으로 사용 가능

변수의 지연 초기화 (lateinit)

기본 사용

fun main(){
    var s1 = Student() // 클래스 객체 생성, 인스턴스화
    // 여기까지는 name 프로퍼티는 초기화 안 됨
    s1.name = "참새" //name 프로퍼티에 값 할당(초기화)
    s1.displayInfo() //메서드 실행

    s1.age = 10 //age 프로퍼티의 값을 다시 할당
    s1.displayInfo() //메서드 실행
}


//명시적 생성자를 사용하지 않고 클래스 정의
class Student {
	// var name:String = ""
    lateinit var name:String //변수를 나중에 할당받을 수 있음
    var age:Int = 0 //age 프로퍼티의 초기값을 0으로 할당

    fun displayInfo() {
        println("이름은: ${name} 입니다.")
        println("나이는: ${age} 입니다.")
    }
}

고급 사용

  • 변수를 사용하기 전에 초기화되었는지 확인해야 안정성을 높일 수 있다.
  • isInitilized를 활용해서 값이 초기화되었는지 확인할 수 있다. (true/false)
  • 사용할 때는 값이아니라 참조 형태로 사용해야 하기 때문에 this:: 또는 ::를 붙인다.

fun main(){
    var s1 = Student() // 클래스 객체 생성, 인스턴스화
    // 여기까지는 name 프로퍼티는 초기화 안 됨
    s1.name = "참새" //name 프로퍼티에 값 할당(초기화)
    s1.displayInfo() //메서드 실행
    
    //name 변수를 초기화해주세요 출력

    s1.age = 10 // age 프로퍼티에 값 다시 할당
    s1.displayInfo() //메서드 실행
    
    //이름과 나이 출력
}

//명시적 생성자를 사용하지 않고 클래스 정의
class Student {
    lateinit var name:String  //변수를 나중에 할당받을 수 있음
    var age:Int = 0 //age 프로퍼티의 초기값을 0으로 할당

    fun displayInfo() {
    			//Student 클래스의 name 프로퍼티의 초기값이 정해졌다면
				if(this::name.isInitialized) {
                   println("이름은: ${name} 입니다.")
                   println("나이는: ${age} 입니다.")
				}
                
                // Student 클래스의 name 프로퍼티 초기값이 정해지지 않았다면
                else {
					println("name변수를 초기화해주세요.")
				}
    }
}

상수의 지연 초기화 (lazy)

  • 상수를 사용하는 시점에 값을 대입하고, 초기화가 수행된다.
    • 상수를 사용하기 전에는 값 대입 안 하고, 나중에 수행한다.
fun main(){
    var s1 = Student() // 클래스 객체 생성, 인스턴스화
    // 여기까지는 name 프로퍼티는 초기화 안 됨
    // address 프로퍼티도 초기화 안 됨
    
    s1.name = "참새"  //name 프로퍼티에 값 할당(초기화)
    s1.displayInfo() //이 메서드를 호출할 때 address 프로퍼티가 사용되므로 이때 초기화

    s1.age = 10 //age 프로퍼티에 값을 다시 할당
    s1.displayInfo() //위에서 address 프로퍼티 초기화를 했기 때문에, 초기화는 진행하지 않음
}


//명시적 생성자를 사용하지 않고 클래스 정의
class Student {

	// 변수 지연 초기화
    lateinit var name:String //변수를 나중에 할당받을 수 있음
    var age:Int = 0 //age 프로퍼티의 초기값을 0으로 할당
    
    // 상수 지연 초기화
    val address: String by lazy {
        println("address 초기화") //초기화가 되었을 때 실행할 코드
        "seoul" //초기화 값
    }

    fun displayInfo() {
        println("이름은: ${name} 입니다.")
        println("나이는: ${age} 입니다.")
        println("주소는: ${address} 입니다.")
    }
}

참고자료

https://velog.io/@hoyaho/%EC%A7%80%EC%97%B0-%EC%B4%88%EA%B8%B0%ED%99%94

0개의 댓글