관리 메뉴

hyeals study

[코틀린] 제네릭 타입 파라미터 본문

코틀린

[코틀린] 제네릭 타입 파라미터

hyeals 2020. 2. 28. 03:40

* 코틀린의 제네릭은 기본 개념은 자바와 아주 유사함.

 

* 제네릭을 사용하면 타입 파라미터를 받는 타입을 정의할 수 있음.

 

* 제네릭 타입의 인스턴스를 만들려면 타입 파라미터를 구체적인 타입 인자(type argument)로 치환해야 함.


[제네릭 함수 & 프로퍼티]

 

* 제네릭 함수를 호출할 때는 반드시 구체적 타입으로 타입 인자를 넘겨야 함.

 

fun <T> List<T>.slice(indices: IntRange): List<T>
  • 위의 코드는 제네릭 함수인 slice에 대한 정의임 

이를 참고해서 제네릭 함수를 호출하는 방법은 아래와 같음

 

제네릭 함수 호출 예시
출력 결과

  • 위의 코드에서 두 호출의 결과 타입은 모두 List<Char>임.
  • 컴파일러는 반환 탕비 List<T>의 T를 알아서 추론한 Char로 치환함

[제네릭 클래스 선언]

 

* 자바와 마찬가지로 코틀린에서도 타입 파라미터를 넣은 꺾쇠 기호(<>)클래스(or 인터페이스) 이름 뒤에 붙이면 클래스(or 인터페이스)를 제네릭하게 만들 수 있음

 

* 타입 파라미터를 이름 뒤에 붙이고 나면 클래스 본문 안에서 타입 파라미터를 다른 일반 타입처럼 사용 가능

 

아래는 인터페이스인 List를 코틀린으로 정의한 코드임

 

interface List<T>{
	operator fun get(index: Int): T
    //...
}
  • List<T>: List 인터페이스에 T라는 타입 파라미터를 정의한 부분
  • operator fun get(index: Int): T 부분: 이처럼 T는 인터페이스 안에서 일반 타입처럼 사용 가능

[타입 파라미터 제약]

 

* 타입 파라미터 제약(type parameter constraint): 클래스 or 함수에 사용할 수 있는 타입 인자를 제한하는 기능.

 

☞ 제약을 가하기 위해서는 타입 파라미터 이름 뒤에 콜론(:)으로 표시하고 그 위에 상한 타입(upper bound)을 적으면 됨.

 

fun <T: Number> List<T>.sum(): T
  • 위의 코드는 sum함수가 타입 파라미터로 숫자 타입만을 허용하게 정의한 것임
  • 자바에서는 "<T extends Number> T sum(List<T> list)" 처럼 정의함

* 타입 파라미터 T에 대한 상한을 정하고 나면 T 타입의 값을 그 상한 타입의 값으로 취급할 수 있음

☞ 상한 타입에 정의된 메소드를 T 타입 값에 대해 호출할 수 있음

 

ex. 만약 Number로 타입 파라미터의 상한을 정했으면 Number클래스에 정의된 toDouble()과 같은 메소드를 사용할 수 있음

 

* 만약 여러개의 제약을 걸고 싶으면 아래와 같이 하면됨

 

fun <T> ensureTrailingPeriod(seq: T) where T: CharSequence, T: Appendable{
	if(!seq.endsWith('.')){
    	seq.append('.')
    }
}
  • 위의 코드는 타입 인자CharSequence와 Appendable 인터페이스를 반드시 구현해야 함을 표현함
  • endsWith은 CharSequence 인터페이스의 확장함수임 (데이터에 접근하는 연산)
  • append는 Appendable 인터페이스의 메소드임 (데이터 변환 연산)

[타입 파라미터를 널이 될 수 없는 타입으로 제약]

 

* 아무런 상한을 정하지 않은 타입 파라미터: Any?를 상한으로 정한 파라미터와 같음

 

널이 될 수 없는 타입타입 인자로 받게 만들려면 상한을 Any? 대신 Any로 사용하면 됨. (아래 코드 예시)

 

class Processor<T: Any>{
	fun process(value: T){
    	value.hashCode()
    }
}
  • 위 코드는 T 타입이 항상 널이 될 수 없음을 보장해줌 → 따라서 Processor<String?>과 같은 타입을 거부함

 

 

 

본 게시물은 "Kotlin IN ACTION"을 참고함.

Comments