[Kotlin] Kotlin in Action 6장. 코틀린 타입 시스템

유콩·2025년 12월 8일
post-thumbnail

1)널 가능성(Nullability)
코틀린 타입 시스템의 가장 큰 특징: null이 될 수 있는 타입과 없는 타입을 명확히 구분함.
->실행 시점(Runtime)에 터지던 에러를 컴파일 시점으로 가져와 미리 막아줌

1-1)null 이 될 수 있는 타입(?)
기본적으로 코틀린의 변수는 null을 허용하지 않음
String: 절대로 null일 수 없음.
String?:null일 수도 있음.

1-2)
널을 안전하게 다루는 도구들
?. : null이 아니면 메소드를 실행하고 ,null이면 null을 반환함.
ex)s?.toUpperCase() s가 null이면 결과도 null

엘비스 연산자(?:) : null일 경우 사용할 디폴트 값을 지정
ex) val name = str ?: "Unknown" (str이 null이면 "Unknown" 저장)

안전한 캐스트(as?): 타입 변환을 시도하다가 실패하면 예외를 던지는 대신 null을 반환함.

널 아님 단언(!!): 해당 값이 절대 null이 아니라도 확신하다는 응답을 컴파일러에게 강제로 알림.
*주의: 만약 실제 값이 null이라면 예외가 발생하므로 정말 확실한 경우에만 사용해야함.

책에서는 !! 가 약간 무례해 보인다고 한다. !! 기호는 마치 컴파일러에게 소리를 지르는 것 같은 느낌이 드는데, 이는 의도한 것으로 코틀린 설께자들은 컴파일러가 검증할 수 없는 단언을 사용하기 보다는 더 나은 방법을 찾아보라는 의도를 넌지시 표현하려고 !!라는 못생긴 기호를 택했다고 한다.

2)코틀린의 원시 타입
자바는 int(원시 타입)와 Integer(참조 타입)를 구분하지만, 코틀린은 Int 하나만 사용.
숫자 변환: 코틀린은 숫자의 자동 형변환을 허용하지 않음.

val i: Int = 1
val l: Long = i (❌ 에러 발생! 암시적 변환 불가)
val l: Long = i.toLong() (⭕ 명시적 변환 메소드 사용)

3)컬렉션과 배열
코틀린은 컬렉션을 다룰 때 데이터를 수정할 수 있는지를 엄격히 구분함.

3-1)읽기 전용 vs 변경 가능
List, Set (읽기 전용): 데이터를 읽을 수만 있고, 추가(add)하거나 삭제(remove)할 수 없음.

MutableList, MutableSet (변경 가능): 데이터를 자유롭게 수정할 수 있음.
*데이터가 의도치 않게 변경되는 것을 막아 코드의 안정성을 높이기 위함.

3-2)자바와의 호환성
자바 코드에서 가져온 타입은 코틀린이 null인지 아닌지 알 수 없음. 이를 플랫폼 타입이라고 하며, 코틀린 컴파일러는 이에 대한 널 체크를 강제하지 않음.

0개의 댓글