[TIL/Kotlin] 코틀린 고급문법_클래스와 인터페이스에서 제네릭 사용하기, 제네릭이 적용된 인터페이스/클래스 상속·구현하기, 특정 타입을 상속·구현하는 타입만 인수로 받기

2023. 5. 26. 22:05·TIL/Kotlin
728x90
반응형

1. 클래스와 인터페이스에서 제네릭 사용하기

클래스와 인터페이스에도 제네릭을 적용할 수 있다.

클래스나 인터페이스에서 타입을 인수로 받으려면 선언시 이름 옆에 <식별자>를 붙인다.

class Pair<A, B>(val first: A, val second: B) {
    override fun toString() = "$first\n$second"
}

 

제네릭이 적용된 클래스와 인터페이스에는 이름 옆에 <타입 인수>를 붙여야 한다.

예제에서는 Int와 Double을 타입 인수로 지정했다.

생성자를 호출할 때도 생성자 이름 옆에 <타입 인수>를 붙인다.

아래 예제에서는 생성자의 인수로부터 타입을 추론할 수 있어 생략이 가능하다.

fun main() {
    val pair: Pair<Int, Double>
    pair = Pair<Int, Double>(15, 9.12)
    println(pair.toString())
}

2. 제네릭이 적용된 인터페이스/클래스 상속·구현하기

제네릭이 적용된 클래스나 인터페이스는 상속할 때 타입 인수를 전달해 주어야 한다.

// T 타입과 덧셈을 가능하게 하는 인터페이스 선언
interface Plusable<T> {
    operator fun plus(other: T): T
}

 

Plusable에는 제네릭이 적용되어 있으므로, 타입 인수를 전달해야 한다.

아래 예제 코드에서는 Rectangle 타입을 전달했다.

class Rectangle(val width: Int, val height: Int): Plusable<Rectangle> {
    // plusable에는 제네릭이 적용되어 있으므로, 타입 인수를 전달해야 함(여기서는 Rectangle 타입 전달)
    // 인터페이스를 구현하면서 타입 인수를 Rectangle로 전달했으므로 매개변수와 반환 타입을 Rectangle
    override fun plus(other: Rectangle): Rectangle =
        Rectangle(width + other.width, height + other.height)

    override fun toString() = "width: $width, height: $height"
}
fun main() {
    val rect = Rectangle(10, 5)
    val rect2 = Rectangle(3, 8)

    println(rect + rect2)
}

3. 특정 타입을 상속·구현하는 타입만 인수로 받기

제네릭을 사용하다 보면 특정 타입에만 선언되어 있는 프로퍼티나 멤버 함수에 접근하기 위해 특정 타입만 인수로 받아야 할 때가 있다. 타입 인수를 특정 타입으로 제한하는 방법을 알아보자!

 

특정 타입을 구현하는 타입만 인수로 받으려면 상속을 할 때 처럼 타입 매개변수 뒤에 ' : 타입 이름'을 적어준다.

: 타입1, 타입2, ... 와 같이 적으면 여러 개를 지정할 수도 있다.

interface ValueContainer {
    fun getValue(): Int
}

class AAA: ValueContainer {
    override fun getValue(): Int = 1102
}

class BBB: ValueContainer {
    override fun getValue(): Int = 127
}
fun<T:ValueContainer> T.printValue() {
    println(this.getValue())
}

fun main() {
    AAA().printValue()
    BBB().printValue()
}
728x90
반응형

'TIL > Kotlin' 카테고리의 다른 글

[TIL/Kotlin] 코틀린 고급문법_반복자(Iterator)와 반복문 for문  (0) 2023.05.26
[TIL/Kotlin] 코틀린 고급문법_in/out 키워드와 ..연산자와 범위 표현식  (0) 2023.05.26
[TIL/Kotlin] 코틀린 고급문법_리시버가 붙은 함수리터럴, 제네릭(Generic), 여러 타입을 인수로 받기, 구체화된 타입 매개변수  (0) 2023.05.26
[TIL/Kotlin] 코틀린 고급문법_함수 참조, 고차 함수, 클로저(Closure)  (0) 2023.05.24
[TIL/Kotlin] 코틀린 고급문법_함수 리터럴과 람다식, 익명 함수, it 식별자  (0) 2023.05.24
'TIL/Kotlin' 카테고리의 다른 글
  • [TIL/Kotlin] 코틀린 고급문법_반복자(Iterator)와 반복문 for문
  • [TIL/Kotlin] 코틀린 고급문법_in/out 키워드와 ..연산자와 범위 표현식
  • [TIL/Kotlin] 코틀린 고급문법_리시버가 붙은 함수리터럴, 제네릭(Generic), 여러 타입을 인수로 받기, 구체화된 타입 매개변수
  • [TIL/Kotlin] 코틀린 고급문법_함수 참조, 고차 함수, 클로저(Closure)
야리니
야리니
오늘보다 내일 더 성장하는 개발자가 되기 위한 야리니 블로그입니다 :)
    반응형
    250x250
  • 야리니
    야리니의 step by step
    야리니
  • 링크

    • GitHub
    • Linkedin
  • 전체
    오늘
    어제
    • 분류 전체보기 (478)
      • TIL (379)
        • Java (97)
        • Kotlin (28)
        • JPA (16)
        • Spring (37)
        • Oracle (22)
        • JDBC (7)
        • Web(HTML, CSS, JS, jQuery) (90)
        • View Template (31)
        • AWS (7)
        • HTTP (7)
        • CS (5)
        • Linux, Unix (2)
        • Python (20)
      • Trouble Shooting(Error) (37)
      • Algorithm (15)
      • Git,GitHub (8)
      • Diary (24)
      • 독서 (9)
      • Etc (6)
        • Mac (1)
        • 학원준비과정 (2)
  • 블로그 메뉴

    • 방명록
    • 태그
  • 공지사항

    • 안녕하세요 :)
  • 인기 글

  • 태그

    java
    백엔드 개발자
    쌍용교육센터
    Kotlin
    HTML
    java기초
    CSS
    국비지원학원
    코틀린
    oracle
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
야리니
[TIL/Kotlin] 코틀린 고급문법_클래스와 인터페이스에서 제네릭 사용하기, 제네릭이 적용된 인터페이스/클래스 상속·구현하기, 특정 타입을 상속·구현하는 타입만 인수로 받기
상단으로

티스토리툴바