: 기존의 코드를 손대지 않고 기능을확장하는 방법.
=>기존의 코드를 건드리지 않으면 버그가 있을 가능성이 줄어든다.
기존의 소스 코드가 필요없다.
다형성
: 다형적 변수(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();이것은 컴파일 에러가 나는 것이다..
* 상속은 자식클래스가 부모클래스를 포함하는 듯 보이지만 실제로는 부모클래스의 링크정보만을 가지고 있다.
댓글 없음:
댓글 쓰기