πŸ’» 개발/Kotlin

[μ½”ν‹€λ¦° 완전정볡] 좔상 ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€

2022. 4. 22. 19:09
λͺ©μ°¨
  1. 좔상 클래슀 VS μΈν„°νŽ˜μ΄μŠ€
  2. 좔상 클래슀 μ‚¬μš©ν•΄λ³΄κΈ°
  3. μΈν„°νŽ˜μ΄μŠ€
  4. μΈν„°νŽ˜μ΄μŠ€ μ‚¬μš©ν•˜κΈ°
  5. μΈν„°νŽ˜μ΄μŠ€μ—μ„œ κ°’ μ €μž₯ν•˜κΈ°
  6. μΈν„°νŽ˜μ΄μŠ€μ˜ 이점

좔상 클래슀

좔상 클래슀 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
  1. 좔상 클래슀 VS μΈν„°νŽ˜μ΄μŠ€
  2. 좔상 클래슀 μ‚¬μš©ν•΄λ³΄κΈ°
  3. μΈν„°νŽ˜μ΄μŠ€
  4. μΈν„°νŽ˜μ΄μŠ€ μ‚¬μš©ν•˜κΈ°
  5. μΈν„°νŽ˜μ΄μŠ€μ—μ„œ κ°’ μ €μž₯ν•˜κΈ°
  6. μΈν„°νŽ˜μ΄μŠ€μ˜ 이점
'πŸ’» 개발/Kotlin' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • [μ½”ν‹€λ¦° 완전정볡] 곡변성, λ°˜κ³΅λ³€μ„±, 무변성
  • [μ½”ν‹€λ¦° 완전정볡] μ œλ„€λ¦­
  • [μ½”ν‹€λ¦° 완전정볡] μ—¬λŸ¬ μ’…λ₯˜μ˜ 클래슀
kodo_o
kodo_o
iOS κΏ€μžΌ!
kodo_o
🍎🍏
kodo_o
전체
였늘
μ–΄μ œ
  • λΆ„λ₯˜ 전체보기 (149)
    • πŸ”¨ ν”„λ‘œμ νŠΈ (0)
      • TP 1 (0)
      • WhiteHCCTV (0)
      • FootPrint (0)
    • πŸ’» 개발 (63)
      • iOS (30)
      • Android (6)
      • Kotlin (4)
      • Flutter (9)
      • Node.js (5)
      • Architecture (1)
      • 였늘의 μ‚½μ§ˆ (7)
      • μ—λŸ¬μ™€μ˜ 동침 (1)
    • ✏️ μ•Œκ³ λ¦¬μ¦˜ (6)
      • Graph (6)
      • String (0)
      • Sort (0)
    • ✍️ μ½”ν…Œ μ€€λΉ„ (44)
      • Math (1)
      • Implementation (3)
      • String (3)
      • Brute Force (5)
      • Back Tracking (7)
      • Greedy (0)
      • Dynamic Programming (13)
      • Binary Search (1)
      • DFS, BFS (5)
      • Shortest Path (2)
      • Two Pointer (4)
      • MST (0)
    • πŸ“š CS (6)
      • Operating System (6)
    • ⛹️ 라이프 (30)
      • 2020 κ²¨μšΈλ°©ν•™ λͺ¨κ°μ½”(개인) (12)
      • 2021 여름방학 λͺ¨κ°μ½”(개인) (6)
      • μ½”λ”© ν…ŒμŠ€νŠΈ (1)
      • 회고 (10)

λΈ”λ‘œκ·Έ 메뉴

  • ν™ˆ
  • κΉƒν—ˆλΈŒ

인기 κΈ€

졜근 κΈ€

졜근 λŒ“κΈ€

hELLO Β· Designed By μ •μƒμš°.
kodo_o
[μ½”ν‹€λ¦° 완전정볡] 좔상 ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”

단좕킀

λ‚΄ λΈ”λ‘œκ·Έ

λ‚΄ λΈ”λ‘œκ·Έ - κ΄€λ¦¬μž ν™ˆ μ „ν™˜
Q
Q
μƒˆ κΈ€ μ“°κΈ°
W
W

λΈ”λ‘œκ·Έ κ²Œμ‹œκΈ€

κΈ€ μˆ˜μ • (κΆŒν•œ μžˆλŠ” 경우)
E
E
λŒ“κΈ€ μ˜μ—­μœΌλ‘œ 이동
C
C

λͺ¨λ“  μ˜μ—­

이 νŽ˜μ΄μ§€μ˜ URL 볡사
S
S
맨 μœ„λ‘œ 이동
T
T
ν‹°μŠ€ν† λ¦¬ ν™ˆ 이동
H
H
단좕킀 μ•ˆλ‚΄
Shift + /
⇧ + /

* λ‹¨μΆ•ν‚€λŠ” ν•œκΈ€/영문 λŒ€μ†Œλ¬Έμžλ‘œ 이용 κ°€λŠ₯ν•˜λ©°, ν‹°μŠ€ν† λ¦¬ κΈ°λ³Έ λ„λ©”μΈμ—μ„œλ§Œ λ™μž‘ν•©λ‹ˆλ‹€.