References: Do it! 코틀린 프로그래밍

코틀린에서의 추상 클래스에 대해 알아봅니다.

 

 

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

+ Recent posts