nueijeel

[Kotlin 이론] 0515 지연 초기화와 오버라이딩 본문

Kotlin

[Kotlin 이론] 0515 지연 초기화와 오버라이딩

nueijeel 2023. 5. 22. 22:58

2023.05.15

 

 

1. 지연 초기화

 

예외적으로 변수 선언과 동시에 초깃값을 할당할 수 없는 경우가 생기는데, 이때는 lazylateinit 키워드를 사용하여 초기화를 미룰 수 있다.

 

fun main(){
    val a = 1
    val b = 10
    
    lateinit var data1 : String
    
    val data2 : Int by lazy{
    	data1 = b
        a+b
    }
}

 

data1은 lateinit 키워드로 초기화를 미룬 변수이고, data2는 lazy 키워드로 초기화를 미룬 변수이다. lazy 키워드로 초기화하는 변수는 {} 괄호 안에 작성된 내용이 수행된 결괏값을 초깃값으로 할당한다. 괄호 안에 작성된 코드가 여러 줄인 경우에는 맨 마지막 줄의 실행 결과만이 초깃값으로 할당된다.

 

이 코드에서는 lazy 구문이 수행되는 동안 data1에 초깃값을 할당하고, 수행 마지막 줄에 행한 a와 b의 덧셈 결과가 data2의 초깃값으로 할당된다. 

 

val 변수에 저장할 값을 어떠한 처리나 계산을 통해 얻을 수 있을 때 lazy 키워드를 사용한다.

 

지연 초기화 키워드에는 다음과 같은 선언 규칙이 있다. 

< lateinit 키워드 사용 규칙 >
1. var 키워드로 선언된 변수에만 사용할 수 있다.
2. Int, Long, Short, Double, Float, Boolean, Byte 타입(기초 타입 객체)에는 사용이 불가하다.

< lazy 키워드 사용 규칙 >
1. val 키워드로 선언된 변수에만 사용할 수 있다.

 

 

 

2. Overriding

 

Overriding

: 상속 관계의 두 클래스에서 부모 클래스가 가진 메서드를 자식 클래스가 재정의하여 사용하는 개념

 

오버라이딩되는 메서드는 부모가 가지고 있는 메서드의 이름과 매개변수의 형태가 동일한 상태에서 기능만 재정의 해야한다.

 

객체가 자식형 참조변수에 담겨있다면 부모 영역과 자식 영역에 멤버에 모두 접근할 수 있다.

만약 객체가 부모형 참조변수에 담겨있다면 부모 영역에 정의한 멤버만 접근할 수 있는데, 자식 영역 멤버에 부모 영역 메서드를 오버라이딩한 메서드가 있다면 해당 메서드에도 접근이 가능하다.

 

fun main(){
    val sub1 : SubClass = SubClass() 
    
    sub1.superMethod1()
    println("sub1.b1 : ${sub1.b1}")
    println("sub1.a1 : ${sub1.a1}")
    
    val super1 : SuperClass = SubClass()
    
    super1.superMethod1()
    //println("super1.b1 : ${super1.b1}")
    println("super1.a1 : ${super1.a1}")
    
    val sub2 : SubClass2 = SubClass2()
    sub2.superMethod1()
}
open class SuperClass{
    var a1 = 100
    open fun superMethod1(){
    	println("SuperClass의 superMethod1")
    }
}

class SubClass : SuperClass(){
    var b1 = 200
    override fun superMethod1(){
    	println("SubClass의 superMethod1")
    }
}
class SubClass2 : SuperClass(){
    override fun superMethod1(){
    	super.superMethod1()
    	println("SubClass2의 superMethod1")
    }
}

SuperClass를 상속 받는 SubClass가 superMethod1을 오버라이딩 했다.

 

sub1은 SubClass형 변수이기 때문에 SubClass의 멤버 뿐 아니라 SuperClass의 멤버도 접근 가능하다. 오버라이딩한 메서드의 경우 SubClass에서 재정의한 메서드만 호출된다.

 

sub2는 SuperClass형 변수이기 때문에 SubClass의 객체를 생성해 담았지만 SuperClass의 멤버에만 접근이 가능하다. 하지만 SubClass가 SuperClass의 메서드를 재정의했기 때문에 해당 메서드에는 sub2를 통해서도 접근이 가능하다.

 

만약 자식 클래스에서 재정의한 부모 클래스의 메서드를 호출하고 싶다면 SubClass2의 superMethod1()에서 처럼 super 키워드를 사용해 SuperClass의 메서드를 호출하면 된다. 

 

 

 

 

728x90