수업(국비지원)/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);
}
}