상속 & 오버라이딩
예제]
class Parent2 { int i = 7; public int get() { return i; } } class Child2 extends Parent2 { int i = 5; public int get() { return i; } } public class ChildTest { public static void print(Parent2
p) { System.out.println(p.i); System.out.println(p.get()); } public static void main(String
args[]) { Parent2
p = new Parent2(); System.out.println("---------1----------"); System.out.println(p.i); System.out.println(p.get()); Child2
c = new Child2(); System.out.println("---------2----------"); System.out.println(c.i); System.out.println(c.get()); Parent2
p2 = new Child2(); System.out.println("---------3----------"); System.out.println(p2.i); System.out.println(p2.get()); System.out.println("---------4----------"); print(c); print(p2); } } |
위의 예제를 보면 Child2 클래스는 Parent2 클래스를 상속 받는다. 두 클래스를 보면 변수 i와 get()메소드 모두 같다. 즉, Child2는 Parent2의 필드와 메소드를 오버라이딩 한 것이다.
1,2번의 경우 결과값을 쉽게 예측 할 수 있다.
---------1---------- 7 7 ---------2---------- 5 5 |
3번을 보기전에 다음의 사실을 상기하자.
l 부모는 자식을 가리킬 수 있다. 조상은 자손을 가리킬 수 있다.
l 만약, 자식이나 자손이 메소드를 오버라이딩하고 있으면, 메소드의 기능은 자식이나 자손이 구현한 것을 따른다.
객체를 사용할 때 메소드가 오버라이딩 될
경우 무조건 자식의 메소드 기능을 따른다!!
Child2의 객체가 메모리에 올라가게 되면, Child2에 있는 변수 i와 Parent2에 있는 i 모두 메모리에 올라가게 된다. 이 경우 객체를 가리키는 참조 변수가 Parent2라면 변수는 Parent2의 것을 사용한다. 메소드의 경우 오버라이딩 되었을 때는, 부모 메소드의 코드는 사라지고 자식 메소드의 코드만 남게 된다. 결국 Parent2 형식의 참조 변수가 Child2 객체를 가리킬 때, 메소드는 자식에서 선언된 메소드가 사용된다.
4번에서 print메소드는
파라미터로 Parent2를 받는다. (X)
파라미터로 Parent2와
Parent2의 자손을 받아들인다. (O)
Parent2에 대한 객체뿐만 아니라 Child2에 대한 객체도 파라미터로 전달할수 있다.
3,4번의 출력결과를 먼저 생각해보자!
---------3---------- 7 5 ---------4---------- 7 5 7 5 |
'JAVA' 카테고리의 다른 글
도메인주소를 이용하여 IP 알아내기(자바 InetAddress 클래스를 이용) (1) | 2011.03.24 |
---|---|
Thread 사용방법(extends, implements) (1) | 2011.03.17 |
Thread 시작, 종료 예제 (1) | 2011.03.11 |