記錄

JAVA) Down Casting 본문

Computer language/JAVA

JAVA) Down Casting

surhommejk 2018. 2. 9. 16:46

<참조형의 경우!!!>
class Parent {
    int a = 1;
}

class Child extends Parent {
    int b = 2;
}

public class main {

    public static void main(String[] args) {

        // Down casting 두 가지 경우

        // 컴파일은 되지만 error가 발생한다
        // Child 타입이 뭔지 모르기 때문에 casting을 하지 못하는 것
        // 기본 자료형에서의 형변환의 경우 크기를 이미 알기 때문에
        // JVM이 추측을 할 수 있지만
        // 참조형인 경우 추측이 불가하므로 JVM이 강제로 casting을 못한다

        // 즉, 참조형을 선언하고 초기화 할 경우(힙에 올릴 경우)
        // 다형성(부모클래스 변수가 자식클래스를 참조가능)을 제외하고
        // 클래스가 불일치한 선언 후 초기화는 불가능하다!!
        Child child1 = (Child) new Parent();

        // 다형성을 따르는 선언 후 초기화이므로 정상적 코드
        Parent parent = new Child();
        
        // 하지만 타입을 부모클래스로 받아서
        // 자식 자원을 보지 못해서 b는 invisible이 된다
        parent.a = 5; // visible
        // parent.b // invisible

        // Down casting 후 정상적으로 자원이 다 보이고 있음
        Child child2 = (Child) parent;
        child2.a = 5;
        child2.b = 5;

    }



참조형 자료에서의 Casting의 경우 기본적으로 Casting은 상속관계에서 사용됨을 유의!

기본 자료형의 Casting과는 성질이 다르다!



<primitive data type의 경우>


<<명시적 형변환 vs 암시적 형변환>>

자료형에 따라 Byte가 각각 다른데 동일한 크기 또는 작은 크기의 자료형을 큰 크기의 자료형으로 변환할 경우
컴파일러는 암묵적으로 자료형을 변환해 준다.

하지만 반대로 큰 크기의 자료형을 작은 크기의 자료형으로 변환할 경우 작은 것이 큰 것을 다 담을 수 없기 때문에
명시적 표현이 필요하며 이 경우 때에 따라 컴파일러는 데이터를 버리고 적용한다.
(예를 들면 double을 int로 변환할 경우 소수점 이하는 버린다)

정리: 작은 것을 큰 것에 할당 => '암묵적 형변환'이 일어난다
큰 것을 작은 것에 할당 => (크기가 커서 못담으니까) '명시적 형변환'이 필요하다.
그리고 경우에 따라 데이터 손실이 발생한다.
                                    



'Computer language > JAVA' 카테고리의 다른 글

JAVA) Stream  (0) 2018.02.14
JAVA) ' .equlas ' 와 ' == ' 의 차이  (0) 2018.02.13
JAVA) 컬렉션 프레임워크(Collection Framework)  (0) 2018.02.09
JAVA) 메모리 구조 -2 (수정중)  (0) 2018.02.08
JAVA) 메모리 구조 -1  (0) 2018.02.08
Comments