[Kotlin] 자료형 변환 / 자료형 타입 확인

neoneoneo·2024년 3월 11일
0

kotlin

목록 보기
29/49

일반 자료형

숫자

var num1 = 10
var num2 = 28.5
var num3 = num1.toDouble() //10.0
var num4 = num2.toInt() //28

문자열

var strNum5 = "10"
var strNum6 = "10.112"
var num5 = Integer.parseInt(strNum5) //"10"
var num6 = strNum6.toDouble() //10.112

객체 자료형

업 캐스팅 (하위클래스를 상위클래스의 자료형으로 객체 생성)

//상위 클래스
open class Animal(val name: String) {
	fun makeSound() {
    	println("소리 내기")
    }
}
//하위 클래스
class Dog(name: String) : Animal(name) {
	fun bark() {
    	println("월월!")
    }
}
//메인 함수
fun main() {
	//업캐스팅: Dog 인스턴스를 Animal 타입으로 변환
	val animal: Animal = Dog("백구")
    //상위 클래스의 메소드 호출
    animal.makeSound()
    //animal은 Animal 타입이지만, 실제로는 Dog의 인스턴스를 참조하고 있으므로 bark() 호출이 불가능하여 주석처리
    //animal.bark()
}
  • Dog 클래스는 Animal 클래스를 상속하고 있다.
  • main 함수에서 Dog 클래스의 인스턴스를 Animal 타입의 변수에 할당하고 있다. (업캐스팅)
  • Animal 타입의 변수 animal은 실제로 Dog 클래스의 인스턴스를 참조하고 있지만, 컴파일러는 Animal로 인식한다.

주의 사항

  • 업캐스팅 후에는 원래 하위클래스(Dog)에만 존재하는 메소드(bark)나 속성에 접근할 수 없다.
    • animal을 Dog(~)로 선언했지만, 실제로 컴파일러는 Animal 타입으로 인식하고 Animal 클래스에 정의된 메소드나 속성만 사용할 수 있기 때문이다.

다운 캐스팅 (상위클래스를 하위클래스의 자료형으로 객체 생성)

//상위 클래스
open class Animal(val name: String) {
	fun makeSound() {
    	println("소리 내기")
    }
}
//하위 클래스
class Dog(name: String) : Animal(name) {
	fun bark() {
    	println("월월!")
    }
}
//메인 함수
fun main() {
	//업캐스팅: Dog 인스턴스를 Animal 타입으로 변환
	val animal: Animal = Dog() //업캐스팅
    //다운캐스팅
    if (animal is Dog) {
    	val dog: Dog = animal as Dog
        dog.bark() //다운캐스팅 후에는 하위 클래스의 메소드에 접근 가능
    } else {
    	println("Dog 인스턴스가 아님")
    }
}
  • animal 변수는 Dog 클래스의 인스턴스를 참조하고 있지만, 타입은 Animal 이기 때문에 bark()에 직접 접근할 수 없다.
  • is 연산자를 통해 animal이 실제로 Dog 클래스의 인스턴스인지 확인한다.
  • 그 이후 as 키워드로 다운캐스팅을 수행힌다.
  • 다운캐스팅 후에는 dog 변수를 통해 bark()에 접근할 수 있게 된다.

주의 사항

  • 다운캐스팅 시에는 실제로 해당 인스턴스가 해당 타입이 맞는지 확인해야 한다.
  • as 키워드를 사용할 때 클래스 간 상속 관계가 확인되지 않으면 ClassCaseException이 발생할 수 있다.
    • 그러므로 is 연산자를 통해 안전하게 다운캐스팅을 하는 것이 필요하다.

자료형 타입 확인

위에서 사용한 is 키워드를 통해 자료형의 타입을 확인할 수 있다.

		if(name is String) {
        println("name은 String 타입입니다")
    } else {
        println("name은 String 타입이 아닙니다")
    }

[TIL-240311]

0개의 댓글