728x90
제네릭은 데이터 타입을 자유롭게 지정할 수 있도록 해주는 형태를 말합니다. 예를 들어 좀 억지스럽지만 정수형 데이터를 받는 아래 클래스가 있다고 가정해 보겠습니다.
class myCal(param1: Int, param2: Int) {
var value1 = param1
var value2 = param2
fun Plus(): Int {
return value1 + value2
}
fun Minus(): Int {
return value1 - value2
}
}
위와 같이 클래스를 생성하고 나면 다음과 같이 클래스를 호출하여 원하는 동작을 수행할 수 있습니다.
var mc = myCal(10, 20)
Log.d("test", "결과값: ${mc.Plus()}")
그런데 클래스를 호출할 때 정수가 아닌 소수에 대한 값이 들어가야 한다면
var mc = myCal(12.24, 8.9)
위와 같은 동작은 수행할 수 없습니다. myCal 클래스는 Int형만 받도록 데이터 타입이 정해져 있기 때문입니다. 그래서 오류가 없이 진행하려면 Double과 같은 소수를 받을 수 있는 동일한 클래스를 새로 만들어야 합니다.
하지만 클래스를 새롭게 만드는 대신 제네릭을 활용하면 새롭게 클래스를 정의하지 않아도 일부 원하는 방향으로 구현할 수 있습니다.
class myCal<T: Number>(param1: T, param2: T) {
var value1 = param1
var value2 = param2
fun Plus(): T {
if (value1 is Int) {
return (value1.toInt() + value2.toInt()) as T
}
else {
return (value1.toDouble() + value2.toDouble()) as T
}
}
fun Minus(): T {
if (value1 is Int) {
return (value1.toInt() - value2.toInt()) as T
}
else {
return (value1.toDouble() - value2.toDouble()) as T
}
}
}
예제에서 T는 타입입니다. myCal클래스를 호출할 때 T에 해당하는 타입만 맞춰주면 주어진 타입에 따른 값을 처리할 수 있습니다.
다만 예제에서는 사칙연산을 수행하는 클래스다 보니 T: Number로 값을 숫자로만 받을 수 있도록 제약을 걸었으며 주어진 타입에 따라 계산과정을 분리했습니다. 하지만 이러한 처리보다는 T가 타입을 대체한다는 제네릭의 특성에 주목해야 합니다.
이제 클래스를 호출할때 다음과 같이 타입을 지정해 호출할 수 있습니다.
var mc = myCal<Double>(12.24, 8.9)
Log.d("test", "결과값: ${mc.Plus()}")
728x90
'Mobile > Kotlin' 카테고리의 다른 글
[Kotlin] 레이아웃(Layout) - 리니어 (0) | 2020.12.11 |
---|---|
[Kotlin] 레이아웃(Layout) - 컨스트런트 (0) | 2020.12.11 |
[Kotlin] 추상 클래스와 인터페이스 (0) | 2020.12.10 |
[Kotlin] 데이터 클래스 (0) | 2020.12.09 |
[Kotlin] 클래스(Class) (0) | 2020.12.09 |