hyeals study
[코틀린] 제네릭 타입 파라미터 본문
* 코틀린의 제네릭은 기본 개념은 자바와 아주 유사함.
* 제네릭을 사용하면 타입 파라미터를 받는 타입을 정의할 수 있음.
* 제네릭 타입의 인스턴스를 만들려면 타입 파라미터를 구체적인 타입 인자(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"을 참고함.
'코틀린' 카테고리의 다른 글
Data 클래스 (0) | 2020.06.16 |
---|---|
map 함수 (0) | 2020.06.15 |
[코틀린] 고차 함수 (0) | 2020.02.27 |
[코틀린] 연산자 오버로딩 & 관례 - (2) 비교연산자 오버로딩 (0) | 2020.02.25 |
[코틀린] 연산자 오버로딩 & 관례 - (1) 산술연산자 오버로딩 (0) | 2020.02.25 |