[TIL] 2023. 12. 07

Gahyeon Leeยท2023๋…„ 12์›” 7์ผ
0

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
19/47

๐Ÿซ ์ธํ„ฐํŽ˜์ด์Šค(interface)

1. ์ธํ„ฐํŽ˜์ด์Šค๋ž€?

  • ๊ณตํ†ต์ ์œผ๋กœ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ์™ธ๋ถ€์—์„œ ์ถ”๊ฐ€ํ•ด์ค„ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ

  • ์ƒ์†์œผ๋กœ ๋‹ญ, ์ฐธ์ƒˆ, ๋น„๋‘˜๊ธฐ์™€ ๋ถ€๋ชจ ํด๋ž˜์Šค์ธ Bird์˜ ๊ด€๊ณ„๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ƒˆ์—๋„ ๋งŽ์€ ์ข…๋ฅ˜๊ฐ€ ์žˆ๊ณ , ๊ณ ์œ ํ•œ ํ–‰๋™๋„ ๋‹ค๋ฅธ๋ฐ ์ฝ”ํ‹€๋ฆฐ์€ ๋ฐ˜๋“œ์‹œ ๋ถ€๋ชจ ํด๋ž˜์Šค๋Š” ํ•œ๊ฐœ๋ผ์„œ ๋ชจ๋‘ ์ƒ์†์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ๊ทผ๋ณธ์ ์ธ ๊ณตํ†ต์ ์„ ์ƒ์† ๋ฐ›๊ณ , ์ถ”๊ฐ€์ ์ธ ๊ธฐ๋Šฅ๋“ค์€ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ถ”๊ฐ€ํ•œ๋‹ค.

  • ์ฝ”ํ‹€๋ฆฐ์€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด interface ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

  • Kotlin์˜ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌ์กฐ

    • ์•„๋ž˜์˜ ์˜ˆ์‹œ์ฒ˜๋Ÿผ ๋ฉ”์†Œ๋“œ์˜ ๋กœ์ง์ด ์กด์žฌํ•˜์ง€์•Š๊ณ  ์ด๋ฆ„๋งŒ ์กด์žฌํ• ๋•Œ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋ผ๊ณ  ํ•œ๋‹ค.
    • ์›๋ž˜ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ถ”์ƒ๋ฉ”์†Œ๋“œ๋งŒ ํ—ˆ์šฉํ•˜์ง€๋งŒ ์ตœ๊ทผ์—๋Š” ์ถ”์ƒ๋ฉ”์†Œ๋“œ๊ฐ€ ์•„๋‹ˆ์—ฌ๋„ ๊ดœ์ฐฎ๋‹ค. ํ•˜์ง€๋งŒ ์˜ˆ์ „์— ์ง  ์ฝ”๋“œ๋“ค์„ ๋งŽ์ด ๋ณผ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ถ”์ƒ๋ฉ”์†Œ๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์Šต๊ด€์„ ๊ฐ€์ง€๋Š” ๊ฒŒ ์ข‹๋‹ค.
interface ์ธํ„ฐํŽ˜์ด์Šค์ด๋ฆ„ {
	fun ๋ฉ”์†Œ๋“œ์ด๋ฆ„()
}

2. ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ?

์ƒ์†์„ ๊ณต๋ถ€ํ•  ๋•Œ ์ƒ์†์œผ๋กœ ๋‹ญ, ์ฐธ์ƒˆ, ๋น„๋‘˜๊ธฐ ํด๋ž˜์Šค๋“ค ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ฒƒ๊นŒ์ง€๋Š” ๋ฌธ์ œ์—†์ง€๋งŒ ์˜ค๋ฆฌ๊ฐ€ ์ถ”๊ฐ€๋œ๋‹ค๋ฉด ๊ณ ๋ฏผ์ด ์ƒ๊ธด๋‹ค. ๋ณดํ†ต ์ƒˆ๋Š” ํ—ค์—„์น˜๋‹ค๋ผ๋Š” ๊ทผ๋ณธ์ ์ด๊ณ , ๊ณตํ†ต์ ์ธ ํ–‰์œ„๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€๋ชจ ํด๋ž˜์Šค์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์œผ๋‹ˆ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™œ์šฉํ•œ๋‹ค.

