자바는 기본 클래스 선언이 default 이다. 그러나 코틀린은 기본적으로 final이다. 그렇기 때문에 기본적으로 상속이 허용되지 않는다. 그러나 상속을 할 수 있는 방법이 있다. 상속받을 모체 클래스에 open 키워드를 붙이면 된다.
fun main(args: Array<String>): Unit {
val person = Person("홍길동", 32)
val student = Student("김미영", 26, 20201209)
}
open class Person(var name: String, var age: Int)
class Student(name: String, age: Int, var id: Int) : Person(name, age)
Student 옆에 : Person으로 마치 함수나 변수 타입을 선언하듯 붙어있는데,
이렇게 붙여두면, 서브 클래스 : 슈퍼클래스로
서브 클래스가 슈퍼 클래스를 상속한다는 의미이다. 즉, 이 코드는 Student 클래스는 Person 클래스를 상속한다고 선언하는 코드이다.
자바할때 object라는 객체는 모든 자료형 타입을 다 커버할 수 있는 형태이다. 그래서.. 자료형을 모를땐 object 객체로 받아, 해당 자료형으로 다운캐스팅을 하는 경우가 많다. 그 object라는 객체는 코틀린도 가진다.
이 object로 일회용 상속이 가능하다. 클래스에 상속을 한 것이 아니라 객체로 상속을 한 것이기 때문이다.
fun main(args: Array<String>): Unit {
val custom : Person = object : Person("Kotlin", 3){
override fun print() {
println("오버라이딩")
}
}
custom.print()
}
open class Person(val name: String, val age: Int) {
open fun print(){
println("이름 : $name")
println("나이 : $age")
}
}
객체에 object 자료형을 선언하고 : 슈퍼클래스 를 붙여 클래스를 객체에 상속시킨다. 따라서, 오버라이딩 된 함수가 작동된다.
결과 :
오버라이딩
자바를 학습해본 사람이라면 모든 객체 자료형이 object를 상속한다는 것을 알고 있을 것이다. 마찬가지로, 코틀린의 모든 클래스는 Any 라는 클래스를 상속한다.
Any 클래스는 세 가지 멤버함수를 가지고 있다
open class Any {
open operator fun equal(other : Any?) : Boolean
open fun hashCode() : Int
open fun toString() : String
}
첫 함수는 = 연산자를 오버로딩 한다.
두 번째 함수는 객체의 해시코드를 반환하고,
세 번째 함수는 객체를 String 타입으로 반환한다.
예시를 보자.
fun main(args: Array<String>): Unit {
val building = Building("코틀린 건물", 101)
printObject(building)
}
fun printObject(any: Any) {
println(any.toString())
}
class Building(val name: String = "", val number: Int = 0) {
override fun toString() =
"이름 : $name \n호수 : $number 호"
}
open class가 따로 없어도 toString이 오버라이딩 키워드가 붙는 것을 알 수 있다.
코드는 Any.toString을 호출하는데, 오버라이딩이 되어 실질상으론 Building 속의 toString이 호출된다.
결과 :
이름 : 코틀린 건물
호수 : 101 호
'Android > 안드로이드 스터디(Kotlin)' 카테고리의 다른 글
Kotlin] 18. Nothing (0) | 2020.12.09 |
---|---|
Kotlin] 17. 오버라이딩 (0) | 2020.12.09 |
Kotlin] 15. 멤버함수의 중위 표기법(infix) (0) | 2020.12.08 |
Kotlin] 14. in (0) | 2020.12.07 |
Kotlin] 13. invoke? (0) | 2020.12.07 |