본문 바로가기

생각정리/Java

[JAVA] 업캐스팅, 다운캐스팅

캐스팅(Casting)

타입을 변환하는 것을 말하면 형변환이라고도 한다.

기본형 타입을 서로 형변환 하는 것과 기본형과 래퍼클래스 간의 형변환을 말할 수 있다.

업캐스팅(Upcasting)

자식 클래스의 객체가 부모 클래스 타입으로 형변환 하는 것

부모 클래스로 형변환이 되어 자식 클래스에만 있는 멤버는 사용할 수 없다.

업캐스팅을 하여도 오버라이딩 된 메서드는 자식 클래스의 메서드로 실행된다.

서로 다른 자식 클래스들을 하나의 부모 클래스로 묶어 사용하기에 용이하다.

다운캐스팅(Downcasting)

업캐스팅된 클래스를 다시 원래의 타입으로 형변환 하는 것

형 변환할 때 자식클래스의 캐스팅 연산자는 생략이 불가능하다. (괄호로 표시하는 것)

형제 클래스(같은 클래스를 상속받는 클래스) 끼리 서로 캐스팅이 불가능하다.

instanceof 연산자

어느 객체 변수가 어느 클래스 타입인지 판별해 주는 연산자

 

class Animal {
    String name;
    Animal (String name) {
    	this.name = name;
    }
}

class Dog extends Animal {
    String breeds;
    Dog (String name) {
    	super(name);
    }
}

public class Main {
	public static main(String[] args) {
    	Animal a = new Animal("나는동물");
        Dog d = new Dog("흰둥이");
        
        Animal a2 = (Animal)d; // 업캐스팅 - 자식에서 부모로
        //Animal a2 = d; // 업캐스팅은 괄호 생략 가능
        a2.name = "이름";
        //a2.breeds = "종"; // Animal에는 breeds가 없어 컴파일 오류가 난다.
        
        //Dog d2 = (Dog)a; // a는 업캐스팅이 된 객체가 아니므로 컴파일 오류가 난다.
        Dog d2 = (Dog)a2; // 다운캐스팅 - 부모로 변한 자식을 다시 자식으로
        d2.name = "스누피"; // d, a2, d2 모두 연결되어 name이 스누피가 된다.
        d2.breeds = "비글"; // d는 breeds를 입력한적 없지만 d2로 인한 "비글"이 된다.
        
        Animal a3 = new Dog("스파이크"); // 업캐스팅
        Dog d3 = (Dog)a3; // 다운캐스팅
        
        // (객체 instanceof 클래스)
        System.out.println(a instanceof Animal); // true
        System.out.println(a instanceof Dog); // false 업캐스팅 된 자식 클래스가 아니라 Dog로 다운캐스팅 불가
        System.out.println(a2 instanceof Animal); // true
        System.out.println(a2 instanceof Dog); // true
        System.out.println(d instanceof Animal); // true
        System.out.println(d instanceof Dog); // true
        System.out.println(d2 instanceof Animal); // true
        System.out.println(d2 instanceof Dog); // true

'생각정리 > Java' 카테고리의 다른 글

자바 버전 선택에 대한 이유  (0) 2024.05.27
[JAVA] 문자열 사용  (0) 2023.11.28
[JAVA] 스레드  (0) 2023.08.17
[JAVA] Wrapper 클래스  (0) 2023.08.16
[JAVA] Scanner 와 BufferedReader 차이  (0) 2023.08.14