728x90
반응형
1. in/out 키워드
out 키워드를 붙이면 서브타입을 슈퍼타입에 대입 가능,
in 키워드를 붙이면 슈퍼타입을 서브타입에 대입 가능,
타입 인수를 *로 지정하면 타입 인수가 무엇이든 상관없이 대입이 가능하다.
// AAA 클래스의 타입 매개변수 앞에 out 키워드를 붙임
// out 키워드를 붙이면 AAA<서브타입>을 AAA<슈퍼타입>에 대입할 수 있게 된다.
// out T는 자바의 ?extends T와 같다.
class AAA<out T>
// BBB 클래스의 타입 매개변수 앞에 in 키워드를 붙임
// in 키워드를 붙이면 BBB<슈퍼타입>을 BBB<서브타입>에 대입할 수 있게 된다.
// in T는 자바의 ?super T와 같다.
class BBB<in T>
fun main() {
val aaaSub = AAA<Int>()
val aaaSuper: AAA<Any> = aaaSub
val bbbSuper = BBB<Any>()
val bbbSub: BBB<Int> = bbbSuper
// 타입 인수로 *를 지정하면, 타입 인수가 무엇이든 상관없이 AAA 타입을 대입할 수 있음
val star: AAA<*> = aaaSub
}
2. .. 연산자와 범위 표헌식(Range Expression)
.. 연산자는 범위를 표현하는 연산자이다.
어떤 값이 특정 범위에 들어있는지 조사할 때 사용하면 좋다.
fun main() {
// 1..10은 1.rangeTo(10)으로 컴파일 되며, IntRange 타입의 값이 반환됨
// IntRange 클래스는 contains 연산자 멤버 함수를 갖고 있기 때문에 in 연산자 사용 가능
val oneToTen: IntRange = 1..10
println(5 in oneToTen)
val upperAtoZ: CharRange = 'A'..'Z'
if('C' in upperAtoZ)
println("대문자 입니다.")
if('p' in 'a'..'z')
println("소문자 입니다.")
}
.. 연산자는 operator fun rangeTo(매개변수: 자유 타입): 자유 타입으로 오버로딩 할 수 있다.
Int 클래스에는 다음과 같이 rangeTo가 선언
operator fun rangeTo(other: Int): IntRange
Char 클래스에는 다음과 같이 rangeTo가 선언
operator fun rangeTo(other: Char): CharRange
728x90
반응형