코틀린 고급편 강의 수강 후 정리한 글입니다.
Generic Constraints ( 제너릭 제약 )
type 파라미터 T 에 제약을 거는 방법을 알아본다.
Animal 을 상한선으로 정할 수 있다.
fun main() {
Cage5<Int>() // X
Cage5<Fish>() // OK
Cage5<Animal>() // OK
}
// 다음과 같이 T 옆에 적어주면 된다.
class Cage5<T : Animal> {
}
더불어서, Animal 을 상한으로 하면서, Comparable 을 구현하고 있어야 한다는 것도 정할 수 있다. 제한 조건을 여러개 둘 수 있다.
where
키워드를 사용해서 다음과 같이 사용할 수 있다.
fun main() {
Cage5<Int>() // X
Cage5<Fish>() // OK
Cage5<Animal>() // OK
}
// 다음과 같이 T 옆에 적어주면 된다.
class Cage5<T> where T: Animal, T : Comparable<T> {
fun printAfterSorting() {
this.animals.sorted()
.map { it.name }
.let { println(it) }
}
}
Bird 클래스도 구현해본 후, printAfterSorting 을 호출하도록 해보자. 크기순으로 올바르게 출력이 되는 것을 확인할 수 있다.
fun main() {
val cage = Cage5(mutableListOf(Eagle(), Sparrow())
cage.printAfterSorting()
}
abstract class Bird(
name : String,
private val size: Int,
) : Animal(name), Comparable<Bird> {
override fun compareTo(other: Bird): Int {
return this.size.compareTo(other.size)
}
}
class Sparrow : Bird("참새", 100)
class Eagle : Bird("독수리", 500)
제너릭 제약을 Non-null type 한정에도 사용할 수 있다. null 타입이 오지 않도록 막을 수도 있다.
class Cage2<T: Any?>
제너릭 함수를 사용하면 유연한 코딩이 가능하다는 장점이 있다. 다음과 같은 경우에서 쉽게 확인할 수 있다. 두 리스트에 겹치는 원소가 하나라도 있는지 확인하는 함수이다.
fun List<String>hasIntersection(other: List<String>): Boolean {
return (this.toSet() intersect other.toSet()).isNotEmpty()
}
// ... 타입(String, Int,,,) 별로 해줘야할 텐데 다음과 같이 하면 간단하고 유연하게 만들 수 있다.
fun <T> List<T>.hasIntesection(other: List<T>): Boolean {
return (this.toSet() intersect other.toSet()).isNotEmpty()
}
'[ Kotlin ]' 카테고리의 다른 글
lateinit 과 lazy (0) | 2024.08.30 |
---|---|
코틀린의 선언 지점 변성/ 사용 지점 변성 (0) | 2024.08.29 |
코틀린의 배열과 리스트, 제너릭과 무공변, 공변, 반공변 (1) | 2024.08.29 |
코틀린의 제너릭과 타입 파라미터 (0) | 2024.08.29 |
코틀린의 scope function - 20강 (0) | 2024.08.29 |