티스토리 뷰

Android/Kotlin

[Kotlin] 클래스의 다형성

DevJunku 2021. 12. 7. 08:16

😶‍🌫️ 다형성

  • 이미 우리는 클래스의 상속을 통해 클래스를 확장하는 방법을 알고 있다. 다형성이라는 것은 어떻게 생각하면 좀 어려운 개념이지만, 간단한 예시로 이해하자면 다음과 같다.
  • 점심을 먹을 때 중식, 한식, 양식, 일식 중 한식을 먹는다고 해보자. 이때 한식을 한식 자체로 볼 수도 있지만, 이를 확장시켜 음식이라는 특징으로 생각한다면, 어떨까? 좀 더 확장된다고 생각들지 않는가? 이게 바로 다형성이다.
  • 다시 이야기하자면, 음식이라는 클래스와 이를 상속받은 한식이라는 클래스를 만든 뒤에 한식이라는 클래스로 koreanFood라는 인스턴스를 만든다면, koreanFood에는 음식이라는 클래스 공간에 한식이라는 클래스 공간이 추가된다.
  • 이때 한식 인스턴스를 음식 변수에 담는 행위를 상위 자료형인 super class로 변환했다고 하여 up-casting이라고 하며, up-casting된 인스턴스를 다시 하위 자료형으로 down-casting이라고 한다.
  • 사실 up-casting은 그냥 상위 타입에 할당하는 것으로도 동작하지만, down-casting은 별도의 연산자가 필요하다. 그 연산자가 바로 as와 is 연산자이다.
  • as는 변수를 호환되는 자료형으로 변환해주는 casting 연산자로 코드에서 사용시 즉시 자료형을 바로 변환해주며 변환한 결과를 반환받아 변수에 넣어줄수도 있다.
  • is는 변수가 자료형에 호환되는지 먼저 체크한 후 변환해주는 casting 연산자로 조건문 내에서 사용되는 특징이 있다.

아래의 코드를 확인해보자.

fun main(args: Array<String>) {

    var a = Food()
    a.eat()

    var b: Food = KoreanFood()
    b.eat()

    // is를 통해 짐시 down-casting하는 방법
    if( b is KoreanFood) // 
    {
        b.delicious()
    }

    // as를 통해 down-casting 된 자료형을 저장하여 하위 클래스의 인스턴스를 사용하는 방법
    var c = b as KoreanFood
    c.delicious()
    b.delicious()
}

open class Food {

    var name = "음식"

    open fun eat() {
        println("${name}을 먹습니다.")
    }
}

class KoreanFood: Food() {
    var type = "한식"

    override fun eat() {
        println("${name}중에 ${type}을 먹습니다.")
    }

    fun delicious() {
        println("${type}은 맛있습니다.")
    }
}
  • b는 Food 타입이지만, KoreanFood에서 override한 eat 함수를 호출할 수 있다.
  • 하지만 Food 타입임으로 delicious를 호출할 수는 없다. 실제로 작성해보면 참조할 수 없다고 뜰 것이다.
  • 이때는 is나 as를 통해 down-casting해야 delicious를 사용할 수 있는데, is는 조건문 안에서만 잠깐 down-casting 되며, as의 경우 반환값 뿐만 아니라 사용값까지 모두 down-casting된다.
  • 다형성은 클래스의 상속관계에서 오는 인스턴스의 호환성을 적극 활용할 수 있는 기능으로 슈퍼 클래스가 같은 인스턴스를 한번에 관리하거나 인터페이스를 구현하여 사용하는 코드에서도 이용된다

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

[Kotlin] List  (0) 2021.12.08
[Kotlin] Generic  (0) 2021.12.07
[kotlin] 변수, 함수, 클래스의 접근범위와 접근제한자  (0) 2021.12.06
[Kotlin] Kotlin의 기본 프로젝트 구조  (0) 2021.12.06
[Kotlin] 오버라이딩과 추상화  (0) 2021.12.06