동적바인딩 및 오버라이드 정리
- 부모와 자식이 동일한 메소드를 들고 있다.
- 메소드를 들고있는 것 자체 ( 이건 오버라이드라고 하지 않는다. )
- 하지만 동일한 메소드를 들고 있으면 오버라이드 발생
- 부모의 메소드를 무효화 ( 오버라이드 ) 시킨다.
- 무효화하면 코드는 남아있지만 실행 X
- 오버라이드 : 무효화시킨다.
- 재정의 : 부모의 메소드를 자식이 들고 있고 데이터를 수정하는 것.
- 동적바인딩 : 부모의 메소드가 무효화되어 자식의 메소드를 찾으러 가는 행위 ( 부모에서부터 자식으로 [ 위에서 아래로 ] )
class Animal{
}
class 하나{
}
class Dog extends Animal 하나{
}
class 동물{// 부모1 자식2
}
class 강아지 extends 동물{
}
class 고양이 extends 동물{
}
- 다형성이 성립하면 상속할 수 있다.
- 부모가 둘이 될 수는 없지만, 부모 밑에 자식 여러 명은 가능하다.
class 동물{ // 부모1 자식2
void sound() { // 부모의 메소드가 오버라이딩 된다
System.out.println("동물소리");
}
}
class 강아지 extends 동물{ // 자식이 재정의
void sound() {
System.out.println("강아지소리");
}
}
class 고양이 extends 동물{
void sound() {
System.out.println("고양이소리");
}
public class Extends03 {
public static void main(String[] args) {
강아지 u1 = new 강아지(); // 포인터 → 강아지 / 강아지, 동물
u2.sound(); // 강아지소리 출력
동물 u2 = new 강아지(); // 포인터 → 동물 / 강아지, 동물
u2.sound(); // 강아지소리 출력
// 자식이 재정의, 부모 무효화 → 자식 출력
}
}
- 자식 ( 강아지, 고양이 )
- 자식이 부모의 메서드를 재 정의
- 부모의 메서드가 오버라이딩 ( 초기화 ) 된다.
class 동물{ // 부모1 자식2
void sound() { // 부모의 메소드가 오버라이딩 된다
System.out.println("동물소리");
}
}
class 강아지 extends 동물{ // 자식이 재정의
void sound() {
System.out.println("강아지소리");
}
}
class 고양이 extends 동물{
}
public class Extends03 {
public static void main(String[] args) {
동물 u1 = new 강아지();
u1.sound(); // 강아지소리
동물 u2 = new 고양이(); // 고양이가 재정의X
u2.sound(); // 동물소리
}
}
- 자식 ( 고양이 )이 재정의를 하지 않음.
- 부모 ( 동물 ) 의 메서드가 초기화 되지 않고 그대로 출력
- 결과값 : 동물소리