코틀린에서의 추상 클래스에 대해 알아봅니다.
1. 추상 클래스
추상 클래스는 abstract 키워드와 함께 전업됩니다.
추상 클래스는 일반적인 방법으로 인스턴스화 될 수 없습니다.
추상 클래스를 상속하는 하위 클래스가 어떻게 만들어져야 하는지 나타내는 용도로 사용됩니다.
추상 클래스의 멤버인 프로퍼티나 메서드 또한 abstract로 선언될 수 있으며 이를 추상 프로퍼티 혹은 추상 메서드라고 합니다. 추상 프로퍼티나 추상 메서드가 하나라도 존재한다면 그 클래스는 추상 클래스가 되어야 합니다.
추상 프로퍼티와 추상 메서드는 abstract로 선언 함으로써 미완성의 의미를 줄 수 있습니다.
다음 예시를 통해 추상 클래스에 대해 알아보겠습니다.
abstract class Vehicle(val name: String, val color: String, val weight: Double){
abstract var maxSpeed: Double
var year = "2019"
abstract fun start()
abstract fun stop()
fun displaySpecs(){
println("Name: $name, Color: $color, Weight: $weight, Year: $year, MaxSpeed: $maxSpeed")
}
}
- abstract class Vehicle : 추상 클래스 정의
- abstract var maxSpeed : 추상 프로퍼티 정의
- var year : 일반 프로퍼티 정의
- abstract fun start / stop : 추상 메서드 정의
- fun displaySpecs : 일반 메서드 정의
해당 클래스는 객체를 생성할 수 없고 설계의 역할을 합니다.
abstract선언자가 있는 모든 프로퍼티와 메서드는 반드시 자식 클래스에서 정의되어야 합니다.
이 추상 클래스를 상속하는 자식 클래스를 만들어 보겠습니다.
class Car (name: String, color: String, weight: Double, override var maxSpeed: Double): Vehicle(name, color, weight){
override fun start() = println("Car started.")
override fun stop() = println("Car stopped.")
}
class Motorcycle(name: String, color: String, weight: Double, override var maxSpeed: Double): Vehicle(name, color, weight){
override fun start() = println("Motorcycle started.")
override fun stop() = println("Motorcycle stopped.")
}
- override : 추상 클래스에서 선언된 모든 추상 프로퍼티와 추상 메서드를 구현.
모든 추상 프로퍼티와 추상 메서드를 구현하지 않으면 컴파일러에서 오류를 반환하는 것을 확인할 수 있습니다.
모든 추상 클래스와 프로퍼티를 구현 후 다음 메인 함수를 실행시켜 봅시다.
fun main() {
val car = Car("SuperMatiz", "Yellow", 1100.0, 270.0)
var motor = Motorcycle("DreamBike", "Red", 173.0, 100.0)
car.year = "2013"
car.displaySpecs()
car.start()
motor.displaySpecs()
motor.start()
}
실행결과는 다음과 같습니다.
추상 클래스는 이처럼 하위 클래스에서 반드시 가져야 하는 프로퍼티나 메서드를 제시할 수 있습니다. 또한 일반 프로퍼티나 메서드를 만들어 공통적으로 필요한 기능을 정의할 수도 있습니다.
만약 하위 클래스를 생성하지 않고 단일 인스턴스로 객체를 생성하려면 다음과 같이 수행하면 됩니다.
abstract class Printer{
abstract fun print()
}
var myPrinter = object: Printer(){
override fun print() = println("Print!")
}
fun main() {
myPrinter.print()
}
- abstract class Printer : 추상 클래스를 정의합니다.
- abstract fun print() : 추상 메서드를 정의합니다.
- var myPrinter = object: Printer() : 익명 객체를 생성하고 Printer() 추상 클래스를 상속받습니다.
- override fun print() : 추상 메서드를 구현합니다.
실행 결과는 다음과 같습니다.
익명 객체를 지정하는 object 키워드를 사용해 추상 메서드를 인스턴스화 시킬 수 있습니다.
'Programming' 카테고리의 다른 글
[Kotlin] 32. 데이터 클래스 (0) | 2019.09.12 |
---|---|
[Kotlin] 31. 인터페이스 (0) | 2019.09.12 |
[Kotlin] 29. 컴패니언 객체 (0) | 2019.09.01 |
[Kotlin] 28. 위임(Delegation) (0) | 2019.09.01 |
[Kotlin] 27. 지연 초기화: lazy (0) | 2019.08.27 |