업캐스팅(Upcasting)
서브 클래스 객체는 슈퍼 클래스의 멤버를 모두 가지고 있다. 또한 슈퍼 클래스의 객체로 취급할 수 있다.
업캐스팅: 서브 클래스 객체를 슈퍼 클래스 타입으로 변환, 업캐스팅된 레퍼런스는 객체 내에 슈퍼 클래스의 멤버만 접근 가능
class Person{...}
class Student extends Person{...}
Student s = new Student();
Person p = s; //업캐스팅, 자동타입변환
다운캐스팅(Downcasting)
슈퍼 클래스 변수에 들어있는 레퍼런스를 서브 클래스 타입으로 변환, 개발자의 명시적 타입 변환 필요
class Person {...}
class Student extends Person {...}
...
Person p = new Student("이재문"); // 업캐스팅
...
Student s = (Student)p; // 다운캐스팅, (Student)의 타입 변환 표시 필요
Student s = p; // 강제로 타입변환을 하지 않으므로 오류 발생
instanceof 연산자와 객체의 타입 판단
실제로는 서브 클래스 객체가 아니라면 실행오류가 발생한다.
Person p = new Person("선생님");
Student s = (Student) p; // 실행오류 발생
instanceof 연산자
레버런스가 가리키는 객체의 타입 식별을 위해 사용
객체 레퍼런스 instanceof 클래스 타입
연산 결과: true / false의 불린 값
메소드 오버라이딩(Method Overriding)
슈퍼 클래스의 메소드를 서브 클래스에서 재정의(메소드 이름, 매개변수 타입 및 개수, 리턴 타입 등 모든 것을 동일하게 작성
메소드 무시하기, 덮어쓰기로 번역되기도 한다.
동적 바인딩 발생 - 서브 클래스에 오버라이딩 된 메소드가 무조건 실행되는 동적 바인딩
오버라이딩의 목적
슈퍼 클래스에 선언된 메소드를 각 서브 클래스들이 자신만의 내용으로 새로 구현하는 기능
상속을 통해 하나의 인터페이스(같은 이름)에 서로 다른 내용 구현이라는 객체 지향의 다형성 실현
오버라이딩은 실행 시간 다형성 실현한다.
오버라이딩 VS 오버로딩