+ 항공대학교 김철기 교수님의 객체 지향 프로그래밍 과목 내용를 정리한 글입니다.
초기화의 순서
상위 클래스 초기화 루틴 완료 후 하위 클래스 초기화 루틴 수행한다.
- 상위 클래스가 갖고 있는 프로퍼티를 상속받아야하기 때문이다.
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 |