객체의 자료형 변환

황승현·2023년 12월 7일
0

코틀린 강의 정리

목록 보기
31/36
post-thumbnail

객체 자료형 변환

  • 상속 관계에서 가능하다

업캐스팅(Upcasting)

  • 자식 클래스의 객체가 부모 클래스 자료형으로 형변환 되는 것

  • 자식클래스가 가진 내용이 부모클래스로부터 가져온 거기 때문에 강제 업캐스팅 가능함

fun main() {
    println("몇 마리를 생성하시겠습니까?")
    var count = readLine()!!.toInt() //null을 절대 입력받지 않도록 명시(!!)한 변수(null입력되면 에러)
    var birds = mutableListOf<Bird>() //Bird 클래스 객체를 요소로 넣을 수 있는 수정가능한 리스트

    for(idx in 0..count-1) { //0부터 입력한 값-1까지 반복
        println("조류의 이름을 입력해주세요")
        var name = readLine()!! //null을 절대 입력받지 않도록 명시한 변수(null입력되면 에러)

		// as Bird는 생략가능
        //birds.add(Sparrow(name) as Bird) //자식 클래스 Sparrow 객체를 Bird 클래스로 업캐스팅
        birds.add(Sparrow(name)) //자식 클래스 Sparrow를 Bird 클래스로 업캐스팅
    }
    println("============조류 생성완료============")
    for(bird in birds) { //Bird 클래스 객체를 하나씩 꺼내와서
        bird.fly() //메소드 실행
    }
}

open class Bird(name: String) { //상속 가능한 Bird 클래스
    var name: String //name 프로퍼티

	//주생성자를 이용한 명시적 초기화
    init { 
        this.name = name //파라미터로 name이라는 문자열을 가져와서 name 프로퍼티 초기화
    }

    fun fly() { //Bird 클래스의 메소드
        println("${name}이름의 조류가 날아요~")
    }
}

//Bird 클래스의 자식 클래스
//파라미터로 name이라는 문자열을 받음
//Bird 클래스로 name이라는 문자열을 전달함
//Bird클래스는 init 생성자를 이용해서 초기화됨
class Sparrow(name: String): Bird(name) { 

}

다운캐스팅(Downcasting)

  • 부모 클래스의 객체가 자식 클래스 자료형으로 형변환 되는 것

  • 부모 클래스가 가진 정보가 자식 클래스보다 가진 정보가 많기 때문에 오류 발생

fun main() {
    println("몇 마리를 생성하시겠습니까?")
    var count = readLine()!!.toInt() //!!키워드를 이용해 null을 절대 입력받지 않도록 명시한 변수(null입력되면 에러)
    var birds = mutableListOf<Bird>() //Bird 클래스 객체를 요소로 넣을 수 있는 수정가능한 리스트

    for(idx in 0..count-1) { //0부터 입력한 값-1까지 반복
        println("조류의 이름을 입력해주세요")
        var name = readLine()!! //!!키워드를 이용해 null을 절대 입력받지 않도록 명시한 변수(null입력되면 에러)

		// as Bird는 생략가능
        //birds.add(Sparrow(name) as Bird) //자식 클래스 Sparrow 객체를 Bird 클래스로 업캐스팅
        birds.add(Sparrow(name)) //자식 클래스 Sparrow를 Bird 클래스로 업캐스팅
    }
    println("============조류 생성완료============")
    for(bird in birds) { 
        bird.fly()
    }
    // 다운캐스팅 오류
    // Sparrow는 Bird가 가져야할 정보를 모두 가지고 있지 않기 때문임
//    var s1:Sparrow = birds.get(0)
}

open class Bird(name: String) { //상속 가능한 Bird 클래스
    var name: String //name 프로퍼티

	//주생성자를 이용한 명시적 초기화
    init {
        this.name = name //파라미터로 name이라는 문자열을 가져와서 name 프로퍼티 초기화
    }

    fun fly() { //Bird 클래스의 메소드
        println("${name}이름의 조류가 날아요~")
    }
}

//Bird 클래스의 자식 클래스
//파라미터로 name이라는 문자열을 받음
//Bird 클래스로 name이라는 문자열을 전달함
//Bird클래스는 init 생성자를 이용해서 초기화됨
class Sparrow(name: String): Bird(name) {

}

0개의 댓글