Android

[Android] 코틀린(Kotlin) 클래스(Class)의 상속(Inheritance)와 타입(Type)

구루싸 2020. 5. 4. 17:59
반응형
SMALL

이번 학습은 지난 학습에 이어

코틀린의 클래스에 대해 학습하겠습니다

지난 학습에 클래스의 생성과 초기화에 대해 알아보았는데요

모르신다면 아래의 링크로↓

2020/05/04 - [Android] - [Android] 코틀린(Kotlin) 클래스(Class) 생성과 초기화

 

[Android] 코틀린(Kotlin) 클래스(Class) 생성과 초기화

오늘의 학습 주제는 코틀린의 클래스(Class)입니다 클래스하면 떠오르는 것은 객체 지향(object-oriented)인데 워낙에 정보가 많은 부분이기 때문에 설명은 생략하고 바로 코드로 진행해보겠습니다 package com.ro..

yssa.tistory.com

이번에는 먼저 상속(inheritance)에 대해 알아보겠습니다

상속은 타입 간의 계층적인 관계를 정의하기 위해 사용할 수 있는 객체지향 원리로서

상속해 주는 클래스인 부모 클래스 혹은 슈퍼 클래스(superclass)와

슈퍼 클래스의 모든 속성과 함수를 공유하는 서브 클래스(subclass)가 있습니다 

package com.ros.sandbox

open class Room(val name: String) {
    protected open val dangerLevel = 5

    fun description() = "Room: $name\r\n" + "Danger Level : $dangerLevel"

    open fun load() = "No one came here"
}

open class TownSquare: Room("Town Square") {
    override val dangerLevel: Int
        get() = super.dangerLevel - 3
    private val bellSound = "ding-dong"
    final override fun load() = "All residents are welcome to participate!\r\n${ringBell()}"
    private fun ringBell() = "The bell tower announces your arrival. $bellSound"
}

코틀린은 서브 클래스를 가질 수 있도록 하기 위해서는

슈퍼 클래스에 open 키워드를 사용하여야 하고

overriding 하기 위해서도 마찬가지입니다

만약 더 이상 오버라이딩하지 못하게 하려면 final 키워드를 사용합니다

fun printIsSourceOfBlessings(any: Any) {
    val isSourceOfBlessings = if ( any is Player ) {
        any.isBlessed
    } else {
        /* type casting */
        (any as Room).name == "Fount of Blessings"
    }
    println("$any is a source of blessings: $isSourceOfBlessings")
}
fun main(args: Array<String>) {

    val townSquare = TownSquare()
    
    var className = when(townSquare) {
        is TownSquare -> "TownSquare"
        is Room -> "Room"
        else -> throw IllegalArgumentException()
    }
    printIsSourceOfBlessings(townSquare)
}

위의 코드는 타입 검사와 타입 변환을 보여줍니다

is 를 이용해서 타입 검사를 하며

as 를 이용해서 타입 변환을 합니다

만약 as 로 변환될 수 없을 경우는 ClassCastException이 발생하고

변환될 수 없는 경우는 상속관계가 없을 경우입니다

지난 시간에 스마트 캐스팅(smart casting)을 언급했습니다

여기서 보면 Player 클래스이면 any.isBlessed를 실행하게되어있는데

isBlessed는 Player 클래스의 속성입니다

이 개념이 바로 스마트 캐스팅으로 if 분기를 통해

코틀린 컴파일러가 이미 any의 타입이 Player임을 알고

알아서 변환 후에 처리해줍니다

Any 클래스는 코틀린의 모든 null 불가능 클래스가 상속받는 클래스로서

null 불가능 클래스에 공통적으로 필요한 equals, hashCode, toString을 정의하고

확장된 속성과 함수도 가지고 있는데 쉽게 말해서 최상위 슈퍼 클래스입니다

이것으로 이번 학습을 마치겠습니다

그럼 이만-_-

 

반응형
LIST