본문 바로가기
Android/Android Core

[Android/Kotlin] Kotlin에서 abstract class와 open class의 차이점

by quessr 2024. 10. 4.

 

Kotlin에서는 클래스 계층 구조를 정의할 때 abstract classopen class가 중요한 역할을 합니다. 이 두 클래스는 상속을 허용하지만, 각각의 목적과 사용 방식에서 차이가 있습니다. 이번 글에서는 abstract class와 open class의 개념과 차이점을 코드 예시와 함께 알아보겠습니다.

 

1. abstract class (추상 클래스)

정의:
abstract class는 인스턴스화할 수 없는 클래스입니다. 즉, 객체를 직접 생성할 수 없으며, 반드시 상속을 통해서만 사용됩니다.

목적:
공통 로직을 상속해주면서, 일부 메서드나 속성은 하위 클래스에서 구현을 강제하는 경우 사용됩니다.

추상 메서드:
추상 클래스는 구현되지 않은 메서드(추상 메서드)를 가질 수 있으며, 하위 클래스에서 반드시 구현해야 합니다.

추상 클래스의 특징:

  • 하나 이상의 추상 메서드를 가질 수 있습니다.
  • 추상 메서드가 없어도 추상 클래스로 선언할 수 있습니다.
  • 직접 객체를 생성할 수 없습니다 (인스턴스화 불가).

예시 코드:

abstract class Animal {
    // 추상 메서드 (구현 없음)
    abstract fun sound()

    // 일반 메서드
    fun breathe() {
        println("Breathing...")
    }
}

class Dog : Animal() {
    // 추상 메서드 구현 (필수)
    override fun sound() {
        println("Bark")
    }
}

val dog = Dog() // 가능
val animal = Animal() // 불가능 (컴파일 오류)

 

위 코드에서 Animal은 추상 클래스이며, sound() 메서드는 하위 클래스에서 구현해야 합니다. Dog 클래스는 Animal을 상속받고, sound() 메서드를 구현했습니다.


2. open class (오픈 클래스)

정의:
Kotlin에서는 기본적으로 클래스는 final로 선언되어 있어 상속할 수 없습니다. 상속이 가능하도록 하려면 open 키워드를 사용해 선언해야 합니다.

목적:
다른 클래스가 해당 클래스를 상속받을 수 있도록 허용할 때 사용됩니다.

open 클래스의 특징:

  • 구현된 메서드만 가질 수 있습니다 (추상 메서드는 가질 수 없음).
  • 상속하려면 클래스뿐만 아니라 메서드나 속성도 open으로 선언되어야 합니다.
  • 직접 객체를 생성할 수 있습니다 (인스턴스화 가능).

예시 코드:

open class Person {
    open fun speak() {
        println("Hello!")
    }
}

class Student : Person() {
    // open 메서드를 오버라이드
    override fun speak() {
        println("I'm a student")
    }
}

val student = Student() // 가능
val person = Person() // 가능

 

위 코드에서 Person은 open 클래스로 선언되어 있으며, speak() 메서드도 open으로 선언되어 있어 하위 클래스에서 오버라이드할 수 있습니다. Student 클래스는 Person을 상속받고 speak() 메서드를 오버라이드했습니다.


주요 차이점

특성 abstract class open class
인스턴스화 인스턴스화 불가 (상속을 통해서만 사용 가능) 인스턴스화 가능
메서드 구현 여부 추상 메서드를 가질 수 있으며, 하위 클래스에서 반드시 구현해야 함 모든 메서드는 구현되어 있어야 함
상속 가능 여부 상속만을 목적으로 사용 (다른 클래스에서 반드시 상속해야 함) 상속을 허용하되, 상속하지 않고도 사용할 수 있음
상속 강제성 추상 메서드가 있을 경우, 하위 클래스에서 반드시 구현해야 함 하위 클래스에서 메서드 오버라이드는 선택 사항

 


요약

  • abstract class:
    인스턴스화할 수 없으며, 추상 메서드를 통해 하위 클래스에서 반드시 구현해야 하는 메서드를 지정할 수 있습니다. 주로 공통 로직을 상속하면서, 하위 클래스에서 구현을 강제할 때 사용됩니다.
  • open class:
    기본적으로 인스턴스화 가능하며, 상속을 허용하는 클래스입니다. 상속을 가능하게 하려면 open 키워드를 사용해야 하며, 모든 메서드는 구현되어 있어야 합니다. 추상 메서드를 가질 수 없습니다.
반응형