2026년 상식닷컴 선정 식당 & 카페 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요

코틀린에서 제네릭을 사용하는 방법은?

_____
Q1: 코틀린에서 제네릭(Generic)이란 무엇인가요?
A1: 제네릭은 클래스나 함수가 사용할 데이터 타입을 일반화하여, 다양한 타입에 대해 타입 안정성과 재사용성을 제공하는 기능입니다. 컴파일 시 타입 검사를 할 수 있어 타입 안전성을 높이고, 코드 중복을 줄여줍니다.

Q2: 코틀린에서 제네릭 클래스를 선언하는 기본 문법은 어떻게 되나요?
A2: 클래스 이름 뒤에 ``와 같이 꺾쇠 괄호 안에 타입 파라미터를 선언합니다.
예시:
```kotlin
class Box(val value: T) {
fun get(): T = value
}
```

Q3: 제네릭 함수는 어떻게 선언하나요?
A3: 함수 이름 앞에 ``와 같이 타입 파라미터를 명시합니다.
예시:
```kotlin
fun singletonList(item: T): List {
return listOf(item)
}
```

Q4: 여러 개의 타입 파라미터는 어떻게 선언하나요?
A4: 쉼표로 구분하여 여러 타입 파라미터를 선언할 수 있습니다.
예시:
```kotlin
class Pair(val first: A, val second: B)
```

Q5: 타입 파라미터에 제한(upper bound)을 두려면 어떻게 하나요?
A5: `:`를 이용해 상위 타입을 제한할 수 있습니다.
예시:
```kotlin
fun half(value: T): Double {
return value.toDouble() / 2.0
}
```

Q6: 제네릭 타입 파라미터에 기본 값을 설정할 수 있나요?
A6: 코틀린 1.4 이상부터는 기본 타입 파라미터를 지정할 수 있습니다.
예시:
```kotlin
class Container(val value: T)
```

Q7: 공변성(covariance)과 반공변성(contravariance)은 무엇이며 코틀린에서 어떻게 표현하나요?
A7:
- 공변성(`out`): 서브타입 관계를 유지하며, 타입 파라미터를 출력(생성) 용도로만 사용.
- 반공변성(`in`): 서브타입 관계가 반대로 적용되며, 타입 파라미터를 입력(소비) 용도로만 사용.
예시:
```kotlin
interface Source {
fun nextT(): T
}

interface Sink {
fun accept(item: T)
}
```

Q8: 제네릭 타입을 사용할 때 타입 실체화(reified)가 필요한 경우 어떻게 하나요?
A8: 인라인 함수에서 `reified` 키워드를 사용해 런타임에 타입 정보를 유지할 수 있습니다.
예시:
```kotlin
inline fun Gson.fromJson(json: String): T {
return this.fromJson(json, T::class.java)
}
```

Q9: 제네릭 타입과 nullable 타입은 어떻게 조합하나요?
A9: 타입 파라미터에 일반적으로 nullable 여부를 지정할 수 있으며, 함수나 클래스 선언시 명시합니다.
예시:
```kotlin
class Box(val value: T?)
fun printValue(value: T?) { println(value) }
```

Q10: 제네릭 타입에서 와일드카드는 어떻게 사용하는가요?
A10: 코틀린에서는 자바의 와일드카드 대신 공변성(`out`), 반공변성(`in`)을 사용하여 표현합니다. 예를 들어, 자바의 `List`는 코틀린의 `List<*>`로 표현합니다.

---

이상은 코틀린에서 제네릭을 사용하는 주요 방법과 개념입니다.
코틀린에서 제네릭(Generics)은 타입 안전성을 제공하고 코드의 재사용성을 높이는 강력한 기능입니다.

제네릭을 사용하면 클래스, 인터페이스, 함수에서 특정 타입을 매개변수로 받아 사용할 수 있습니다.

이를 통해 다양한 타입에 대해 동일한 코드를 작성할 수 있으며, 타입에 대한 검사를 컴파일 타임에 수행할 수 있습니다.

