추상클래스(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
단일 인스턴스로 객체 생성
object를 사용한 생성
// 추상 클래스의 선언
abstract class Printer {
abstract fun print() // 추상 메서드
}
val myPrinter = object: Printer() { // 객체 인스턴스
override fun print() { // 추상 메서드의 구현
println("출력합니다.")
}
}
fun main() {
myPrinter.print()
}
인터페이스
추상클래스와 다른 점
코틀린의 인터페이스
interface 인터페이스명 [: 인터페이스명... ] {
추상 프로퍼티 선언
추상 메서드 선언
[일반 메서드 선언 { ... }]
}
예시
interface Pet {
var category: String // abstract 키워드가 없어도 기본은 추상 프로퍼티
fun feeding() // 마찬가지로 추상 메서드
fun patting() { // 일반 메서드: 구현부를 포함하면 일반적인 메서드로 기본이 됨
println("Keep patting!") // 구현부
}
}
class Cat(override var category: String): Pet {
override fun feeding() {
println("Feed the cat a tuna can!")
}
}
fun main() {
val obj = Cat("small")
println("Pet Category: ${obj.category}")
obj.feeding() // 구현된 메서드
obj.patting() // 기본 메서드
}
게터를 구현한 프로퍼티
// 프로퍼티 게터의 내용 바꾸기
...
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}")
...