3. ์˜ˆ์‹œ ์ฝ”๋“œ

๋ฌผ์—์„œ ์ƒํ™œํ•˜๋Š” ์˜ค๋ฆฌ๋Š” Bird๋ฅผ ๋ถ€๋ชจ ํด๋ž˜์Šค๋กœ ๊ฐ€์ง€๋ฉด์„œ ์ถ”๊ฐ€์ ์œผ๋กœ ์ˆ˜์˜๋„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ค๋ฆฌ์—๊ฒŒ WaterBirdBehavior๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ถ”๊ฐ€ํ•ด ์ฃผ์ž.

  • WaterBirdBehavior.kt
interface WaterBirdBehavior {
    fun swim()		// ๋‚ด์šฉ์ด ์—†์ด ๋‘๋Š” ์ด์œ ๋Š” ์–ด์งœํ”ผ ์ด ๋ฉ”์†Œ๋“œ๋ฅผ ํ•ด๋‹น ํด๋ž˜์Šค์—์„œ ๋ฐ›์•„์„œ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•  ๊ฒƒ์ด๊ธฐ ๋–„๋ฌธ์— ๊ตณ์ด ์—ฌ๊ธฐ์— ๋กœ์ง์„ ์งค ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ!
//    fun swim() {
//        println("์ˆ˜์˜ ํ•ฉ๋‹ˆ๋‹ค")
//    }				// ์™„์„ฑํ˜• ๋ฉ”์†Œ๋“œ๋ฅผ ์จ๋„ ๋˜์ง€๋งŒ, interface๋Š” ๋‚ด์šฉ์ด ์—†๋Š” ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋ฅผ ์“ฐ๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.
}
  • Test.kt
fun main() {
    var bird = Bird("์ƒˆ")
    var chicken = Chicken("๋‹ญ")
    var sparrow = Sparrow("์ฐธ์ƒˆ")
    var pigeon = Pigeon("๋น„๋‘˜๊ธฐ")
    var duck = Duck("์˜ค๋ฆฌ")

    bird.fly()
    chicken.fly()
    sparrow.fly()
    pigeon.fly()
    duck.swim()		// Bird์—๋Š” swim์ด ์—†์ง€๋งŒ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋„ฃ์–ด์คฌ๊ธฐ ๋•Œ๋ฌธ์— ์“ธ ์ˆ˜ ์žˆ๋‹ค.
}

open class Bird(name:String) {
    var name: String = ""

    init {
        this.name = name
    }

    fun fly() {
        println("${name} ๋‚ ์•„์š”~")
    }

}

class Chicken(name: String) : Bird(name) {

}

class Sparrow(name: String) : Bird(name) {

}

class Pigeon(name: String) : Bird(name) {

}

class Duck(name: String) : Bird(name), WaterBirdBehavior {	// Bird(name)๋ฅผ ์ƒ์†๋ฐ›๋Š” ๊ฑด ๋˜‘๊ฐ™๊ณ  ๊ทธ ์˜†์— ,(์‰ผํ‘œ)์™€ ์ธํ„ฐํŽ˜์ด์Šค ์ด๋ฆ„์“ฐ๋ฉด ์ด์ œ swim๋ฉ”์†Œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
    override fun swim() {
        println("${name}๊ฐ€ ์ˆ˜์˜ํ•ด์š”~")
    }
}

/*
--> ๊ฒฐ๊ณผ
์ƒˆ ๋‚ ์•„์š”~
๋‹ญ ๋‚ ์•„์š”~
์ฐธ์ƒˆ ๋‚ ์•„์š”~
๋น„๋‘˜๊ธฐ ๋‚ ์•„์š”~
์˜ค๋ฆฌ๊ฐ€ ์ˆ˜์˜ํ•ด์š”~
*/

๐Ÿซ ์ ‘๊ทผ์ œํ•œ์ž

