abstract
- override 강요
- 선언 필수, 구현 선택
override로 재정의- 디폴트 정의 가능
- 디폴트 정의 시 생략 가능
- 하지만 그럴꺼면 왜씀
인터페이스
- 사전적 의미 : 두 장치를 연결하는 접속기
- 서로 다른 객체를 연결하는 통신 수단
- 객체간의 직접 연결을 막고, 중간 다리 역할
- 동일한 구조에서 기능이 변경/추가/삭제 시 코드 수정을 방지
- 특징
- 변경에 유연 : 객체 구현이 바뀌어도 코드에 영향 X
- 낮은 결합도 : 객체의 구조를 몰라도 사용 가능
- 다형성 구현 : 다양한 input/type에 따른 return
- 남용 시 가독성과 구현 효율이 떨어질 수 있음

abstract선언 X, 기본 속성- 다중 상속 가능
- 디폴트 정의가 존재하더라도 동일한 메소드가 다수 존재 시 override 필요
interface Clickable {
val mouse: String
abstract val keyboard: String
fun click() = println("I was clicked") // 일반 메소드 선언
fun showOff() = println("I'm clickable!") // 디폴트 구현이 있는 메소드
}
interface Focusable {
fun setFocus(b: Boolean) =
println("I ${if (b) "got" else "lost"} focus.")
fun showOff()
}
class Button(override val mouse: String) : Clickable, Focusable {
override val keyboard = "dice"
override fun showOff() = println("?")
}
fun main() {
val button = Button("daiso")
println(button.mouse) // daiso
println(button.keyboard) // dice
button.click() // I was clicked
button.showOff() // ?
}
추상 클래스
abstract지정- 인스턴스 불가
- 상속을 통해 구현
- 일반 method, properies 정의 가능
abstract class Animal {
abstract fun makeSound()
fun eat() = println("쩝쩝")
}
예제
abstract class StarCar {
abstract val color: String
abstract val tire: String
abstract val displacement: Int
abstract val handle: String
object CarSpec {
fun getTax(displacement: Int) =
when {
displacement > 2000 -> 2000
else -> 1000
}
}
open fun getSpec() {
val tax = CarSpec.getTax(displacement)
val spec = if(displacement>2000) "고사양" else "저사양"
println("StarCar $spec 옵션 및 세금")
println("----------------------------------------------------------")
println(String.format("%-8s:%s", "색상", color))
println(String.format("%-8s:%s", "타이어", tire))
println(String.format("%-8s:%s", "배기량", displacement))
println(String.format("%-8s:%s", "세금", tax))
}
}
class StarCarLowGrade (
override val color: String = "blue",
override val tire: String = "일반타이어",
override val displacement: Int = 2000,
override val handle: String = "파워핸들",
) : StarCar() {
}
class StarCarHighGrade (
override val color: String = "red",
override val tire: String = "슬릭타이어",
override val displacement: Int = 2200,
override val handle: String = "파워핸들",
) : StarCar()
fun main() {
val lowGrade = StarCarLowGrade()
val highGrade = StarCarHighGrade()
lowGrade.getSpec()
println()
highGrade.getSpec()
}
>>>
StarCar 저사양 옵션 및 세금
----------------------------------------------------------
색상 :blue
타이어 :일반타이어
배기량 :2000
세금 :1000
StarCar 고사양 옵션 및 세금
----------------------------------------------------------
색상 :red
타이어 :슬릭타이어
배기량 :2200
세금 :1000
interface Engine {
val engineName: String
fun start() = println("$engineName 엔진 시동")
}
class GasEngine: Engine {
override val engineName = "가솔린"
}
class ElectricEngine: Engine {
override val engineName = "전기"
}
class Car(engine: Engine) {
private val engine = engine
fun start() {
engine.start()
}
}
fun main() {
val myCar = Car(GasEngine())
val yourCar = Car(ElectricEngine())
myCar.start() // 가솔린 엔진 시동
yourCar.start() // 전기 엔진 시동
}
interface Toy {
val name: String
fun showName() = println("$name 입니다.")
}
interface Missile: Toy {
fun isMissile() = println("미사일 발사 가능합니다.")
}
interface ArmLeg: Toy {
fun isArmLeg() = println("팔다리를 움직일 수 있습니다.")
}
interface Light: Toy {
fun isLight() = println("불빛 발사 가능합니다.")
}
class Poollmpl: ArmLeg {
override val name = "곰돌이"
fun showFunctions() {
showName()
isArmLeg()
println("=================================\n")
}
}
class Mazingerlmpl: Missile, ArmLeg{
override val name = "마징가"
fun showFunctions() {
showName()
isMissile()
isArmLeg()
println("=================================\n")
}
}
class Airplanelmpl: Missile, Light{
override val name = "비행기"
fun showFunctions() {
showName()
isMissile()
isLight()
println("=================================\n")
}
}
fun main() {
val airplane = Airplanelmpl()
val poo = Poollmpl()
val mazinga = Mazingerlmpl()
airplane.showFunctions()
poo.showFunctions()
mazinga.showFunctions()
}
>>>
비행기 입니다.
미사일 발사 가능합니다.
불빛 발사 가능합니다.
=================================
곰돌이 입니다.
팔다리를 움직일 수 있습니다.
=================================
마징가 입니다.
미사일 발사 가능합니다.
팔다리를 움직일 수 있습니다.
=================================
C
Contents
