인프런에서 제공하고 있는 코틀린 고급편 강의를 수강한 후 정리한 글입니다.
제너릭과 타입 파라미터
다음과 같은 Animal 클래스, Cage 클래스가 있다.
class Cage {
private val animals: MutableList<Animal> = mutableListOf()
fun getFirst(): Animal {
return animals.first
}
fun put(animal: Animal) {
this.animals.add(animal)
}
fun moveFrom(cage: Cage) {
this.animals.addAll(cage.animals)
}
}
abstract class Animal(
val name: String,
)
abstract class Fish(name: String) : Fish(name)
class GoldFish(name: String) : Fish(name)
class Carp(name: String) : Fish(name)
fun main() {
println("Hello, world!!!")
val cage: Cage()
cage.put(Carp("잉어"))
val carp: Carp = cage.getFirst()
다음과 같은 경우일 때, cage.put(Carp(”잉어”) 를 수행하면, 에러가 발생한다. cage 에는 잉어만 있지만, Animal 이 나오기 때문이다. 밖에서는 carp 인지 확인이 불가능하다. 그래서 다음과 같은 방법을 사용해본다.
방법 1. carp 로 type casting
이 방법은 위험하다. runtime 에는 에러가 발생하지만, compile 단에서는 에러가 발생하지 않는다.
val carp1: Carp = cage.getFirst() as Carp
방법 2.
타입 safe 하게 잉어를 가져오기. Safe Type Casting 과 Elvis Operator를 사용한다. 하지만, 여전히 Exception 이 발생할 수 있다.
val carp2: Carp = cage.getFirst() as? Carp ?: throw IllegalArgumentException()
방법 3. 제너릭
동일한 Cage 클래스이지만, 잉어만 넣을 수 있거나, 금붕어만 넣을 수 있는 Cage 구분한다. 이것을 제너릭이라고 한다. 클래스에 타입 파라미터를 추가할 때 클래스 뒤에 <타입> 을 적어준다.
// Carp 로 타입을 넣어준다.
val cage2 = Cage2<Carp>()
cage2.put(Carp("잉어"))
val carp3: Carp = cage.getFirst()
// 금붕어 cage에 금붕어를 한 마리 넣고, 물고기 cage에 금붕어를 옮기기 (moveFrom 사용)
val goldFishCage = Cage2<GoldFish>()
goldFishCage.put(GoldFish("금붕어"))
val fishCage = Cage2<Fish>()
fishCage.moveFrom(goldFishCage) // 타입 mismatch 에러 => 다음 강의에서 확인할 것들.
// 제너릭을 적용한 Cage2 클래스는 다음과 같다.
class Cage2<T> {
private val animals: MutableList<T> = mutableListOf()
fun getFirst() : T {
return animals.first()
}
fun put(animal: T) {
this.animals.add(animal)
}
fun moveFrom(cage: Cage2<T>) {
this.animals.addAll(cage.animals)
}
}
실제 List 와 같은 Collection 에서도 제너릭을 활발하게 사용하고 있다.
'[ Kotlin ]' 카테고리의 다른 글
코틀린의 선언 지점 변성/ 사용 지점 변성 (0) | 2024.08.29 |
---|---|
코틀린의 배열과 리스트, 제너릭과 무공변, 공변, 반공변 (1) | 2024.08.29 |
코틀린의 scope function - 20강 (0) | 2024.08.29 |
코틀린에서 부가적으로 알아둘만한 것들 - 19강 (0) | 2024.08.29 |
코틀린에서 컬렉션을 함수형으로 다루는 방법 -18강 (0) | 2024.08.29 |