+ 항공대학교 김철기 교수님의 객체 지향 프로그래밍 과목 내용를 정리한 글입니다.
컴파일 시간의 타입 검사
컴파일 시, 변수의 타입에 맞추어 연산 검사를 수행한다.
fun main() {
val objects = arrayOf("1", 2, "3", 4) // Any의 배열이 된다.
for(obj in objects) { // obj의 타입: Any
println(obj * 2) // any 타입에는 곱하기 연산을 할 수 없으므로 에러 발생
}
}
is 연산자
is 연산자: is의 왼쪽 타입이 is의 오른쪽에 해당하면 true 반환한다.
fun main() {
val objects = arrayOf("1", 2, "3", 4)
var sum = 0
for(obj in objects) {
if (obj is Int) { // obj의 타입을 Int로 스마트 캐스트
sum += obj
}
}
println(sum) // 6
}
null은 모든 null이 될 수 있는 타입으로 파악한다.
!is 연산자는 is의 반대 결과로 연산한다.
=> is 연산자를 통하여 인스턴스의 타입이 검사되면 해당 타입으로 자동 스마트 캐스트가 된다.
when과 is를 통한 스마트 캐스트
when과 is를 통하면 인스턴스 타입별 연산 수행이 가능해진다.
fun main() {
val objects = arrayOf("1", 2, "3", 4)
var sum = 0
for(obj in objects) {
when (obj) { // obj의 타입을 Int로 스마트 캐스트
is Int -> sum += obj
is String -> sum += obj.toInt()
}
}
println(sum) // 10
}
as를 이용한 변수의 타입 변환
as는 인스턴스의 타입이 원하는 타입일 때 해당 타입으로 변화하여 연산할 수 있게 해준다.
fun main() {
val o: Any = 123 // Any 타입이지만 실제로는 Int 타입의 값을 갖고 있다.
println((o as Long)) // Any형 o을 실제 데이터 타입이 아닌 Long형으로 변환 -> 예외 발생
}
as는 변환이 불가능할 시 예외가 발생하고, as?는 null을 반환하다.
- Any처럼 상위 클래스 -> 하위 클래스로만 변환이 가능하다.
fun main() {
val o: Any = 123
println((o as? Long)) // Any형 o을 실제 데이터 타입이 아닌 Long형으로 변환 -> null 반환
}
엘비스 연산자로 null을 처리할 수 있다.
fun main() {
val o: Any = 123
println((o as? Long) ?: 0) // 엘비스 연산자로 null 처리
}
프로퍼티와 스마트 캐스트
프로퍼티는 스마트 캐스트가 안되므로 as?와 let을 이용해야한다.
class Holder {
var o: Any = ""
}
fun main() {
val holder = Holder()
if (holder.o is String) {
println(holder.o.length) // 객체의 프로퍼티는 스마트 캐스트가 적용 안됨 -> 에러 발생
}
}
시험 출제!!!!
class Holder {
var o: Any = 0
}
fun main() {
val holder = Holder()
// holder.o이 String의 상위 클래스 타입이어서 String으로 변환할 수 있으면 변환, 없으면 null이다. null이 아닐 경우 let을 실행한다.
(holder.o as? String)?.let {
println(it.length)
}
}
'Study > Kotlin Study' 카테고리의 다른 글
[Kotlin] 추상 클래스와 추상 멤버 (0) | 2023.11.02 |
---|---|
[Kotlin] 공통 메소드 (1) | 2023.10.23 |
[Kotlin] 하위 클래스 초기화 (0) | 2023.10.23 |
[Kotlin] 하위 클래스 선언 (2) | 2023.10.23 |
[Kotlin] Fragment 실습 (2) | 2023.10.14 |