[kotlin] 제네릭(Generic) 데이터 타입 in 코틀린

제네릭(Generic)은 다양한 데이터 타입을 다룰 수 있는 코드를 작성하고자 할 때 사용되는 프로그래밍 개념입니다. 제네릭을 이용하면 데이터 타입에 관계 없이 유연하게 코드를 작성할 수 있고, 코드의 재사용성을 높일 수 있습니다. 코틀린에서도 제네릭을 지원하며, 이를 통해 안정성과 유연성을 동시에 확보할 수 있습니다.

제네릭 클래스 선언

코틀린에서 제네릭을 사용하려면 클래스나 함수를 선언할 때 타입 파라미터를 사용해야 합니다. 타입 파라미터는 일반적으로 알파벳 대문자로 표현되며, 다음과 같이 정의됩니다:

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

위의 예시에서 T는 타입 파라미터를 나타내며, Box 클래스는 제네릭 클래스로 선언되었습니다. Box 클래스의 객체를 생성할 때마다 원하는 타입의 값을 전달할 수 있습니다.

제네릭 함수 선언

제네릭 함수를 선언하는 방법은 제네릭 클래스를 선언하는 방법과 유사합니다. 다음은 제네릭 함수를 선언하는 예시입니다:

fun <T> printItem(item: T) {
    println("Item: $item")
}

위의 예시에서 printItem 함수는 제네릭 함수로 선언되었습니다. 함수 내부에서 T 타입 파라미터를 이용하여 다양한 타입의 데이터를 다룰 수 있습니다.

제네릭 제약(Constraint)

제네릭 클래스나 함수는 특정 타입의 제약을 가질 수 있습니다. 이는 where 키워드를 사용하여 특정 타입을 상속하거나 특정 인터페이스를 구현하는 타입만을 받도록 제한할 수 있습니다.

fun <T : Number> listItems(items: List<T>) {
    for (item in items) {
        println(item)
    }
}

위의 예시에서 listItems 함수는 TNumber 클래스를 상속하는 타입으로 제한되어 있습니다.

제네릭은 코틀린에서 강력한 기능 중 하나로, 형식 안정성을 보장하고 코드의 재사용성을 높일 수 있습니다. 제네릭을 적재적소에 활용하여 보다 안전하고 유연한 코드를 작성할 수 있습니다.