2013년 6월 27일 목요일

(130627) 4일차 MethodOverridingTest.java (Method Overriding - 재정의 테스트)

 - Method Overriding (재정의)
 : 부모에게 물려받은 메소드를 덮어쓰는 것.
 : 다른 class를 상속 받은 subClass에서만 가능
 : 더 좁은 범위의 Access Modifier를 선언할 수 없다.
 : final이나 private를 가져다 쓸 수없다.
 : 메소드의 이름, 리턴타입, 인수는 정확하게 일치해야 한다. (일치하지 않으면 오버로딩이 됨)


 - 소스
class SubOverTest {

int speed = 0;
final int speed2 = 0; // speed2는 상수이므로 바꿀 수 없음

void speedUP(){
speed = speed + 100;
}

void speedUP2(){
speed = speed + 500;
}

void speedDown(){
speed = 0;
}
}

public class MethodOverridingTest extends SubOverTest{
int speed = 400;
/* private void speedUP(){ // private를 쓰고싶으면 부모 클래스에서 private로 바꿔야 한다.
} */

void speedUP(){ // 오버라이딩(재정의) - 즉 100이 아닌 400이 나옴
// 즉, 재정의되면 부모클래스의 speedUp 메소드는 호출이 안됨
}

void speedUp2(int a){ // 이것은 오버라이딩이 아닌 메소드 오버로딩
speed = speed + a;
}

public void test(){
speedUP();
System.out.println(speed); // 자식의 speed 값 (400) System.out.println(super.speed); // 부모의 speed 값 (0) super.speedUP(); System.out.println(speed); // 자식의 speed 값 (400) System.out.println(super.speed); // 부모의 speed 값 (100) speedUP2(); // 부모의 speedUp2를 호출 System.out.println(super.speed); // 부모의 speed 값이 바뀜 (600) speedUp2(10); // 메소드 오버로딩 된 자식의 speedUp2를 호출 System.out.println(speed); // 자식의 speed 값이 바뀜 (410) speedDown(); // 부모의 speed 값이 바뀜 System.out.println(speed); // 자식의 speed 값은 상관이 없음 (410) System.out.println(super.speed); // 부모의 speed 값이 0으로 바뀜 (0)
}

public static void main(String[] args) {
MethodOverridingTest sot = new MethodOverridingTest();
sot.test();
}
}


 - 결과