3장. 다양한 클래스와 인터페이스

3-1 추상클래스와 인터페이스

추상클래스

추상클래스(abstract class)

abstract class Vehicle

예시

abstract class Vehicle(val name: String, val color: String, val weight: Double) {
	// 추상 프로퍼티
	abstract val maxSpeed: Double

	// 비추상 프로퍼티
	var year: String = "2008"

	// 추상 메서드
	abstract fun start()
	abstract fun stop()

	// 비추상 메서드
	fun displaySpec() {
		println("name: $name, color: $color, weight: $weight, year: $year, maxSpeed: $maxSpeed")
	}
}

// 좀 더 구체화된 Car 클래스
class Car(name: String, color: String, weight: Double, override val maxSpeed: Double)
	: Vehicle(name, color, weight) {
	/*
	1. 주생성자의 프로퍼티가 초기화될 수 있도록 해야한다.
	2. 추상 프로퍼티들을 override하여 재정의 해준다.
	3. 추상 메서드도 override하여 재정의 해야한다.
	*/

	override fun start() {
		println("Car Started")
	}

	override fun stop() {
		println("Car Stopped")
	}

	fun autoPilotOn() {
		println("Auto Pilot ON")
	}
}

class Motorbike(name: String, color: String, weight: Double, override val maxSpeed: Double)
	: Vehicle(name, color, weight) {
		override fun start() {
		println("Motorbike Started")
	}

	override fun stop() {
		println("Motorbike Stopped")
	}
}

fun main() {
	var car = Car("Matiz", "red", 1000.0, 100.0)
	var motor = Motorbike("Motor1", "blue", 1000.0, 100.0)

	car.year = "2014"
	car.displaySpec()

	car.displaySpec()
	car.start()
	motor.displaySpec()
	motor.start()
}

// Name: Matiz, Color: red, Weight: 1000.0, Year: 2014, Max Speed: 100.0
// Car Started
// Name: Motor1, Color: blue, Weight: 1000.0, Year: 2008, Max Speed: 100.0
// Motorbike Started

인터페이스

단일 인스턴스로 객체 생성

인터페이스

게터를 구현한 프로퍼티

// 프로퍼티 게터의 내용 바꾸기

...
interface Pet{
	var category: String
	val msgTags: String  // val 선언 시 게터의 구현이 가능
		get() = "I'm your lovely pet!"

	fun feeding()
	fun patting() {
		println("Keep patting!")
	}
}

...
println("Pet Message Tags: ${obj.msgTags}")
...