For Programmer

13. 코틀린 - 제네릭 과 다형성 본문

Programming language/Kotlin

13. 코틀린 - 제네릭 과 다형성

유지광이 2021. 8. 25. 21:58
728x90

안드로이드를 개발하면서 제네릭을 사용하는 경우는 흔치않다. 하지만 안드로이드 개발할 때 사용하는 메서드들을 보면 웬만하면 다 제네릭으로 구현되어 있다. 따라서 제네릭으로 구현된 코드를 읽을 수 있어야 한다.

 

간단한 제네릭 사용법이다.

//제너릭을 사용하지 않은 경우
    //형 변환을 해줘야 한다.
    val list1 = listOf(1, 2, "가")
    val b: String = list1[2].toString() //형변환(타입변환)

    //제너릭을 사용하는 경우
    val list2 = listOf<String>("a", "b", "c")
    val c: String = list2[2] //String이라는것을 보장받는다.

    //제너릭을 사용하지 않은 경우
    val list5 = listOf(1, 2, 3, "가") // -> Any타입으로 지정됨(float,Int,String 등의 부모)

 

제네릭을 사용하여 간단한 클래스를 만들어 보면 다음과 같다.

class Box<T>(t: T) {
    var value = t
}

fun main(args: Array<String>) {
val box:Box<Int> = Box<Int>(1)
    println(box.value) // 1출력
}

 

제네릭을 사용하여 Number를 상속받는 모든 형을 받아 두 수의 합을 만드는 메소드를 만들어 보았다.

fun <T: Number> _gSum(x:T,y:T): T { //Number형을 상속하는 자료형만 받겠다는 의미(T를 Number형으로 선언)
    return (x.toDouble() + y.toDouble()) as T //가장 큰 double형태로 변경후 + 실행 후 T형으로 캐스팅
}
println(_gSum(1,2)) // 3출력

 

다형성이란 부모의 자료형에 자식의 자료형이 대입될 수 있는것을 이용한 프로그래밍을 의미한다.

fun main(array: Array<String>){

    val a = eval2(Sum2(Sum2(Num2(1),Num2(2)),Num2(4)))
    println(a) // 7 출력
}

interface Expr2 //다형성 구현을 위해 사용될 부모 expr 인터페이스
class Num2(val value:Int):Expr2 //expr 상속함으로써 다형성 장착 완료
class Sum2(val left:Expr2,val right:Expr2):Expr2 //expr 상속함으로써 다형성 장착 완료

fun eval2(e:Expr2):Int{

    if(e is Num2){
        val n = e
        return n.value
    }
    if(e is Sum2){
        return eval2(e.left) + eval2(e.right)
    }
    throw Exception("Unknown expression")
}

-> 간단한 덧셈출력 프로그램을 다형성을 이용하여 구성하였다. Expr2 라는 인터페이스를 Num2와Sum2가 상속받아서 eval2라는 메소드안에서 덧셈을 수행해준다. 이처럼 다형성은 안드로이드 앱을 만드는데 있어서 + 객체지향형 프로그래밍에 있어서 가장 중요한 개념이다.

728x90
Comments