숫자
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로 인식한다.
//상위 클래스 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()에 접근할 수 있게 된다.
위에서 사용한 is 키워드를 통해 자료형의 타입을 확인할 수 있다.
if(name is String) { println("name은 String 타입입니다") } else { println("name은 String 타입이 아닙니다") }
[TIL-240311]