728x90
반응형
1. 클래스와 인터페이스에서 제네릭 사용하기
클래스와 인터페이스에도 제네릭을 적용할 수 있다.
클래스나 인터페이스에서 타입을 인수로 받으려면 선언시 이름 옆에 <식별자>를 붙인다.
class Pair<A, B>(val first: A, val second: B) {
override fun toString() = "$first\n$second"
}
제네릭이 적용된 클래스와 인터페이스에는 이름 옆에 <타입 인수>를 붙여야 한다.
예제에서는 Int와 Double을 타입 인수로 지정했다.
생성자를 호출할 때도 생성자 이름 옆에 <타입 인수>를 붙인다.
아래 예제에서는 생성자의 인수로부터 타입을 추론할 수 있어 생략이 가능하다.
fun main() {
val pair: Pair<Int, Double>
pair = Pair<Int, Double>(15, 9.12)
println(pair.toString())
}
2. 제네릭이 적용된 인터페이스/클래스 상속·구현하기
제네릭이 적용된 클래스나 인터페이스는 상속할 때 타입 인수를 전달해 주어야 한다.
// T 타입과 덧셈을 가능하게 하는 인터페이스 선언
interface Plusable<T> {
operator fun plus(other: T): T
}
Plusable에는 제네릭이 적용되어 있으므로, 타입 인수를 전달해야 한다.
아래 예제 코드에서는 Rectangle 타입을 전달했다.
class Rectangle(val width: Int, val height: Int): Plusable<Rectangle> {
// plusable에는 제네릭이 적용되어 있으므로, 타입 인수를 전달해야 함(여기서는 Rectangle 타입 전달)
// 인터페이스를 구현하면서 타입 인수를 Rectangle로 전달했으므로 매개변수와 반환 타입을 Rectangle
override fun plus(other: Rectangle): Rectangle =
Rectangle(width + other.width, height + other.height)
override fun toString() = "width: $width, height: $height"
}
fun main() {
val rect = Rectangle(10, 5)
val rect2 = Rectangle(3, 8)
println(rect + rect2)
}
3. 특정 타입을 상속·구현하는 타입만 인수로 받기
제네릭을 사용하다 보면 특정 타입에만 선언되어 있는 프로퍼티나 멤버 함수에 접근하기 위해 특정 타입만 인수로 받아야 할 때가 있다. 타입 인수를 특정 타입으로 제한하는 방법을 알아보자!
특정 타입을 구현하는 타입만 인수로 받으려면 상속을 할 때 처럼 타입 매개변수 뒤에 ' : 타입 이름'을 적어준다.
: 타입1, 타입2, ... 와 같이 적으면 여러 개를 지정할 수도 있다.
interface ValueContainer {
fun getValue(): Int
}
class AAA: ValueContainer {
override fun getValue(): Int = 1102
}
class BBB: ValueContainer {
override fun getValue(): Int = 127
}
fun<T:ValueContainer> T.printValue() {
println(this.getValue())
}
fun main() {
AAA().printValue()
BBB().printValue()
}
728x90
반응형
'TIL > Kotlin' 카테고리의 다른 글
[TIL/Kotlin] 코틀린 고급문법_반복자(Iterator)와 반복문 for문 (0) | 2023.05.26 |
---|---|
[TIL/Kotlin] 코틀린 고급문법_in/out 키워드와 ..연산자와 범위 표현식 (0) | 2023.05.26 |
[TIL/Kotlin] 코틀린 고급문법_리시버가 붙은 함수리터럴, 제네릭(Generic), 여러 타입을 인수로 받기, 구체화된 타입 매개변수 (0) | 2023.05.26 |
[TIL/Kotlin] 코틀린 고급문법_함수 참조, 고차 함수, 클로저(Closure) (0) | 2023.05.24 |
[TIL/Kotlin] 코틀린 고급문법_함수 리터럴과 람다식, 익명 함수, it 식별자 (0) | 2023.05.24 |