abstract class
- abstract class는 추상 클래스를 의미한다.
- abstract 내부에
abstract 멤버를 하나 이상 가진 클래스
를 의미한다.
- 추상 클래스는 객체의 추상적인 상위 개념으로 공통된 개념을 표현할 때 사용한다.
- 추상 클래스는 그 자체의 객체를 생성할 수 없다.
- 생성자는 가질 수 있는데 생성자는 하위 클래스에서 추상 클래스를 상속 받을 때 사용하며 추상 클래스의 concrete 프로퍼티를 초기화 하는데 쓸 수 있다.
- open 키워드를 따로 추가하지 않아도 된다.
추상 클래스 정의
- 추상 클래스로 만들기 위해서는
abstract
변경자 키워드를 붙인다.
- 추상 클래스의 메소드는 추상 메소드와 일반 메소드 사용이 가능하며 추상 메소드의 경우
abstract
키워드를 사용하여 정의한다.
- 추상 메소드는
구현 없이 선언
만 되어 있으며 선언만 되어 있기에 반드시 하위 클래스에서 재정의(override)
해야 된다.
fun main() {
val addOperation = AddOperation()
val add = addOperation.operation(10, 20)
println(add)
val SubtractOperation = SubtractOperation()
val sub = SubtractOperation.operation(10, 5)
println(sub)
}
abstract class AbstractOperation {
abstract fun operation(num1: Int, num2: Int): Double
}
class AddOperation: AbstractOperation() {
override fun operation(num1: Int, num2: Int): Double {
return (num1 + num2).toDouble()
}
}
class SubtractOperation: AbstractOperation() {
override fun operation(num1: Int, num2: Int): Double {
return (num1 - num2).toDouble()
}
}
open class
- open class는 상속 가능한 클래스를 정의할 때 사용한다.
- kotlin의 클래스는 기본적으로 상속이 불가능하므로
open 변경자
를 사용하여 상속받을 수 있도록 허용한다.
- 일반적인 클래스이기도 하기에 단독으로 객체가 되어 사용 될 수 있다.
fun main() {
Animal().printSound()
Dog().printSound()
Cat().printSound()
}
open class Animal() {
open fun printSound() { 하위 클래스에서 선택적으로 override 할 수 있다.
println("growl growl!")
}
}
class Dog: Animal() {
override fun printSound() {
println("bark bark!")
}
}
class Cat: Animal() {
override fun printSound() {
println("mew mew!")
}
}
abstract class vs open class
- abstract class는 객체를 생성할 수 없지만 open class는 단독으로 객체가 되어 사용 할 수 있다.
- abstract class의 멤버는 override가 필수인 반면 open class의 멤버는 선택적으로 override할 수 있다.
- abstract 메소드의 경우 구현 없이 선언만 하는 반면 open 메소드는 반드시 바디를 가져야 한다.