2013년 8월 8일 목요일

[2주차 4일] 상속(Inheritance) 1 - 다형성


: 기존의 코드를 손대지 않고 기능을확장하는 방법.
   =>기존의 코드를 건드리지 않으면 버그가  있을 가능성이 줄어든다.
  기존의 소스 코드가 필요없다.


다형성

다형적 변수(polymorphic variables)
X의 참조 변수는 X의 인스턴스 및 X의 서브 클래스의 인스턴스를 가리킬 수 있다.
이에 대해서 예제를 통해서 상식에 기초해서 살펴보자.

ex>
class Computer {
public void m1() {}
}
class DesktopPC extends Computer {
public void m2() {}
}
class Notebook extends Computer {
public void m3() {}
}
class Nono extends Computer {

}

public class ComputerTest {
public static void main(String[] args) {
Computer c0 = new Computer();
c0.m1();

DesktopPC c1 = new DesktopPC();
c1.m1();
c1.m2();
//c1.m3();

Notebook c2 = new Notebook();
c2.m1();
c2.m3();
//c2.m2();

Computer c3 = new DesktopPC();
c3.m1();
//c3.m2();

Computer c4 = new Notebook();
c4.m1();
//c4.m3();

//Notebook c5 = new DesktopPC();
//Notebook c6 = new Computer();
//c6.m3();

//DesktopPC c7 = new Notebook();
//DesktopPC c7 = new Computer();
}
}

일반적으로 우리는 어떻게 생각하고 행동하는지 보자
- Computer 는 Computer 라고 부르고 m1()이라는 기능을 수행하는것은 너무 당연한 상식이다.
DesktopPC 는 DesktopPC 라고 부르고 컴퓨터의 기능인m1()기능과 데스크탑의 기능인 m2()도 수행하는것 또한 너무 당연한 상식이다.
Notebook 는 Notebook 라고 부르고 컴퓨터의 기능인m1()기능과 노트북의 기능인 m3()도 수행하는것 또한 너무 당연한 상식이다.
DesktopPC을 Computer 라고 부르는 것이 이상한가? 상식아닌가? 그리고 데스크탑은 컴퓨터의 기능인 m1()은 당연히 가지고 있고 m2()도 가지고 있지만, 누군가 컴퓨터의 기능이 뭐냐고 물을 때 m2()  컴퓨터의 기능이라고 하는것 또한 상식에 벗어나는것 아닌가? 그렇기 때문에 컴파일 에러가 나는것이다.
Computer를 총칭해서 DesktopPC라고 부르는 것이 상식인가? 그렇다 상식이 아니다 그렇기 때문에 DesktopPC c7 = new Notebook();이것은 컴파일 에러가 나는 것이다..



* 상속은 자식클래스가 부모클래스를 포함하는 듯 보이지만 실제로는 부모클래스의 링크정보만을 가지고 있다.


댓글 없음:

댓글 쓰기