๊ณตํต์ ์ผ๋ก ํ์ํ ๊ธฐ๋ฅ์ ์ธ๋ถ์์ ์ถ๊ฐํด์ค ์ ์๋ ๊ธฐ๋ฅ
์์์ผ๋ก ๋ญ, ์ฐธ์, ๋น๋๊ธฐ์ ๋ถ๋ชจ ํด๋์ค์ธ Bird์ ๊ด๊ณ๋ฅผ ๋ง๋ค ์ ์๋ค. ํ์ง๋ง ์์๋ ๋ง์ ์ข ๋ฅ๊ฐ ์๊ณ , ๊ณ ์ ํ ํ๋๋ ๋ค๋ฅธ๋ฐ ์ฝํ๋ฆฐ์ ๋ฐ๋์ ๋ถ๋ชจ ํด๋์ค๋ ํ๊ฐ๋ผ์ ๋ชจ๋ ์์์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ค. ๋ฐ๋ผ์ ๊ทผ๋ณธ์ ์ธ ๊ณตํต์ ์ ์์ ๋ฐ๊ณ , ์ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ๋ค์ ์ธํฐํ์ด์ค๋ก ์ถ๊ฐํ๋ค.
์ฝํ๋ฆฐ์ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค๊ธฐ ์ํด interface ํค์๋๋ฅผ ์ฌ์ฉํ๋ค.
Kotlin์ ์ธํฐํ์ด์ค ๊ตฌ์กฐ
interface ์ธํฐํ์ด์ค์ด๋ฆ {
fun ๋ฉ์๋์ด๋ฆ()
}
์์์ ๊ณต๋ถํ ๋ ์์์ผ๋ก ๋ญ, ์ฐธ์, ๋น๋๊ธฐ ํด๋์ค๋ค ๊ฐ์ ๊ด๊ณ๋ฅผ ๊ตฌ๋ถํ๋ ๊ฒ๊น์ง๋ ๋ฌธ์ ์์ง๋ง ์ค๋ฆฌ๊ฐ ์ถ๊ฐ๋๋ค๋ฉด ๊ณ ๋ฏผ์ด ์๊ธด๋ค. ๋ณดํต ์๋ ํค์์น๋ค๋ผ๋ ๊ทผ๋ณธ์ ์ด๊ณ , ๊ณตํต์ ์ธ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ถ๋ชจ ํด๋์ค์ ์ถ๊ฐํ๋ ๊ฒ์ ์ฌ๋ฐ๋ฅด์ง ์์ผ๋ ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํ๋ค.
๋ฌผ์์ ์ํํ๋ ์ค๋ฆฌ๋ Bird๋ฅผ ๋ถ๋ชจ ํด๋์ค๋ก ๊ฐ์ง๋ฉด์ ์ถ๊ฐ์ ์ผ๋ก ์์๋ ํ ์ ์๋ค. ์ค๋ฆฌ์๊ฒ WaterBirdBehavior๋ผ๋ ์ธํฐํ์ด์ค๋ฅผ ์ถ๊ฐํด ์ฃผ์.
interface WaterBirdBehavior {
fun swim() // ๋ด์ฉ์ด ์์ด ๋๋ ์ด์ ๋ ์ด์งํผ ์ด ๋ฉ์๋๋ฅผ ํด๋น ํด๋์ค์์ ๋ฐ์์ ์ค๋ฒ๋ผ์ด๋ฉํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๊ตณ์ด ์ฌ๊ธฐ์ ๋ก์ง์ ์งค ํ์๊ฐ ์๊ธฐ ๋๋ฌธ!
// fun swim() {
// println("์์ ํฉ๋๋ค")
// } // ์์ฑํ ๋ฉ์๋๋ฅผ ์จ๋ ๋์ง๋ง, interface๋ ๋ด์ฉ์ด ์๋ ์ถ์ ๋ฉ์๋๋ฅผ ์ฐ๋ ๊ฒ์ ๊ถ์ฅํ๋ค.
}
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}๊ฐ ์์ํด์~")
}
}
/*
--> ๊ฒฐ๊ณผ
์ ๋ ์์~
๋ญ ๋ ์์~
์ฐธ์ ๋ ์์~
๋น๋๊ธฐ ๋ ์์~
์ค๋ฆฌ๊ฐ ์์ํด์~
*/
๋ณ์๋ ๋ฉ์๋์ ์ ๊ทผ์ ์ ํํ ์ ์๋ค.
ํ๋ก์ ํธ : ์ต์๋จ ๊ฐ๋
์ด๊ณ <๋ชจ๋, ํจํค์ง, ํด๋์ค>๋ฅผ ํฌํจํ๋ค.
๋ชจ๋ : ํ๋ก์ ํธ ์๋์ ๊ฐ๋
์ด๊ณ <ํจํค์ง, ํด๋์ค>๋ฅผ ํฌํจํ๋ค.
ํจํค์ง : ๋ชจ๋ ์๋์ ๊ฐ๋
์ด๊ณ <ํด๋์ค>๋ฅผ ํฌํจํ๋ค. (์ฐ๋ฆฌ๊ฐ ์ผ๋ฐ์ ์ผ๋ก ์๋ ๋๋ ํ ๋ฆฌ ๊ฐ๋
)
โถ๏ธ ์ ๊ทผ์ ํ์๋ฅผ ํ ์คํธํ๊ธฐ ์ํ ํด๋์ค ๋ง๋ค๊ธฐ
// 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์ ์์
// 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