컴퓨터 언어/코틀린

[Kotlin] 코틀린 제너릭 Generic

훈츠 2020. 2. 17. 17:54
반응형

안녕하세요. 훈츠 입니다. 오늘은 제너릭 Generic 에 대해 알아보도록 하겠습니다. 제너릭 클래스를 구현 하는 방법과 제너릭 펑션을 구현 하는 방법에 대해 알아보겠습니다. 

제너릭 (Generic)

  • 제너릭은 클래스나 함수에서 사용하는 자료형을 외부에서 지정할수 있는 기능입니다.
  • 제너릭은 함수나 클래스를 선언 할때, 고정적인 자료형 대신 실제 자료형으로 대체되는 '타입 패러미터'를 받아 사용하는 방법입니다. 
  • 제너릭을 이용하면, 다형성에서 배운 is, as연산자 없이 타입변경 없이 사용이 가능합니다. 
  • 타입 파라미터의 이름은 클래스 이름과 규칙이 같지만 일반적으로 'TYPE' 의 이니셜인 'T' 를 사용하는 것이 관례입니다. 만약 여러개의 제너릭을 사용할 경우 T의 다음 알파벳인 <T,U,V>를 추가적으로 사용 하기도 합니다. 
  • 제너릭을 특정한 수퍼 클래스를 상속받은 클래스 타입으로만 제한 하려면 <T : SuperClass> 이렇게 하면 됩니다. 

제너릭 (Generic) 클래스 선언 방법 

Int 는 예시 입니다.

class GenericClass <T> (var pref : T)   다음 과 같이 변경 됨-> class GenericClass <Int> (var pref : Int

open class Animal(var name:String, var type:String){
    open fun introduce(){
        println("${type}, ${name} 입니다. ")
    }
    open fun shout(){
        println("크아아아")
    }
}
//Animal class상속한 Tiger 클래스  
class Tiger(name: String):Animal(name, "호랑이"){
    override fun introduce() {
        super.introduce()
    }
    override fun shout(){
        println("어흥어흥")
    }
}
//Animal class상속한 Cat 클래스 
class Cat(name: String):Animal(name, "고양이"){
    override fun introduce() {
        super.introduce()
    }
    override fun shout(){
        println("야옹야옹")
    }
}
//Animal Class 타입을 타입파라미터로 지정
class Genericfunc <T:Animal>(val t:T){
    fun introduce(){
        t.introduce()
    }
    fun shout(){
        t.shout()
    }
}

fun main() {
    var tiger = Tiger("호랑크")
    var cat = Cat("옹야이")

    Genericfunc(Animal("훈츠","사람")).introduce() //Animal 클래스
    Genericfunc(Animal("훈츠","사람")).shout() //Animal 클래스에 shout 함수 호출

    Genericfunc(tiger).introduce() //Tiger 클래스
    Genericfunc(tiger).shout() //Tiger 클래스에 shout 함수 호출

    Genericfunc(cat).introduce() //Cat 클래스
    Genericfunc(cat).shout() //Cat 클래스에 shout 함수 호출

}
//출력 화면
사람, 훈츠 입니다. 
크아아아
호랑이, 호랑크 입니다. 
어흥어흥
고양이, 옹야이 입니다. 
야옹야옹



 제너릭을 사용하면, 캐스팅을 거치지 않기 때문에 프로그램 속도를 상승 시키는 장점이 있습니다. 반대로 말하면 타입캐스팅을 하면 프로그램의 속도를 저하 시키는 단점이 있습니다. 

제너릭 (Generic) 함수 선언 방법 

Int 는 예시 입니다.

fun <T> genericFunc (param:T):T 다음 과 같이 변경 됨-> fun <Int> genericFunc (param:Int) : Int

//펑션 제너릭 
fun <T:Animal> funcGeneric (t:T){
    t.introduce()
    t.shout()
}
//메인 함수 
fun main() {
    var tiger = Tiger("호랑크")
    var cat = Cat("옹야이")
   
    funcGeneric(cat)
    funcGeneric(tiger)

}
//출력화면
고양이, 옹야이 입니다. 
야옹야옹
호랑이, 호랑크 입니다. 
어흥어흥

open class Animal(var name:String, var type:String){
    open fun introduce(){
        println("${type}, ${name} 입니다. ")
    }
    open fun shout(){
        println("크아아아")
    }
}

class Tiger(name: String):Animal(name, "호랑이"){
    override fun introduce() {
        super.introduce()
    }
    override fun shout(){
        println("어흥어흥")
    }
}

class Cat(name: String):Animal(name, "고양이"){
    override fun introduce() {
        super.introduce()
    }
    override fun shout(){
        println("야옹야옹")
    }
}

 제너릭 클래스와 마찬가지로 제너릭 펑션도 타입 변경 없이 똑같은 결과를 얻을수 있습니다. 

 

반응형