Apple is Apple
Published 2023. 12. 6. 20:32
2023-12-06 TIL

in 키워드 (GENERIC)

in 키워드에 대해 알려면 먼저 제네릭에 대해 알아야한다.

제네릭이란?

제네릭은 클래스 내부에서 사용할 자료형을 나중에 인스턴스를 생성할 때 확정한다.

 

제네릭이 나오게 된 배경은 자료형의 객체들을 다루는 메소드나 클래스에서 컴파일 시간에 자료형을 검사해 적당한 자료형을 선택할 수 있도록 하기 위해서 등장하였다.

 

제네릭을 사용하면 객체의 자료형을 컴파일 시에 체크하기 때문에 객체 자료형의 안정성을 높이고 형 변환의 번거로움이 줄어든다.

 

제네릭을 사용하기 위해 앵글 브래킷(<>) 사이에 형식 매개변수를 사용해 선언하고 매개변수는 하나 이상 지정할 수 있다.

제네릭에는 가변성이란 것이 있는데 가변성이란 매개변수가 클래스 계층에 영향을 주는 것을 뜻한다.

 

가변성에는 공변성, 반공변성, 무변성이 있는데 in 키워드는 이 중 반공변성(Contravariance) 과 관련이 있다. (Java에서의 <? super T>와 같다)

 

반공변성이란 자료형의 상하 관계가 반대로 된 것을 뜻한다. 하위 클래스의 자료형을 상위 클래스의 자료형이 허용할 수 있다. (자기 자신과 부모 객체만 허용)

// in 키워드 사용 - 반공변성
class Type<in T>(val count: Int)

fun main() {
	val any: Type<Any> = Type<Int>(10) // 에러 - 자료형 불일치
	val nothing: Type<Nothing> = Type<Int>(10) // 관계 성립으로 객체 생성 가능
	val number: Type<Int> = Type<Number>(10) // 관계 성립으로 객체 생성 가능
}

'TIL' 카테고리의 다른 글

2023-12-19  (1) 2023.12.19
2023-12-11  (0) 2023.12.11
2023-12-04  (0) 2023.12.04
2023-12-01  (0) 2023.12.01
2023-11-30  (0) 2023.11.30
profile

Apple is Apple

@mjjjjjj