μΆμ ν΄λμ€
μΆμ ν΄λμ€ VS μΈν°νμ΄μ€
μΆμ ν΄λμ€
λ λλ΅μ μΈ μ€κ³μ λͺ
μΈμ 곡ν΅μ κΈ°λ₯μ ꡬνν ν΄λμ€μ΄λ€. μ¦, ꡬ체μ μ΄μ§ μμ κ²μ΄λ€. μΆμ ν΄λμ€
λ₯Ό μμνλ νμ ν΄λμ€
λ μΆμ ν΄λμ€μ λ΄μ©μ λ ꡬ체ν ν΄μΌ νλ€.
μ€μ? κ·ΈλΌ μΆμ ν΄λμ€λ μΈν°νμ΄μ€λ κ°μ κ±° μλ? π€
μλ°ν λ§νλ©΄ λ€λ₯΄λ€. μΈν°νμ΄μ€
μμ λλ΅μ μΈ μ€κ³ λͺ
μΈλ₯Ό ꡬννκ³ μΈν°νμ΄μ€
λ₯Ό μμνλ νμ ν΄λμ€
μμ μ΄λ₯Ό ꡬ체ννλ κ²μ λμΌνλ€. νμ§λ§ μΈν°νμ΄μ€μμλ νλ‘νΌν°μ μν μ 보λ₯Ό μ μ₯ν μ μλ€.
λ€μ λ§νλ©΄ μΈν°νμ΄μ€
μμλ νλ‘νΌν°μ μ΄κΈ°ν
κ° λΆκ°λ₯νλ€λ κ²μ΄λ€.
interface Vehicle {
val name : String
val color : String
val weight : Double
}
interface Pet {
val name : String = "puppy" // λΆκ°λ₯!
}
Pet Interface
μ κ²½μ° μ μμ λμμ μ΄κΈ°νκΉμ§ ν΄μ£Όκ³ μλλ° μΈν°νμ΄μ€
μμ λΆκ°λ₯νλ€.
μΆμ ν΄λμ€ μ¬μ©ν΄λ³΄κΈ°
μΆμ ν΄λμ€
λ μμμ λ§ν κ²μ²λΌ ꡬ체νλμ§ μμ ν΄λμ€μ΄κΈ° λλ¬Έμ μΌλ°μ μΈ κ°μ²΄λ₯Ό μμ±νλ λ°©λ²μΌλ‘ μΈμ€ν΄μ€νλ μ μλ€. μΌλ¨ νλ² μ μν΄λ³΄μ. μ°μ μΆμ ν΄λμ€
λ₯Ό μ μνκΈ° μν΄μ abstract
λΌλ ν€μλλ₯Ό μ¬μ©ν΄μΌ νλ€. λν ν΄λμ€ λ΄μμμ νλ‘νΌν°λ λ©μλλ abstractλ‘ μ μΈν μ μλ€. μ΄λ₯Ό μμλ°λ ν΄λμ€μμ ꡬ체ννκ² λ€λ μλ―Έκ° λλ€. νμ§λ§ μ΄λ₯Ό μ¬μ©νκΈ° μν΄μ ν΄λΉ ν΄λμ€κ° μΆμ ν΄λμ€κ° λμ΄μΌνλ€.
// abstractλ‘ μ μν μΆμ ν΄λμ€μ΄λ€. μ£Όμμ±μλ₯Ό μ¬μ©νλ€.
abstract class Vehicle(val name : String, val color : String, val weight : Double) {
// abstractλ‘ μ μν μΆμ νλ‘νΌν°μ΄λ―λ‘ νμ ν΄λμ€μμ λ°λμ μ¬μ μν΄μΌνλ€.
abstract var maxSpeed : Double
// μ΄κΈ°κ°μ κ°λ μΌλ° νλ‘νΌν° (μΈν°νμ΄μ€μμλ λΆκ°λ₯)
var year = "2021"
// abstractλ‘ μ μν μΆμ λ©μλμ΄λ―λ‘ νμ ν΄λμ€μμ λ°λμ μ¬μ μν΄μΌνλ€.
abstract fun start()
abstract fun stop()
fun displaySpecs() {
println("Name : $name, Color : $color, Weight : $weight, Year : $year, MaxSpeed : $maxSpeed")
}
}
Vehicle ν΄λμ€
λ abstractλ‘ μ μν μΆμ ν΄λμ€μ΄λ―λ‘ κΈ°λ³Έμ μΈ μ€κ³λ§ μ μνκ³ μλ€. abstract
λ₯Ό μ¬μ©ν maxSpeed, start(), stop()μ λ°λμ νμ ν΄λμ€μμ μ¬μ μ ν΄μ€μΌνλ€.
μ¬κΈ°μ μ κΉ! ν΄λμ€λ₯Ό μμνκΈ° μν΄μ λΆλͺ¨ ν΄λμ€λ₯Ό open ν€μλλ‘ μ μν΄μΌ νλλ° μΆμ ν΄λμ€μμλ ν΄μ€μΌ νλμ? π€
μ΄λ―Έ μ½λλ₯Ό ν΅ν΄ λκΌκ² μ§λ§, μΆμ ν΄λμ€
μμλ open ν€μλ
λ₯Ό μ¬μ©νμ§ μμλ λλ€. μΆμ νλ‘νΌν°
λ μΆμ λ©μλ
λ λ§μ°¬κ°μ§λ€!
μμμ μ μν Vehicle ν΄λμ€λ₯Ό μμν΄λ³΄μ.
class Car(name : String, color : String, weight : Double, override var maxSpeed : Double) : Vehicle(name, color, weight) {
override fun start() {
// μ¬μ μ
println("Car start")
}
override fun stop() {
// μ¬μ μ
println("Car Stop")
}
}
class Bicycle(name : String, color : String, weight : Double, override var maxSpeed : Double) : Vehicle(name, color, weight) {
override fun start() {
// μ¬μ μ
println("Bicycle start")
}
override fun stop() {
// μ¬μ μ
println("Bicycle Stop")
}
}
fun main() {
val car = Car("Matiz", "Yellow", 1000, 150)
val bicycle = Bicycle("Bike", "Red", 150, 100)
// μλ‘μ΄ κ° ν λΉ
car.year = "2020"
car.displaySpec()
car.start()
bicycle.displaySpec()
bicycle.start()
displaySpec
μ μΆμ ν΄λμ€
κ° κ°κ³ μλ μΌλ° λ©μλ
μ΄λ€. start
μ stop
μ μΆμν΄λμ€
λ₯Ό μμλ°μ μμ ν΄λμ€
μμ μ€λ²λΌμ΄λ©ν λ©μλ
μ΄λ€. μΆμ ν΄λμ€μμ abstractλ‘ μ μν νλ‘νΌν°λ λ©μλλ€μ μμ ν΄λμ€μμ λ°λμ μ¬μ μλμ΄μΌνλ€.
κ·Έλ λ€λ©΄ νΉμ, μΆμ ν΄λμ€λ₯Ό μμλ°λ νμ ν΄λμ€λ₯Ό μ μνμ§ μκ³ λ μΆμ ν΄λμ€λ₯Ό μ¬μ©ν μ μμκΉ? π€
μ¬μ©ν μ μλ€! object
ν€μλλ₯Ό μ¬μ©νλ©΄ λλ€. (object μ΄ μΉκ΅¬ λ§λ₯μ΄λ€...?)
abstract class Printer {
abstract fun print()
}
val myPrinter = object : Printer() {
override fun print() {
println("print λ©μλκ° μ¬μ μλμμ΅λλ€")
}
}
fun main() {
myPrinter.print()
}
μΈν°νμ΄μ€
μ½νλ¦°
μμλ λ€λ₯Έ μΈμ΄μ λ€λ₯΄κ² λ©μλ
μ ꡬν λ΄μ©μ ν¬ν¨ν μ μλ€.
interface Pet {
var category : String // μΆμ νλ‘νΌν°
fun feeding() // μΆμ λ©μλ
fun patting() { // ꡬνλΆλ₯Ό ν¬ν¨ν μ μλ€. ꡬνλΆλ₯Ό ν¬ν¨νλ©΄ μΌλ° λ©μλ
println("Keep patting")
}
}
μΆμν΄λμ€
μ λ€λ₯΄κ² abstract
ν€μλλ₯Ό μ¬μ©νμ§ μλλ€. λν μμ λ§ν κ²μ²λΌ μνλ₯Ό μ μ₯ν μκ° μμΌλ―λ‘ νλ‘νΌν°μ κΈ°λ³Έ κ°μ κ°μ§ μκ° μλ€.
μΈν°νμ΄μ€ μ¬μ©νκΈ°
class Cat(override var category : String) : Pet { // μ£Όμμ±μλ₯Ό μ΄μ©
override fun feeding() {
println("Feeding λ©μλκ° κ΅¬νλμμ΅λλ€.")
}
}
fun main() {
val obj = Cat("Small")
obj.feeding() // ꡬνλ λ©μλ
obj.patting()// μΌλ° λ©μλ
}
μΈν°νμ΄μ€μμ κ° μ μ₯νκΈ°
μλ μ μλ, μΈν°νμ΄μ€μμλ νλ‘νΌν°μ κ°μ μ μ₯ν μ μλ€κ³ νμ ¨μμμ π₯
νμ§λ§ μμΈκ° μλ€. val
λ‘ μ μΈν νλ‘νΌν°
λ κ²ν°
λ₯Ό ν΅ν΄μ νμν λ΄μ©μ ꡬνν μ μλ€.
interface Pet {
var category : String // μΆμ νλ‘νΌν°
val message : String // valλ‘ μ μΈνλ©΄ κ²ν°μ ꡬνμ΄ κ°λ₯νλ€.
get() = "I'm cutty"
fun feeding() // μΆμ λ©μλ
fun patting() { // ꡬνλΆλ₯Ό ν¬ν¨ν μ μλ€. ꡬνλΆλ₯Ό ν¬ν¨νλ©΄ μΌλ° λ©μλ
println("Keep patting")
}
}
κ²ν°
κ° μ¬μ© κ°λ₯νμ§λ§ κ·Έλ λ€κ³ 보쑰νλ
κ° μ¬μ©κ°λ₯ν κ²μ μλλ€.
μΈν°νμ΄μ€μ μ΄μ
μΈνΌνμ΄μ€λ₯Ό μ¬μ©νλ©΄ λκ° μ’μκΉ? μΌλ¨ μ½λμ μ¬μ¬μ©μ±μ΄ μ¬λΌκ°λ€. νλ§λλ‘ κ°κ²°ν΄μ§λ€λ μ μ΄λ€. λ μΈν°νμ΄μ€λ₯Ό μ΄μ©ν΄μ ν΄λμ€ κ°μ μμ‘΄μ±μ μ κ±°ν μ μλ€. λΏλ§ μλλΌ λ€μ€ μμλ κ°λ₯νλ€. μ½νλ¦°λ μλ°μ²λΌ ν΄λμ€μμ λΆλͺ¨ ν΄λμ€λ₯Ό μμν λλ 1κ°μ ν΄λμ€λ§ κ°λ₯νλ€. νμ§λ§ μΈν°νμ΄μ€λ₯Ό νμ©νλ©΄ λ€μ€ μμμ΄ κ°λ₯ν΄μ§λ€!
μλλ λ κ°μ μΈν°νμ΄μ€λ₯Ό ν΅ν΄ λ€μ€ μμμ ꡬνν μ½λμ΄λ€.
interface Bird {
val wings : Int
fun fly()
fun jump() { // ꡬνλ μΌλ° λ©μλ
println("Bird jump")
}
}
interface Horse {
val maxSpeed : Int
fun run()
fun jump() { // ꡬνλ μΌλ° λ©μλ
println("jump!, max speed : $maxSpeed")
}
}
class Pegasus : Bird, Horse {
override val wings : Int = 2
override val maxSpeed : Int = 100
override fun fly() {
println("The Pegasus Fly!")
}
override fun run() {
println("The Pegasus Run!")
}
override fun jump() {
super<Horse>.jump() {
println("The Pegasus jump")
}
}
}
ꡬνλΆκ° μλ λ©μλμ κ²½μ° νμμ λ°λΌ μ€λ²λΌμ΄λ©μ μ§ννλ©΄ λλ€. λ§μ½ μΈν°νμ΄μ€μμ ꡬνν λ©μλμ μ΄λ¦μ΄ κ°μ κ²½μ° super<μΈν°νμ΄μ€ μ΄λ¦>.λ©μλλͺ
μ ν΅ν΄ ꡬλΆν μ μλ€.
'π» κ°λ° > Kotlin' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[μ½νλ¦° μμ μ 볡] 곡λ³μ±, λ°κ³΅λ³μ±, 무λ³μ± (0) | 2022.05.02 |
---|---|
[μ½νλ¦° μμ μ 볡] μ λ€λ¦ (0) | 2022.04.25 |
[μ½νλ¦° μμ μ 볡] μ¬λ¬ μ’ λ₯μ ν΄λμ€ (0) | 2022.04.23 |