
1)부모 클래스를 이용하지 않는 방식(직접 접근)
s,t 같은 객체(참조변수)를 직접 만들어 인스턴스에 직접 접근하는 방법이다.
package com.java.inher02.typecasting;
import com.java.inher02.typecasting.mycar.Car;
import com.java.inher02.typecasting.mycar.Sedan;
import com.java.inher02.typecasting.mycar.Truck;
public class CarExam {
public static void main(String[] args) {
// 클래스 > 상속 > 형변환
//객체 접근
//1.직접 접근
System.out.println("[Car]");
Car c = new Car();
c.doorOpen();
c.manOfCar();
System.out.println("[Sedan]");
Sedan s =new Sedan();
s.doorOpen();
s.manOfCar();
System.out.println("[Truck]");
Truck t = new Truck();
t.doorOpen();
t.manOfCar();
2)부모 클래스를 이용하는 방법(간접 접근)
부모클래스를 이용해서 자식 클래스에 접근하는 방법이다.
오버라이드를 통해 하위 클래스의 동작을 모르더라도 하위클래스에 접근 할 수 있다.
이때 자식 클래스는 자동으로 부모클래스로 업캐스팅 된다.
(1) 업캐스팅(upcasting)
업캐스팅이란 자식클래스가 부모클래스 타입으로 형변환 하는 것을 말한다.
이때 Sedan 객체는 자동으로 Car 타입으로 형변환 한다.
//2.간접 접근
System.out.println("[간접접근]");
Car cc= new Sedan();
//오버라이드 된 메서드
//2.1 묵시적 형변환 (업캐스팅,upcasting)
//상위클래스에서 하위 클래스의 메소드에 접근 가능
//컴파일러는 상위클래스의 구조를 이미 알고 있기 때문에 (예측 가능)
//Car의 구조만큼 이해
cc.doorOpen();
cc.manOfCar();
}
(2)다운캐스팅(downcasting)
다만, 부모클래스 일지라도 오버라이딩 (overriding)되지 않으면 접근 할 수 없다.
이때 메소드가 오버라이딩 되어 있지 않다면 ,다운 캐스팅해야 한다.
다운캐스팅이란 부모타입을 강제로 자식타입으로 바꾸는 것이다.
//오버라이드 되지 않은 메서드
//2.2 명시적 형변환(다운캐스팅,downcasting)
//부모클래스에서 오버라이드 되지 않은 자식클래에 접근할때 사용
//부모클래스는 자식클래스의 메소드를 알수 없기때문에 컴파일러에게 알려줘야 함
((Sedan)cc).RordKill();
}
부모 클래스에는 RordKill() 메소드가없고 , 자식 클래스에만 있기 때문에 오버라이드가 되지 않았다.
((Sedan)c).RordKill(); 줄여서 표현 할 수도 있다.
package com.java.inher02.typecasting;
import com.java.inher02.typecasting.mycar.Car;
import com.java.inher02.typecasting.mycar.Sedan;
import com.java.inher02.typecasting.mycar.Truck;
public class CarExam {
public static void main(String[] args) {
// 클래스 > 상속 > 형변환
//객체 접근
//1.직접 접근
System.out.println("[Car]");
Car c = new Car();
c.doorOpen();
c.manOfCar();
System.out.println("[Sedan]");
Sedan s =new Sedan();
s.doorOpen();
s.manOfCar();
System.out.println("[Truck]");
Truck t = new Truck();
t.doorOpen();
t.manOfCar();
//2.간접 접근
System.out.println("[간접접근]");
Car cc= new Sedan();
//오버라이드 된 메서드
//2.1 묵시적 형변환 (업캐스팅,upcasting)
//상위클래스에서 하위 클래스의 메소드에 접근 가능
//컴파일러는 상위클래스의 구조를 이미 알고 있기 때문에 (예측 가능)
//Car의 구조만큼 이해
cc.doorOpen();
cc.manOfCar();
//오버라이드 되지 않은 메서드
//2.2 명시적 형변환(다운캐스팅,downcasting)
//부모클래스에서 오버라이드 되지 않은 자식클래에 접근할때 사용
//부모클래스는 자식클래스의 메소드를 알수 없기때문에 컴파일러에게 알려줘야 함
((Sedan)cc).RordKill();
}
}