본문 바로가기

Study/Kotlin Study

[Kotlin] 하위 클래스 초기화

+ 항공대학교 김철기 교수님의 객체 지향 프로그래밍 과목 내용를 정리한 글입니다.

초기화의 순서

상위 클래스 초기화 루틴 완료 후 하위 클래스 초기화 루틴 수행한다.

- 상위 클래스가 갖고 있는 프로퍼티를 상속받아야하기 때문이다.

open class Vehicle {
    init {
        println("Initializing Vehicle")
    }
}

open class Car : Vehicle() {
    init {
        println("Initializing Car")
    }
}

class Truck : Car() {
    init {
        println("Initializing Truck")
    }
}

fun main() {
    val truck = Truck()
    // Initializing Vehicle
    // Initializing Car
    // Initializing Truck
}

상위 클래스 생성자로 데이터 전달

상위 클래스 생성자 인자로 데이터 전달한다.

open class Person(val name: String, val age: Int)

class Student(name: String, age: Int, val university: String) : Person(name, age)

fun main() {
    val student = Student("Charlie", 23, "KAU")
    println(student.name) // Person에 저장된 name
    println(student.age) // Person에 저장된 age
    println(student.university) // Student에 저장된 university
}

부생성자에서의 상위 클래스 생성자 호출

하위 클래스 생성자 뒤에 : super(...)를 통해 상위 클래스 생성자 호출한다.

open class Person(val name: String, val age: Int)

class Student : Person { // 괄호 없이 상위 클래스가 누군지만 표현
    val university: String
    constructor(name: String, age: Int, university: String) : super(name, age) { // super를 통해 상위 클래스 생성
        this.university = university
    }
}

fun main() {
    val student = Student("Charlie", 23, "KAU")
    println(student.name) // Person에 저장된 name
    println(student.age) // Person에 저장된 age
    println(student.university) // Student에 저장된 university
}

주생성자가 있는 경우

주생성자가 있는 경우, 부생성자는 주생성자를 통해서만 상위 클래스 위임 호출이 가능하다.

open class Person(val name: String, val age: Int)

class Student() : Person { // 주 생성자 '()' 때문에 에러 발생
    val university: String

    constructor(name: String, age: Int, university: String) : super(name, age) {
        this.university = university
    }
}

 

상위 클래스가 여러 생성자를 지원하고 하위 클래스에서도 상위 클래스의 여러 생성자를 이용하고 싶다면 어떻게 해야 할까?

=> 주생성자 대신 부생성자만을 활용해야한다. 

open class Person(val name: String, val age: Int) { // 주생성자
    constructor(firstName: String, familyName: String, age: Int) // 부생성자
        : this("$firstName $familyName", age)
}

class Student : Person {
    val university: String

    constructor(name: String, age: Int, university: String) : super(name, age) {
        this.university = university
    }

    constructor(firstName: String, familyName: String, age: Int, university: String)
            : super(firstName, familyName, age) {
                this.university = university
            }
}

fun main() {
    // 상위 클래스의 부생성자를 이용
    val student = Student("Charlie", "Kim", 23, "KAU")
    println(student.name) // Person에 저장된 name
    println(student.age) // Person에 저장된 age
    println(student.university) // Student에 저장된 university
}

this 누출 문제

open class Person(val name: String, val age: Int) {
    open fun showInfo() {
        println("$name, $age")
    }
    init {
        showInfo()
    }
}

class Student(name: String, age: Int, val university: String) : Person(name, age) {
    override fun showInfo() {
        println("$name, $age, $university ")
    }
}

fun main() {
    val student = Student("Charlie", 23, "KAU") // Charlie, 23, null
}

'Study > Kotlin Study' 카테고리의 다른 글

[Kotlin] 공통 메소드  (1) 2023.10.23
[Kotlin] 타입 검사와 캐스팅  (2) 2023.10.23
[Kotlin] 하위 클래스 선언  (2) 2023.10.23
[Kotlin] Fragment 실습  (2) 2023.10.14
[Kotlin] 영역 함수  (0) 2023.10.09