๋ณ€์ˆ˜๋‚˜ ๋ฉ”์†Œ๋“œ์˜ ์ ‘๊ทผ์„ ์ œํ•œํ•  ์ˆ˜ ์žˆ๋‹ค.

1. ์ ‘๊ทผ์ œํ•œ์ž

  • ์ฝ”ํ‹€๋ฆฐ์—์„œ๋Š” public, private, internal, protected๋กœ ์ ‘๊ทผ์„ ์ œํ•œํ•œ๋‹ค.
  • ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•ด์„œ ํด๋ž˜์Šค์˜ ๋ณ€์ˆ˜๋‚˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š”์ง€์˜ ์—ฌ๋ถ€๋ฅผ ์ ‘๊ทผ(๊ฐ์ฒด.๋ณ€์ˆ˜๋‚˜ ๋ฉ”์†Œ๋“œ)์ด๋ผ๊ณ  ํ•œ๋‹ค.
  • ์ ‘๊ทผ๊ถŒํ•œ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ์— ๋ฌด๋ถ„๋ณ„ํ•œ ์ ‘๊ทผ์„ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค.
  • ํด๋ž˜์Šค๋“ค๊ฐ„์— ์ ‘๊ทผํ•˜๋ฉด ์•ˆ๋˜๋Š” ์ƒํ™ฉ์„ ๊ตฌ๋ถ„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ–ฅํ›„์— ์œ ์ง€๋ณด์ˆ˜ ํ•˜๊ธฐ์— ์šฉ์ดํ•˜๋‹ค.

2. ์šฉ์–ด ์ •๋ฆฌ

  • ํ”„๋กœ์ ํŠธ : ์ตœ์ƒ๋‹จ ๊ฐœ๋…์ด๊ณ  <๋ชจ๋“ˆ, ํŒจํ‚ค์ง€, ํด๋ž˜์Šค>๋ฅผ ํฌํ•จํ•œ๋‹ค.

  • ๋ชจ๋“ˆ : ํ”„๋กœ์ ํŠธ ์•„๋ž˜์˜ ๊ฐœ๋…์ด๊ณ  <ํŒจํ‚ค์ง€, ํด๋ž˜์Šค>๋ฅผ ํฌํ•จํ•œ๋‹ค.

  • ํŒจํ‚ค์ง€ : ๋ชจ๋“ˆ ์•„๋ž˜์˜ ๊ฐœ๋…์ด๊ณ  <ํด๋ž˜์Šค>๋ฅผ ํฌํ•จํ•œ๋‹ค. (์šฐ๋ฆฌ๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ์•„๋Š” ๋””๋ ‰ํ† ๋ฆฌ ๊ฐœ๋…)

3. Kotlin์˜ ์ ‘๊ทผ์ œํ•œ์ž ์ข…๋ฅ˜

  • public : ๋ช…์‹œํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ์–ด๋””์„œ๋‚˜ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” public์ด๋‹ค.
  • private : ๋™์ผํ•œ ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
  • internal : ๊ฐ™์€ ๋ชจ๋“ˆ ๋‚ด๋ถ€์—์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
  • protected : ๊ธฐ๋ณธ์ ์œผ๋กœ private์ด์ง€๋งŒ ์ƒ์†์„ ๋ฐ›์€๊ฒฝ์šฐ์— ํƒ€ ๋ชจ๋“ˆ์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
    -> ๋‚˜์ค‘์—๋Š” internal๊ณผ protected๋„ ์“ธ ์ผ์ด ๋งŽ์•„์ง€๊ฒ ์ง€๋งŒ, ์ง€๊ธˆ์€ public๊ณผ private๋งŒ์ด๋ผ๋„ ์ถฉ๋ถ„ํžˆ ์ดํ•ดํ•˜๊ณ  ๋„˜์–ด๊ฐ€์ž. internal๊ณผ protected๋ฅผ ์“ธ ์ผ์ด ์ƒ๊ธฐ๋ฉด ๊ณต์‹ ๋ฌธ์„œ๋กœ ๊ณต๋ถ€ํ•ด ๋ณด์ž.

