수업(국비지원)/Java

[Java] chap7 : 클래스의 관계 - 상속2

byeolsub 2023. 4. 15. 23:49
  • 상속
 - 부모클래스의 멤버와 자손클래스의 멤버가 같은 경우(조건)
    멤버 변수 : 참조변수의 자료형을 따른다.
    멤버 메서드 : 객체에 최종 오버라이딩된 메서드가 호출된다.

 - 부모클래스의 멤버와 자손클래스의 멤버가 다른 경우(조건)
    멤버 변수 : 부모클래스의 참조 변수로 참조시 부모클래스의 멤버만 접근 가능
                자손클래스의 참조변수로 참조시 부모클래스의 멤버도 접근 가능
    
== 객체와 참조변수의 관계 ===
  - 부모클래스의 객체는 자손클래스의 참조변수로 참조 할 수 없다. 
       (why? 부모클래스 안에 자손클래스를 가지고 있지 않으므로)  
  - 자손클래스의 객체는 부모클래스의 참조변수로 참조 할 수 있다.
       (자손클래스는 부모클래스의 참조변수를 포함하고 있으므로)
     
  - 참조변수와 객체의 자료형이 틀린경우는 ClassCastException 발생함. 
    Instanceof 연산자를 이용하여 미리 객체와 참조변수의 관계를 확인 할 수 있다.

 

📌

package chap7;

class Bike3{
	int wheel;
	int price = 10;
	Bike3(int wheel){
		this.wheel = wheel;
	}
	void drive() {
		System.out.println("페달을 밟는다.");
	}
	void stop() {
		System.out.println("브레이크를 잡는다.");
	}
}
class AutoBike3 extends Bike3{
	boolean power;
	int price = 200;
	AutoBike3(int wheel){
		super(wheel);
	}
	void power() {
		power = !power;
		if(power) System.out.println("전원이 켜졌습니다.");
		else System.out.println("전원이 꺼졌습니다.");
	}
	void drive() {
		if(!power) power();
		System.out.println("출발버튼을 누른다.");
	}
}
public class AutoBikeEx3 {
	public static void main(String[] args) {
		AutoBike3 ab = new AutoBike3(2); //객체 1개
		System.out.println("가격: "+ab.price); //200
		ab.drive();
		ab.stop();
		Bike3 b = (Bike3)ab; //형변환 - 부모클래스 <= 자손클래스 : 형변환 연산자 생략 가능
		System.out.println("가격: "+b.price); //10
		b.drive(); //@Override 오버라이딩 - 객체의 최종 오버라이딩 된 것을 호출함
		b.stop();
		
/*	Bike3 b2 = new Bike3(2); -> new Bike3(2)에 대한 객체가 변환 불가.
		 형변환이 가능 -  부모클래스에 자료형과 자손클래스의 자료형간의 형변환이 가능하다.
		AutoBike3 ab2 = (AutoBike3) b2; // java.lang.ClassCastException 오류 발생 / 자바에서는 그때그때 실핼함
		                                // 자손클래스 <= 부모클래스 형변환시 형변환 연산자 생략 불가.
		                                  (큰것에서 작은것으로 이동할때는 형변환 연산자 생략 불가)
		System.out.println(b2.price);  //컴파일에는 오류가 없으나 결과창에는 에러가 난다.(48번째 줄에서)
		System.out.println(ab2.price);
*/		
		Bike3 b2 = new AutoBike3(2); // java.lang.ClassCastException 오류 발생하지 않음 
		AutoBike3 ab2 = (AutoBike3) b2;  
		System.out.println(b2.price); 
		System.out.println(ab2.price);
		
	}
}