0Pricing
Kotlin Academy · 강의

제네릭 제약

유형 매개변수에 상한을 지정합니다

제네릭 제약은(는) CoddyKit의 무료 Kotlin Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Kotlin Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Kotlin Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

타입 매개변수에 제약 조건 지정하기

때로는 제네릭이 특정 타입만 허용해야 합니다. 예를 들어 비교할 수 있는 타입이나 기반 타입을 상속하는 타입만 허용할 수 있습니다. 제네릭 제약 조건은 타입 매개변수의 상한을 설정합니다.

기본 상한

제약 조건이 없으면 타입 매개변수의 상한은 Any?이므로 null을 허용하는 타입을 포함한 모든 타입을 받아들입니다. null을 허용하지 않는 타입만 허용하려면 Any를 상한으로 지정합니다.

fun <T : Any> requireNonNull(value: T): T {
    return value
}

fun main() {
    println(requireNonNull(42))
}

단일 상한

T : Bound를 사용하면 타입 매개변수가 Bound의 하위 타입이어야 합니다. 그러면 함수 내부에서 상한의 멤버를 호출할 수 있습니다.

fun <T : Number> sumDoubled(a: T, b: T): Double {
    return a.toDouble() * 2 + b.toDouble() * 2
}

fun main() {
    println(sumDoubled(3, 4))
    println(sumDoubled(1.5, 2.5))
}

Comparable 상한

일반적으로 사용하는 상한은 Comparable<T>입니다. 이 상한을 사용하면 <, > 또는 compareTo로 요소를 비교할 수 있습니다.

fun <T : Comparable<T>> maxOf2(a: T, b: T): T {
    return if (a > b) a else b
}

fun main() {
    println(maxOf2(3, 9))
    println(maxOf2("apple", "banana"))
}

상한 멤버 호출하기

제약이 적용된 제네릭 내부에서는 컴파일러가 T에 상한의 기능이 있다는 것을 알므로 형 변환 없이 해당 메서드를 직접 호출할 수 있습니다.

fun <T : CharSequence> describe(value: T): String {
    return "Length is ${value.length}"
}

fun main() {
    println(describe("hello"))
    println(describe(StringBuilder("hi")))
}

where를 사용한 여러 상한

상한이 둘 이상이면 where 절을 사용합니다. 그러면 타입 매개변수는 나열된 ALL 제약 조건을 모두 만족해야 합니다.

fun <T> copyWhenValid(value: T): T
    where T : CharSequence, T : Comparable<T> {
    return value
}

fun main() {
    println(copyWhenValid("text"))
}

클래스에 상한 적용하기

제약 조건은 제네릭 클래스에도 적용할 수 있으며, 해당 클래스를 인스턴스화할 때 허용되는 타입을 제한합니다.

class NumberBox<T : Number>(val value: T) {
    fun asDouble(): Double = value.toDouble()
}

fun main() {
    val box = NumberBox(10)
    println(box.asDouble())
}

제약 조건으로 연산 활성화하기

제약 조건의 목적은 연산을 사용할 수 있게 하는 것입니다. T : Number가 없으면 toDouble()을 호출할 수 없지만, 상한이 해당 메서드의 존재를 보장합니다.

실제 사용에서의 null 비허용 상한

Any를 상한으로 지정하면 null을 허용하는 인수가 컴파일 시점에 거부되므로, null을 허용하지 않는 제네릭을 요구할 때 유용합니다.

fun <T : Any> firstNonNull(a: T, b: T): T = a

fun main() {
    println(firstNonNull("x", "y"))
    // firstNonNull(null, "y") would not compile
}

변성과 함께 사용하기

제약 조건과 변성은 서로 다른 문제를 해결합니다. 변성(in/out)은 하위 타입 관계를 제어하고, 제약 조건(: 상한, where)은 허용되는 타입을 제한합니다. 두 기능은 함께 사용할 수 있습니다.

좋은 제약 조건 설계하기

타입에서 특정 기능이 필요할 때만 제약 조건을 추가합니다. 제약이 지나치게 많으면 재사용성이 낮아지고, 제약이 부족하면 형 변환을 강제하게 됩니다. 사용하는 연산을 제공하는 가장 일반적인 타입을 상한으로 지정합니다.

빠른 확인

타입 매개변수가 둘 이상의 상한을 만족하도록 요구하려면 어떻게 해야 합니까?

복습

제네릭 제약 조건은 T : Bound 또는 여러 상한에 사용하는 where로 상한을 설정하고, 상한의 연산을 사용할 수 있게 하며 호환되지 않는 타입을 제외합니다. Any를 상한으로 지정하면 null을 허용하지 않습니다. 변성과 함께 사용하면 안전하고 표현력 있는 제네릭을 설계할 수 있습니다. 이로써 제네릭과 변성 과정이 끝납니다.

자주 묻는 질문

“제네릭 제약” 강의는 무료인가요?

네 — “제네릭 제약” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Kotlin Academy 강의 전체를 잠금 해제할 수 있습니다. Kotlin Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“제네릭 제약”에서 뭘 배우나요?

유형 매개변수에 상한을 지정합니다 브라우저에서 직접 실행하는 실습 코드로 Kotlin Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Kotlin Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Kotlin Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“제네릭 제약” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Kotlin Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Kotlin Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 제네릭 함수와 클래스
  2. 선언 위치 변성
  3. 사용 위치 변성
  4. 제네릭 제약
← Kotlin Academy(으)로 돌아가기