오버라이딩
상속관계에서 나타남. 메서드의 재정의
- 부모클래스의 메서드를 자손클래스에서 재정의 함
- 부모클래스의 메서드와 선언부가 동일해야 함
문법
[접근제어자] 리턴타입 메서드명(매개변수목록) 예외처리 => 선언부
{ } => 구현부
단, 접근제어자의 경우 넓은 범위는 가능하다
단, 예외처리의 경우 좁은 범위로는 가능하다
상속의 다형성
1. 자손클래스의 객체를 부모클래스형의 참조변수로 참조 가능함
2. 부모타입의 참조변수로 자손클래스의 객체 참조시 부모타입의 멤버들만 접근 가능함
3. 오버라이딩된 메서드는 부모타입의 참조변수로 호출이 가능함 최종 오버라이딩된 메서드가 호출됨
4. 모든 클래스의 객체는 Object 객체를 포함한다 => 모든 클래스의 객체는 Object 타입으로 참조 가능
5. 모든 클래스의 참조변수 타입으로 Object 멤버를 호출 가능함
부모클래스의 멤버와 자손클래스의 멤버가 동일한 경우
멤버변수 : 참조변수의 자료형을 따른다
멤버메서드 : 객체의 자료형을 따른다 객체의 최종 오버라이딩 된 메서드를 호출한다
예제
class Bike2{
int wheel;
Bike2(int wheel){
this.wheel = wheel;
}
void drive() {
System.out.println("페달을 밟는다");
}
void stop() {
System.out.println("브레이크 잡는다");
}
}
class EvBike2 extends Bike2{
boolean power;
EvBike2(){
super(2);
}
void power() {
power = !power;
System.out.println("전원버튼 누른다");
}
@Override // => 오버라이딩 정상여부 판단 어노테이션.
void drive() {
System.out.println("출발 버튼 누른다");
}
}
public class BikeEx2 {
public static void main(String[] args) {
EvBike2 ev = new EvBike2(); //객체이다
Bike2 b = null; //null은 객체가 아니다
ev.power();
ev.drive();
b = (Bike2)ev; //형변환 발생. 형변환 연산자 (Bike) 생략가능함. 부모클래스의 자료형이 더 크다.
b.drive(); //객체에 맞추어 최종 오버라이딩된 메서드가 호출된다.
//b.power(); //오류 발생. 부모클래스가 자식클래스 객체 참조시 자신이 가지고있는 멤버만 접근 가능하다.
Object o = b;
//o.power(); //오류 발생. power는 Object의 멤버가 아니기 때문
//o.drive(); //오류 발생. drive는 Object의 멤버가 아니기 때문
//o.stop(); //오류 발생. stop은 Object의 멤버가 아니기 때문
System.out.println(ev.toString());
System.out.println(b.toString());
System.out.println(o.toString());
}
}
출력
전원버튼 누른다
출발 버튼 누른다
출발 버튼 누른다
chap7.EvBike2@4517d9a3
chap7.EvBike2@4517d9a3
chap7.EvBike2@4517d9a3
toString 출력시 모두 같은 결과가 나온다
이를 통해 자식클래스들은 가장 큰 부모클래스인 Object 클래스를 항상 참조 가능한 것이 확인된다
'JAVA > 개념' 카테고리의 다른 글
JAVA :: 추상클래스, 추상메서드 (0) | 2024.03.29 |
---|---|
JAVA :: 부모클래스와 자식클래스 멤버가 동일한 경우의 상속 (0) | 2024.03.28 |
JAVA :: super 예약어 (0) | 2024.03.28 |
JAVA :: 상속 (0) | 2024.03.28 |
JAVA :: 초기화블럭 (0) | 2024.03.28 |