티스토리 뷰

제네릭(Generics) 혹은 제네릭 타입(generic type)은 인자로 사용하는 타입에 따라 구체화되는 클래스나 인터페이스를 말합니다

 

1. 제네릭 클래스/인터페이스 정의

 

// java

class Car {

  ...

}

 

// 항목을 담거나 뺄 수 있는 제네릭 인터페이스 Container 정의

interface Container<T> {

  void put(T item);

  T take();

}

 

// 자동차(Car)를 담거나 뺄 수 있는 클래스 Garage 정의

class Garage implements Container<Car> {

  @Override

  public void put(Car item) {

    ...

  }

 

  @Override

  public Car take() {

    ...

  }

}

 

// kotlin

class Car {

  ...

}

 

// 항목을 담거나 뺄 수 있는 제네릭 인터페이스 Container 정의

interface Container<T> {

  fun put(item: T)

  fun take() : T

}

 

// 자동차(Car)를 담거나 뺄 수 있는 클래스 Garage 정의

class Garage : Container<Car> {

  override fun put(item: Car) {

    ...

  }

 

  override fun take(): Car {

    ...

  }

}

 

다음은 Container 인터페이스가 받을 수 있는 타입을 Car 클래스 및 그 하위 클래스로 제한하는 예입니다

 

// java

interface Container<T extends Car> {

  void put(T item);

  T take();

}

 

// kotlin

interface Container<T: Car> {

  fun put(item: T)

  fun take() : T

}

 

2. 제네릭을 인자로 받는 함수

 

// java

// 호출시점에 타입이 정해지는 제네릭을 인자로 받는 예

<T> void processItems(List<T> items) {

  ...

}

 

// kotlin

// 호출시점에 타입이 정해지는 제네릭을 인자로 받는 예

fun <T> void processItems(items: List<T>) {

  ...

}

 

또한, 자바에서의 ? super T, ? extends T는 코틀린에서 각각 in T, out T로 사용합니다

 

// java

class Car { ... }

class Sedan extends Car { ... }

 

// dst로 받은 목록을 dest에 추가합니다

<T> void append(List<? super T> dest, List<? extends T> dst) {

  dest.addAll(dst);

}

 

List<Sedan> sedans = ...;

List<Car> cars = ...;

append(cars, sedans);

 

// kotlin

open class Car { ... }

class Sedan : Car { ... }

 

// dst로 받은 목록을 dest에 추가합니다

fun <T> append(dest: MutableList<in T>, dst: List<out T>) {

  dest.addAll(dst)

}

 

val sedans: List<Sedan> =  ...

val cars: MutableList<Car> =  ...

append(cars, sedans)

 

3. inline 함수에서 사용하는 reified 키워드 

 

inline fun <reified T>printT(any: Any): Unit {

  if (any is T)

    println("I am a tree: $any")

}

 

printT<Int>(123) 

[출처] [Kotlin] 코틀린의 제네릭(Generics)|작성자 조원호의 행복한 인생

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함