업캐스팅

서브클래스는 슈퍼클래스의 모든 특성을 상속받는다. 따라서 서브 클래스는 슈퍼클래스가 될 수 있다.
즉, 서브 클래스가 슈퍼 클래스가 되는 것을 업 캐스팅이라고 한다.

class Person{
    String name;
    String id;

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

class Student extends Person{
    String grade;
    String department;

    public Student(String name){
        super(name);
    }
}

public class UpcastingEx{
    public static void main(String[] args){
        Person p;
        Student s = new Student("이재문");
        p = s; //업 캐스팅 발생

        System.out.println(p.name); //정상 컴파일
        Ststem.out.println(p.grade); //컴파일 오류
    }
}

Student로 인스턴스를 생성하고 Person 레퍼런스 타입으로 담았다.
다시 말해서 Person클래스의 멤버만 접근이 가능하고 Student의 멤버는 접근이 불가능하다.

다운캐스팅

서브 클래스가 슈퍼 클래스로 변했을 때 서브 클래스의 인스턴스는 잠시 가려져 있을 뿐 사라지지 않는다.
서브 클래스의 원래 특성으로 돌려 놓는게 다운 캐스팅이다.
다운 캐스팅은 업 캐스팅과 달리 명시적으로 타입을 지정해야 한다.
UpcastingEx클래스 부분만 수정한다.

public class DowncastingEx{
    public static void main(String[] args){
        Person p = new Student("이재문"); //업 캐스팅 발생
        Student s;

        s = (Student)p; //다운 캐스팅

        System.out.println(s.name); //정상 작동
        s.grade = "A"; //컴파일 오류
    }
}