๊ฐ๋ณ์ฑ
๋ณํ ์ ์๋ค? ๊ฐ๋ณ์ฑ์ด ๋ญ์์? ๐
์ฝํ๋ฆฐ
์์์ ๊ฐ๋ณ์ฑ์ ํ์ ๋งค๊ฐ๋ณ์๊ฐ ํด๋์ค ๊ณ์ธต์ ์ํฅ์ ์ฃผ๋ ๊ฒ์ ๋งํ๋ค. ์๋ฅผ ๋ค์ด ํ์ A์ ๊ฐ์ด ํ์ํ ๋ชจ๋ ํด๋์ค์ ํ์ B์ ๊ฐ์ ๋ฃ์ด๋ ๋ฌธ์ ๊ฐ ์๋ค๋ฉด B๋ A์ ํ์ ํ์์ด ๋๋ค. ์๋ ์ฝ๋๋ฅผ ๋ณด์.
val integer : Int = 1
val number : Number = integer // Number๋ ์์ ์๋ฃํ, Int๋ ํ์ ์๋ฃํ
Intํ์ผ๋ก ์ ์ธํ integer ๋ณ์๊ฐ Numberํ์ผ๋ก ์ ์ธํ number ๋ณ์์ ํ ๋นํด๋ ์๋ฌด ๋ฌธ์ ๊ฐ ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ์ด๊ฒ ๋ฐ๋ก ๊ฐ๋ณ์ฑ์ด๋ค. ๋ ๋ค๋ฅธ ์๋ก๋ Int?์ Int๊ฐ ์๋ค. Int?๋ null๋ ํฌํจํ๋ฏ๋ก Int?๊ฐ Int์ ์์ ์๋ฃํ์ด ๋๋ค.
๊ฐ๋ณ์ฑ์ 3๊ฐ์ง ์ ํ
๊ธฐ๋ณธ์ ์ผ๋ก ์ ๋ค๋ฆญ์์๋ ํด๋์ค ๊ฐ์ ์์์ ํ์์ ๊ฐ๋
์ด ์์ด์ ์๋ก ๋ฌด๊ดํ๋ค. ๋ง์ฝ ์์์ ํ์์ ๋ฐ๋ฅธ ํ์์ ์ฃผ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น? ์ด๋ ๋ณ์ฑ
์ด๋ผ๋ ์๋ก์ด ๊ฐ๋
์ด ์ ์ฉ๋๋ค. ๊ฐ๋ณ์ฑ์๋ ๊ณต๋ณ์ฑ, ๋ฐ๊ณต๋ณ์ฑ, ๋ฌด๋ณ์ฑ 3๊ฐ์ง ์ ํ์ด ์กด์ฌํ๋๋ฐ ์ฒ์ฒํ ์์๋ณด๋๋ก ํ์.
๋ณ์ฑ, ๋ณ์ฑ, ๋ณ์ฑ... ๊ฐ์๊ธฐ ์ง๊ตฌ๊ณผํ ์์ ์ด ๋ ๊ฑฐ ๊ฐ์๋ฐ์? ๐ฅ
์ฐ์ Intํ์ด Numberํ์ ํ์ ์๋ฃํ์ธ ๊ฒ์ ๋ช ํํ๋ค. ์ด ๋ Class Box< Out T >๋ก ์ ์ํ๋ฉด Class Box< Int >๋ Class Box< Number >์ ํ์ ์๋ฃํ์ด ๋๋ค. ๊ทธ๋ฅ ๊ทธ๋๋ก ์ดํดํ๋ฉด ๋ ๊ฒ์ด๋ค.
๊ณต๋ณ์ฑ์
ํ์ ๋งค๊ฐ๋ณ์์ ์, ํ์ ๊ฐ๋
์ ๊ทธ๋๋ก ๊ฐ์ ธ์จ๋ค๋ ๋๋์ด๋ค.
- ๊ณต๋ณ์ฑ - A๊ฐ B์ ํ์ ์๋ฃํ์ด๋ฉด Class< A >๋ Class< B >์ ํ์ ์๋ฃํ์ด๋ค.
- ์์ฐ์ ์ ์ฅ์ Out ์ฑ์ง
๋ฐ๊ณต๋ณ์ฑ
์ ๊ณต๋ณ์ฑ๊ณผ ๋ฐ๋์ ๊ฐ๋
์ด๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก Intํ์ด Numberํ์ ํ์ ์๋ฃํ์ด๋ผ๋ ์ฌ์ค์ ๋ช
๋ฐฑํ๊ณ , Class Box< In T > ๋ก ์ ์ํ๋ฉด Class Box< Number >๊ฐ Class Box< Int >์ ํ์ ์๋ฃํ์ด ๋๋ค.
- ๋ฐ๊ณต๋ณ์ฑ - A๊ฐ B์ ํ์ ์๋ฃํ์ด๋ฉด Class< B >๋ Class< A >์ ํ์ ์๋ฃํ์ด๋ค.
- ์๋น์ ์ ์ฅ์ In ์ฑ์ง
๋ฌด๋ณ์ฑ
์ ๋ ํด๋์ค ์ฌ์ด์ ์๋ฌด๋ฐ ๊ด๊ณ๋ ์๋ค๋ ๊ฐ๋
์ด๋ค.
- ๋ฌด๋ณ์ฑ - Class< A >์ Class< B >๋ ์๋ฌด ๊ด๊ณ๊ฐ ์๋ค.
- ์์ฐ์ + ์๋น์
๊ณต๋ณ์ฑ๊ณผ ๋ฐ๊ณต๋ณ์ฑ์ด ์กฐ๊ธ ํท๊ฐ๋ฆด ์ ์๋ค. ์๋์ ๊ทธ๋ฆผ์ ์ฐธ๊ณ ํ๋ฉด ๋์์ด ๋ ๊ฒ์ด๋ค.
๋ฌด๋ณ์ฑ
์ ๋ค๋ฆญ ํด๋์ค๋ฅผ ์ธ์คํด์คํ ํ ๋ ์๋ก ๋ค๋ฅธ ์๋ฃํ์ ์ธ์๋ก ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์๋ฃํ ์ฌ์ด์ ์, ํ์ ๊ด๊ณ๋ฅผ ์ ๋ฐ์ ธ์ผ ํ๋ค. ํ์ ๋งค๊ฐ๋ณ์
๋ฅผ ์ ์ธํ ๋ Out
In
ํค์๋ ์์ด ๊ทธ๋ฅ ์ ์ธํ๋ฉด ๋ฌด๋ณ์ฑ์ผ๋ก ํด๋์ค๊ฐ ์ ์ธ๋๋ค. Nothing, Int, Any ์๋ฃํ์ ๊ด๊ณ๋ฅผ ์ดํด๋ณด๋ฉด Nothing ↔ Int ↔ Any ์ ์, ํ์ ๊ด๊ณ๋ฅผ ๊ฐ์ง๊ณ ์๋๋ฐ ์ด๋ ๊ฒ ์ํ ๊ด๊ณ๊ฐ ๋ช
ํํด๋ ํด๋์ค๊ฐ ๋ฌด๋ณ์ฑ์ผ๋ก ์ ์ธ๋๋ฉด ์๋ฃํ ๋ถ์ผ์น ์ค๋ฅ๋ฅผ ๋ฐ์์ํจ๋ค. ์๋ ์ฝ๋๋ฅผ ์ดํด๋ณด์.
class Box<T>(val size : Int) // ๋ฌด๋ณ์ฑ์ผ๋ก ์ ๋ค๋ฆญ ํด๋์ค ์ ์ธ
fun main() {
val anys : Box<Any> = Box<Int>(10) // ์ค๋ฅ, ์๋ฃํ ๋ถ์ผ์น
val nothings : Box<Nothing> = Box<Int>(10) // ์ค๋ฅ, ์๋ฃํ ๋ถ์ผ์น
๊ณต๋ณ์ฑ
ํ์ ๋งค๊ฐ๋ณ์
์ ์, ํ์ ๊ด๊ณ๊ฐ ์ฑ๋ฆฝํ๊ณ , ๊ทธ ๊ด๊ณ๊ฐ ๊ทธ๋๋ก ์ธ์คํด์ค ์๋ฃํ์ผ๋ก ์ด์ด์ง๋ ๊ฒฝ์ฐ ์ด๋ฅผ ๊ณต๋ณ์ฑ
์ด๋ผ๊ณ ํ๋ค.
class BoxOut T>(val size : Int) // ๊ณต๋ณ์ฑ์ผ๋ก ์ ๋ค๋ฆญ ํด๋์ค ์ ์ธ
fun main() {
val anys : Box<Any> = Box<Int>(10) // Int๋ Any์ ํ์ ํด๋์ค์ด๋ฏ๋ก ๊ฐ์ฒด ์์ฑ ๊ฐ๋ฅ
val nothings : Box<Nothing> = Box<Int>(10) // ์ค๋ฅ, ์๋ฃํ ๋ถ์ผ์น
Out
ํค์๋๋ฅผ ์ฌ์ฉํด์ ๊ณต๋ณ์ฑ์ผ๋ก ํด๋์ค๋ฅผ ์ ์ธํ๋ค. Any์ ๊ฒฝ์ฐ Int์ ์์ ํด๋์ค์ด๋ฏ๋ก Intํ์ผ๋ก ์์ฑํ ๊ฐ์ฒด๋ Any์ ํฌํจํ ์ ์๋ค. ํ์ง๋ง Nothing์ ๊ฒฝ์ฐ Int์ ํ์ ํด๋์ค์ด๋ฏ๋ก Intํ์ผ๋ก ์์ฑํ ๊ฐ์ฒด๋ฅผ ํฌํจํ ์ ์๋ค.
๊ณต๋ณ์ฑ์์ ์๋ฃํ ์ ํํ๊ธฐ
์ ๋ค๋ฆญ์ ์ฌ์ฉํ ๋ ์๋ฃํ ํ์ ์ ์ ํํ ์ ์๋ค๊ณ ์๊ธฐํ์๋ค. ๊ณต๋ณ์ฑ์์๋ ๋๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค.
open class Animal(val size : Int) {
fun feed() = println("Feeding")
}
class Cat(val jump : Int) : Animal(50)
class Dog(val weight : Int) : Animal(80)
class Box<out T : Animal>(val element : T) {
// Out ํค์๋๋ฅผ ์ฌ์ฉํด์ ๊ณต๋ณ์ฑ์ผ๋ก ์ ์ธ
// ๋ฐ๋ผ์ ํ์ ์๋ฃํ์ด ์์ ์๋ฃํ์ผ๋ก ๋ณํํ๋ ๊ฒ์ ๊ด์ฐฎ๋ค.
}
fun main() {
// ๊ฐ์ฒด ์์ฑ
val c1 : Cat = Cat(10)
val c2 : Dog = Dog(20)
var a1 : Animal = c1 // ํ์ ์๋ฃํ์ด ์์ ์๋ฃํ์ผ๋ก์ ๋ณํ์ ๊ฐ๋ฅ.
a1 = s1
val c3 : Box<Cat> = Box<Animal>(10) // ์์ ์๋ฃํ์ด ํ์ ์๋ฃํ์ผ๋ก์ ๋ณํ์ ๋ถ๊ฐ๋ฅ
val c4 : Box<Any> = Box<Cat>(!0) // ์๋ฃํ์ Animal๋ก ์ ํํ์ผ๋ฏ๋ก Animal, Cat, Dog๋ฅผ ์ ์ธํ ๋ค๋ฅธ ์๋ฃํ์ ์ฌ์ฉ๋ถ๊ฐ.
}
'๐ป ๊ฐ๋ฐ > Kotlin' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ฝํ๋ฆฐ ์์ ์ ๋ณต] ์ ๋ค๋ฆญ (0) | 2022.04.25 |
---|---|
[์ฝํ๋ฆฐ ์์ ์ ๋ณต] ์ฌ๋ฌ ์ข ๋ฅ์ ํด๋์ค (0) | 2022.04.23 |
[์ฝํ๋ฆฐ ์์ ์ ๋ณต] ์ถ์ ํด๋์ค์ ์ธํฐํ์ด์ค (2) | 2022.04.22 |