본문 바로가기

Kotlin/Basic

Kotlin - 제너릭 (Generic)

내가 코틀린을 배우면서 코틀린에 있어 특별하다고 생각되는 부분들 또는 메모해두어야 할 점들을 여기에 적어놓으려고 한다.

 

제너릭이란 클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법을 의미한다. 아래 예시는 Farm이라는 클래스에서 Animal이라는 수퍼클래스를 가진 하위클래스들을 가지는 List를 내부에 가지도록 했다. 예를 들어, cowFarm에는 Cow 클래스 인스턴스들을 가진 리스트인 cows를 넣었다.

 

예시

 

fun main() {
    var cows:List<Cow> = listOf(Cow(), Cow(), Cow())
    var dogs:List<Dog> = listOf(Dog(), Dog(), Dog())
    
    var cowFarm = Farm(cows)
    var dogFarm = Farm(dogs)
    
    cowFarm.callAnimals()
    dogFarm.callAnimals()
}

class Farm<T: Animal>(var animals: List<T>) {
    fun callAnimals() {
        for (i in animals) {
            i.makeSound()
        }
    }
}

abstract class Animal(val type: String) {
    abstract fun makeSound()
}

class Cow : Animal("cow") {
    override fun makeSound() {
        println("moo")
    }
}

class Dog : Animal("dog") {
    override fun makeSound() {
        println("bark")
    }
}

 

출력

 

moo
moo
moo
bark
bark
bark

 

제너릭은 컴파일 단계에서 오류가 검출되며, 또한 중복의 제거와 타입의 안전성을 동시에 추구할 수 있다. 또한, 사용할 때 제너릭이 자료형을 대체하게 되어 캐스팅을 방지할 수 있으므로, 성능을 더 높일 수도 있다.

 

출처

https://opentutorials.org/course/1223/6237

https://www.youtube.com/watch?v=fhunk_9LOOQ&list=PLQdnHjXZyYadiw5aV3p6DwUdXV2bZuhlN&index=19