타입
- 여러 종류의 데이터를 식별하는 분류로, 어떤 값이 가능한지와 그 타입에 대해 수행할 수 있는 연산의 종류를 결정한다.
타입 체크
- is와 !is 연산자를 사용하여 런타임에 객체가 주어진 타입인지 확인할 수 있다.
- 스마트 캐스트(Smart Cast) : 컴파일러가 불변 값에 대해 is 검사를 추적하여 필요할 때 자동으로 (안전하게) 캐스팅을 수행하는 기능
타입 캐스팅
- as 연산자를 사용하여 데이터 타입을 다른 데이터 타입으로 변환할 수 있다.
- 캐스팅은 주로 상속 관계에 있는 클래스들 간에 사용된다.
- 상위 클래스의 객체를 하위 클래스 타입으로 변환하거나, 하위 클래스의 객체를 상위 클래스 타입으로 변환하는 데 활용된다.
업캐스팅
- 하위 클래스의 인스턴스를 상위 클래스 타입으로 변환하는 것
- 항상 안전하며, 명시적으로 캐스팅하지 않아도 자동으로 이루어진다.
- 상위 클래스의 멤버만 사용할 수 있다.
- 하위 클래스 고유의 멤버는 숨겨지며 사용할 수 없다.
open class Parent {
val name: String = "parent"
}
class Child : Parent() {
val childAge: Int = 30
}
fun main() {
val child = Child()
val parent: Parent = child // 업캐스팅 (자동 변환)
println(parent.name) // "parent"
// println(parent.childAge) // 컴파일 에러: Parent 타입에는 childAge가 없음
}
다운캐스팅
- 상위 클래스의 인스턴스를 하위 클래스 타입으로 변환하는 것
- 런타임에 객체의 실제 타입을 검사한다.
- 객체가 실제로 하위 클래스 타입일 경우에만 성공한다.
- 잘못된 캐스팅 시 ClassCastException 이 발생한다.
- 명시적으로 캐스팅해야 한다.
fun main() {
val child = Child()
val parent: Parent = child // 업캐스팅
// Parent 타입으로 선언되었지만, 실제로는 Child 객체
val newChild = parent as Child // 다운캐스팅 (명시적)
println(newChild.childAge) // 30
val parent = Parent() // Parent 객체
val newChild = parent as Child // ClassCastException 발생
}
널 가능성(Nullability)
- 변수나 객체가 유효한 값을 가지지 않고 null 일 가능성
- NullPointerException 오류(NPE)를 피할 수 있게 돕기 위한 코틀린 타입 시스템의 특성
- null 에 대한 접근 방법은 가능한 한 이 문제를 실행 시점에서 컴파일 시점으로 옮기는 것이다.
- 널이 될 수 있는지 여부를 타입 시스템에 추가함으로써 컴파일러가 여러 가지 오류를 컴파일 시 미리 감지해서 실행 시점에 발생할 수 있는 예외의 가능성을 줄일 수 있다.
- 코틀린 타입 시스템은 타입 이름 뒤에 물음표(?)를 명시하여 널이 될 수 있는 타입(Nullable Type)을 정의할 수 있도록 지원한다.
널 처리 연산자
안전한 호출 연산자(Safe call Operator) : ?.
- 호출하려는 값이 null 이 아니면 일반 메소드 호출처럼 동작하는 것
- 호출하려는 값이 null 이면 이 호출은 무시되고 null 이 반환된다.
엘비스 연산자(Elvis Operator) : ?:
- null 대신 사용할 디폴트 값을 지정할 때 사용한다.
안전한 캐스트(Safe casts) : as?
- 어떤 값을 지정한 타입으로 캐스트한다.
- 값을 대상 타입으로 변환할 수 없으면 null을 반환한다.
Non-null 단언 연산자(Non-null assertioin) : !!
- 어떤 값이든 널이 될 수 없는 타입으로 변환하다.
- 실제로 null 인 값에 적용하면 NPE(NullPointerException) 가 발생한다.
'안드로이드 > Kotlin' 카테고리의 다른 글
[Kotlin] 범위 지정 함수(Scope function) (0) | 2024.12.09 |
---|---|
[Kotlin] Kotlin 이란 (0) | 2024.12.08 |
[Kotlin] 객체 지향 프로그래밍(Object-Oriented Programming) (0) | 2024.12.08 |