4. ์˜ˆ์‹œ ์ฝ”๋“œ

โ–ถ๏ธ ์ ‘๊ทผ์ œํ•œ์ž๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•œ ํด๋ž˜์Šค ๋งŒ๋“ค๊ธฐ

  • public, internal๋งŒ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ๊ฐ€๋Šฅ!
// AccessTestClass.kt
class AccessTestClass {
    public var a:Int = 1
    var b = 2                // public์ด ์žˆ๋“  ์—†๋“  ๊ฐ™๋‹ค.(a,b๋Š” ๋˜‘๊ฐ™์€ ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Œ)
    private var c = 3        // private์€ ๋™์ผํ•œ ํด๋ž˜์Šค ๋‚ด์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ('๊ฐ์ฒด์ด๋ฆ„.c'๋ผ๊ณ  ์‚ฌ์šฉ ๋ชป ํ•จ)
    internal var d = 4       // ๊ฐ™์€ ๋ชจ๋“ˆ ๋‚ด์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ
    protected var e = 5      // ๊ธฐ๋ณธ์ ์œผ๋ก  private์ด์ง€๋งŒ ์ƒ์† ๊ด€๊ณ„์—์„œ๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅ

    public fun publicTest() {
        println("public ์ž…๋‹ˆ๋‹ค")
    }

    fun publicTest2() {
        println("public ์ž…๋‹ˆ๋‹ค")
    }

    private fun privateTest() {
        println("private ์ž…๋‹ˆ๋‹ค")
    }

    internal fun internalTest() {
        println("internal ์ž…๋‹ˆ๋‹ค")
    }

    protected fun protectedTest() {
        println("protected ์ž…๋‹ˆ๋‹ค")
    }
}

์•„๋ž˜์˜ ์‚ฌ์ง„๊ณผ ๊ฐ™์ด ๊ฐ์ฒด์— a, b, d(๊ฐ™์€ ๋ชจ๋“ˆ)๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

โ–ถ๏ธ protected์˜ ์˜ˆ์ œ

  • ๋‚ด๋ถ€ํด๋ž˜์Šค์„œ๋งŒ ์‚ฌ์šฉํ•˜๋˜๊ฑธ ํŠน์ • ๊ถŒํ•œ์ด ์žˆ๋Š” ํด๋ž˜์Šค์—๊ฒŒ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.
  • ์—ฌ๊ธฐ์„œ ํŠน์ • ๊ถŒํ•œ์„ ๊ฐ€์ง€๋ ค๋ฉด protected๊ฐ€ ์กด์žฌํ•˜๋Š” ๋ถ€๋ชจํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š”๋‹ค.
// AccessTestChildClass.kt
class AccessTestChildClass: AccessTestClass() {    // AccessTestClassํด๋ž˜์Šค์˜ ์ƒ์† ๋ฐ›์Œ(์œ„์˜ AccessTestClass๋ฅผ open์œผ๋กœ ๋ฐ”๊ฟ”์•ผ ์ƒ์†๋ฐ›์„ ์ˆ˜ ์žˆ์Œ)

    fun protectedTest1() {
        println("e์˜ ๊ฐ’์€ ${e}")
    }
}
  • ์‹คํ–‰ํ•ด์„œ ๊ฒฐ๊ณผ๋ฅผ ๋น„๊ตํ•ด๋ณด์ž.
fun main() {
    var accessTestClass = AccessTestClass()
    var accessTestChildClass = AccessTestChildClass()

// . ํ•˜๊ณ  ์ ‘๊ทผ๊ฐ€๋Šฅํ•œ ์š”์†Œ๋ฅผ ํ™•์ธ
//    accessTestClass. 
    accessTestChildClass.protectedTest1()
}

// ๊ฒฐ๊ณผ : e์˜ ๊ฐ’์€ 5
profile
์ฝ”๋ฆฐ์ด ๊ฐ•์•„์ง€ ์ง‘์‚ฌ๐Ÿถ

0๊ฐœ์˜ ๋Œ“๊ธ€