4장. 제네릭과 배열

4-1 제네릭

제네릭의 기본 사용

제네릭(generic)

자료형의 객체들을 다루는 메서드나 클래스에서 컴파일 시간에 자료형을 검사해 적당한 자료형을 선택할 수 있도록 하기 위해 사용

class Box<T>(t: T) {  // 제네릭을 사용해 형식 매개변수를 받아 name에 저장
	var name = t
}

fun main() {
	val box1: Box<Int> = Box<Int>(1)
	val box2: Box<String> = Box<String>("Hello")

	println(box1.name)  // 1
	println(box2.name)  // Hello
}

형식 매개변수의 이름

형색 매개변수 이름 의미
E 요소(element)
K 키(key)
N 숫자(number)
T 형식(type)
V 값(value)
S, U, V etc. 두 번째, 세 번째, 네 번째 형식(2nd, 3rd, 4th types)

자료형의 추론

val box3 = Box(1)  // Box<Int>로 유추
val box4 = Box("Hello")  // Box<String>로 유추

제네릭 클래스

형식 매개변수의 null 제어

class GenericNull<T> {  // 기본적으로 null이 허용되는 형식 매개변수
	fun EqualityFunc(arg1: T, arg2: T) {
		println(arg1?.equals(arg2))
	}
}

fun main(args: Array<String>) {
	val obj = GenericNull<String>()  // non-null로 선언됨
	obj.EqualityFunc("Hello", "World")  // null이 허용되지 않음

	val obj2 = GenericNull<Int?>()  // null이 가능한 형식으로 선언됨
	obj2.EqualityFunc(null, 10)  // null 사용
}