업 캐스팅
다운 캐스팅
public class Main{
public static void main(String[] args) {
Ambulance amb = new Ambulance();
Car car = amb; // 업캐스팅
//car.siren(); // 컴파일에러
car.func(); // "오버라이드된 기능"
}
}
class Car{
void drive() {
System.out.println("기본기능 - 전진");
}
void stop() {
System.out.println("기본기능 - 멈춤");
}
void func() {
System.out.println("오버라이드를 통한 기능추가");
}
}
class Ambulance extends Car{
void siren() {
System.out.println("구급차기능 - 사이렌");
}
@Override
void func() {
System.out.println("오버라이딩된 기능");
}
}
위의 코드를 보자. Car 클래스에는 drive, stop, func 세 메서드가 있고 Ambulance 클래스는 Car 클래스를 상속받고 siren이라는 메서드와 오버라이딩된 func 메서드를 가지고 있다.
main 메서드에서 Ambulance 타입의 객체 amb를 생성하고 amb를 Car 타입의 객체인 car에 대입 했다. 이때 업캐스팅이 일어난다. 이 때 자식 객체에 선언된 siren이라는 메서드는 사용할 수 없지만 오버라이딩 된 func 메서드는 오버라이딩한 기능으로 사용할 수 있게 된다.
업캐스팅을 할 때는
Car car = (Car)amb에서 (Car)은 생략 가능하다.
public class Main{
public static void main(String[] args) {
Car car = new Ambulance(); // 업캐스팅
Ambulance amb = (Ambulance)car; // 다운캐스팅
amb.siren(); // "구급차기능 - 사이렌"
amb.func(); // "오버라이딩된 기능"
amb.drive(); // "기본기능 - 전진"
}
}
class Car{
void drive() {
System.out.println("기본기능 - 전진");
}
void stop() {
System.out.println("기본기능 - 멈춤");
}
void func() {
System.out.println("오버라이드를 통한 기능추가");
}
}
class Ambulance extends Car{
void siren() {
System.out.println("구급차기능 - 사이렌");
}
@Override
void func() {
System.out.println("오버라이딩된 기능");
}
}
위의 코드를 보자. main 메서드에서
Car car = new Ambulance();으로 업캐스팅을 해준 후Ambulance amb = (Ambulance)car;다시 다운 캐스팅 한다. 그럼 다시 자식 객체에 선언한 siren 메서드를 사용할 수 있게 된다.다운 캐스팅을 할 때는
Ambulance amb = (Ambulance)car에서 (Ambulance)는 생략이 불가능하다.
intanceof 연산자는 앞에 있는 객체가 뒤에 오는 클래스 타입인지 비교할 때 사용한다.
객체 instanceof 클래스명 으로 사용하며 결과가 true나 false로 나오는 조건식이다.
public class Main{
public static void main(String[] args) {
FireEngine fe = new FireEngine();
if (fe instanceof FireEngine) { // true
System.out.println("FireEngine 타입의 객체입니다.");
}
if (fe instanceof Car) { // true
System.out.println("Car 타입의 객체입니다.");
}
if (fe instanceof Object) { // true
System.out.println("Object 타입의 객체입니다.");
}
}
}
class Car{}
class FireEngine extends Car{}