
Kotlin에서는 클래스 계층 구조를 정의할 때 abstract class와 open 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 키워드를 사용해야 하며, 모든 메서드는 구현되어 있어야 합니다. 추상 메서드를 가질 수 없습니다.
'Android > Android Core' 카테고리의 다른 글
[Android/Kotlin] CameraX로 자동 사진 및 비디오 촬영 기능 구현하기 (1) | 2024.10.25 |
---|---|
[Android/Kotlin] Bluetooth Notify 기능 구현: CCCD 설정과 알림 활성화 방법 (0) | 2024.10.25 |
[Android/Kotlin] ContentProvider란 무엇인가? (3) | 2024.09.25 |
[Android/Kotlin] Kotlin에서 @Parcelize를 사용하여 객체 전달하기 (0) | 2024.07.25 |
[Android/Kotlin] DiffUtil과 ListAdapter를 활용한 효율적인 RecyclerView 업데이트 (0) | 2024.07.01 |