1. 제네릭 클래스 제네릭 클래스를 정의하려면 클래스 이름 뒤에 타입 매개변수를 지정합니다.

예를 들어, 다음은 제네릭 클래스를 정의하는 방법입니다: ```kotlin class Box(val value: T) { fun getValue(): T { return value } } ``` 위의 `Box` 클래스는 타입 매개변수 `T`를 받아서 `value`라는 프로퍼티를 정의합니다.

이 클래스는 어떤 타입의 값을 가질 수 있습니다.

사용 예시: ```kotlin val intBox = Box(12

3) val stringBox = Box("Hello") println(intBox.getValue()) // 123 println(stringBox.getValue()) // Hello ```

2. 제네릭 함수 제네릭 함수는 함수 이름 뒤에 타입 매개변수를 정의하여 만들 수 있습니다.

다음은 제네릭 함수를 정의하는 예입니다: ```kotlin fun printValue(value: T) { println(value) } ``` 위의 `printValue` 함수는 어떤 타입의 값을 받아서 출력합니다.

사용 예시: ```kotlin printValue(4

2) // 42 printValue("Kotlin") // Kotlin ```

3. 제네릭 인터페이스 제네릭 인터페이스도 클래스와 마찬가지로 타입 매개변수를 사용할 수 있습니다.

다음은 제네릭 인터페이스의 예입니다: ```kotlin interface Container { fun getItem(): T } class StringContainer(private val item: String) : Container { override fun getItem(): String { return item } } ``` 위의 `Container` 인터페이스는 타입 매개변수 `T`를 가지고 있으며, 이를 구현한 `StringContainer` 클래스는 `String` 타입을 사용합니다.



4. 제네릭의 제한 제네릭 타입 매개변수에 제한을 두어 특정 타입만 사용할 수 있도록 할 수 있습니다.

이를 위해 `out`과 `in` 키워드를 사용할 수 있습니다.

- `out` : 공변성(covariance)을 나타내며, 타입 매개변수가 출력으로만 사용될 때 사용합니다.

- `in` : 반공변성(contravariance)을 나타내며, 타입 매개변수가 입력으로만 사용될 때 사용합니다.

예시: ```kotlin class Producer(private val value: T) { fun produce(): T { return value } } class Consumer { fun consume(item: T) { println(item) } } ```

5. 타입 제약 제네릭 타입 매개변수에 특정 타입을 제약할 수 있습니다.

예를 들어, 특정 클래스나 인터페이스를 상속받는 타입만 사용할 수 있도록 제한할 수 있습니다.

```kotlin fun add(a: T, b: T): Double { return a.toDouble() + b.toDouble() } ``` 위의 `add` 함수는 `Number` 클래스를 상속받는 타입만 받을 수 있습니다.



6. 제네릭의 사용 예 제네릭은 컬렉션 클래스에서도 널리 사용됩니다.

예를 들어, `List`, `Map`, `Set` 등은 모두 제네릭을 사용하여 다양한 타입의 데이터를 저장할 수 있습니다.

```kotlin val list: List = listOf("Kotlin", "Java", "Python") val map: Map = mapOf(1 to "One", 2 to "Two") ``` 결론 코틀린에서 제네릭은 코드의 재사용성과 타입 안전성을 높이는 데 매우 유용한 기능입니다.

제네릭 클래스를 정의하고, 제네릭 함수를 작성하며, 제네릭 인터페이스를 구현하는 방법을 통해 다양한 타입에 대해 유연하게 코드를 작성할 수 있습니다.

또한, 타입 제약을 통해 특정 타입만을 허용함으로써 더욱 안전한 코드를 작성할 수 있습니다.

이러한 제네릭의 특성은 코틀린을 사용하는 데 있어 매우 중요한 요소입니다.

작성자: 이시우 [비회원] | 작성일자: 1년 전 2024-09-09 09:47:13
조회수: 120 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.