-> 블로그 이전

[Java] 업캐스팅 / 다운캐스팅

2021. 11. 24. 16:27Language`/Java

업캐스팅 (Upcasting)

- 서브 클래스의 객체에 대한 레퍼런스 -> 슈퍼 클래스 타입으로 변환

- 슈퍼 클래스의 레퍼런스로 서브 클래스의 객체를 가리키게 한다

- But 슈퍼 클래스의 레퍼런스는 슈퍼 클래스의 멤버만 접근 가능

- 명시적 타입 변환을 하지 않아도 된다

 

※ Example

class Person{
    String name, id;
    public Person(String name){
        this.name = name;
    }
}

class Student extends Person{
    String grade, department;
    public Student(String name) {
        super(name);
    }
}

public class test {
    public static void main(String[] args) {
        Person p;
        Student s = new Student("홍길동");
        p = s; // 업캐스팅

        System.out.println(p.name);

        // p.grade = 'A' -> 컴파일 오류 (슈퍼 클래스의 레퍼런스로 서브 클래스의 멤버 접근 불가능
        // p.department = "Com" -> 컴파일 오류 (슈퍼 클래스의 레퍼런스로 서브 클래스의 멤버 접근 불가능
    }
}
---------------------
홍길동

 

 

다운캐스팅 (Downcasting)

- 업캐스팅된 것을 다시 원상태로 돌리는 것

- 명시적으로 타입을 지정해야 한다

 

※ Example

class Person{
    String name, id;
    public Person(String name){
        this.name = name;
    }
}

class Student extends Person{
    String grade, department;
    public Student(String name) {
        super(name);
    }
}

public class test {
    public static void main(String[] args) {
        Person p = new Student("홍길동");
        Student s;
        s = (Student)p; // 다운캐스팅

        System.out.println(s.name);
        s.grade = "A";
        System.out.println(s.grade);
    }
}
--------------------
홍길동
A

 

 

Instanceof 연산자

- 레퍼런스 instanceof 클래스명

  -> '레퍼런스'가 가리키는 객체가 해당 '클래스' 타입이면 true 리턴, 아니면 false 리턴

class Person{}
class Student extends Person{}
class Researcher extends Person{}
class Professor extends Researcher{}
/*
Person -> Student, Researcher
Researcher -> Professor
 */

public class test {
    static void print(Person p){
        if(p instanceof Person)
            System.out.print("Person ");
        if(p instanceof Student)
            System.out.print("Student ");
        if(p instanceof Researcher)
            System.out.print("Researcher ");
        if(p instanceof Professor)
            System.out.print("Professor ");
        System.out.println();
    }
    public static void main(String[] args) {
        System.out.print("new Student() -> ");
        print(new Student());
        System.out.print("new Researcher() -> ");
        print(new Researcher());
        System.out.print("new Professor() -> ");
        print(new Professor());
    }
}
-------------------------------------------
new Student() -> Person Student 
new Researcher() -> Person Researcher 
new Professor() -> Person Researcher Professor