- Car 클래스는 Java19 참고
참조 변수의 참조가능성
- 클래스 참조 변수는 자기 자신의 형식을 갖는 클래스 인스턴스를 참조할 수 있다.
- 클래스 참조 변수는 자기 형식보다 하위 클래스의 인스턴스를 참조할 수 있다.
- 클래스 참조 변수는 자기 형식보다 상위 클래스의 인스턴스를 참조할 수 없다.
Class Car
class Car{
private String name;
private int width; //폭
private int height; //높이
private int length; //길이
private double x; // x좌표
private double y; //y좌표
private double fuel; //남은 연료
private Day purchaseDay;
Car(String name, int width, int length, int height, double fuel, Day purchaseDay){
this.name = name;
this.width = width;
this.height = height;
this.length = length;
this.x = 0; this.y = 0;
this.fuel = fuel;
this.purchaseDay = purchaseDay;
x = y = 0.0;
} // Car 생성자
public void putSpec() {
System.out.println("이름: "+ name);
System.out.println("전폭: "+ width+"mm");
System.out.println("전고: "+ height+"mm");
System.out.println("전장: "+ length+"mm");
}} //Car 본체
Class ExCar - Car의 자식 클래스
public class ExCar extends Car{ // Car의 자식 클래스 ExCar
private double totalMileage; // 총 주행거리
// --- 생성자 --- //
public ExCar ( String name, int width, int height, int length, double fuel, Day purchaseDay) {
super(name, width, height, length, fuel, purchaseDay);
totalMileage = 0.0;
}
public void putSpec() { // 사양 표시
super.putSpec();
System.out.printf("총 주행 거리: %.2fkm\n", totalMileage);
public double getTotalMileage() { // 총 주행거리 확인
return totalMileage; }
}} // ExCar
실행 예시
public static void main(String[] args) {
Car car1 = new Car("sonata", 1860, 2840, 1445, 90.0, new Day(2019, 10, 10));
ExCar car2 = new ExCar("Genesiss", 1845, 1500, 5300, 90.0, new Day());
Car x;
x = car1; // Car 클래스형 참조변수 x는 자기 자신 형식의 인스턴스를 참조할 수 있다.
x = car2; // 하위 클래스형 인스턴스도 참조할 수 있다.
}
public static void main(String[] args) {
Car car1 = new Car("sonata", 1860, 2840, 1445, 90.0, new Day(2019, 10, 10));
ExCar car2 = new ExCar("Genesiss", 1845, 1500, 5300, 90.0, new Day());
ExCar y;
y = car1; // ExCar 클래스형 참조변수 y 는 상위 클래스형 인스턴스를 참조할 수 없다.
y = car2; // 자기 자신 형식의 인스턴스는 참조할 수 있다.
초기화시 생성 인스턴스의 확대 변환과 축소 변환
- 다음과 같이 인스턴스 생성시 주소값을 받는 참조 변수에 따라 생성 인스턴스의 형변환이 일어난다.
- (Car)로 형을 명시할 수도 있고, 생략할 수도 있다.
- 하위(자식) 클래스 형식에서 상위(부모) 클래스 형식으로의 방향으로만 자동 형변환이 일어난다.
- 상위에서 하위로의 형변환은 불가능하다.
Car x = (Car) new ExCar("Genesiss", 1845, 1500, 5300, 90.0, new Day());
x.putSpec();
ExCar y = (ExCar) new Car("sonata", 1860, 2840, 1445, 90.0, new Day(2019, 10, 10));
// 컴파일 오류
x의 결과는 ? 어떤 것일까?
- Car형의 메서드 putSpec 호출
- ExCar형의 putSepc 호출
결과 : 2
이름: Genesiss
전폭: 1845mm
전고: 5300mm
전장: 1500mm
총 주행 거리: 0.00km
Car 형식의 변수 x이지만 인스턴스가 ExCar 형식이므로 ExCar의 메서드 putSpec을 호출한다.
- Car 형 클래스에서는
getTotalMilleage
메소드가 없으므로 변수x
를 이용하여 ExCar에만 존재하는 메소드를 호출할 수 없다. - 단, 다음과 같이 캐스트 연산자를 활용하면 호출할 수 있다.
(ExCar) x.getTotalMileage();
'Java > Java 기초' 카테고리의 다른 글
Java23 추상 클래스 (0) | 2020.05.29 |
---|---|
Java22 클래스의 파생과 멤버, instance of, final 클래스 (0) | 2020.05.28 |
Java20 클래스 오버라이드와 어노테이션 (0) | 2020.05.26 |
Java19 클래스의 상속과 다형성 (0) | 2020.05.26 |
Java18 래퍼 클래스(wrapper class) (0) | 2020.05.25 |