하나의 객체가 많은 형(타입)을 가질 수 있는 성질
상속 관계에 있을 때, 조상 클래스의 타입으로 자식 클래스의 객체를 레퍼런스 할 수 있다.
활용 예
Object는 모든 클래스의 조상.
그러므로 object list는 어떠한 클래스라도 저장이 가능
-> Collection API가 등장하게 됨
객체의 형변환
Object person = new Person(); // Person으로 만들었더라도 Person의 필드를 사용할 수 없다.
하위 -> 상위 = 묵시적 캐스팅
Person p = new Person();
Object obj = p; // 조상의 모든 내용이 자손에 있기 때문에 문제가 없음
상위 -> 하위 = 명시적 캐스팅
Person p = new Student();
Student std = (Student)p;
주의점
조상을 무작정 자손으로 바꿀 수는 없다.
- 실제 메모리에 있는 객체가 특정 개체인지 확인하는 작업이 필요.
Person p = new Person();
if (p instanceof Student){
Student s = (Student) p;
}
정적 바인딩과 동적 바인딩
참조 변수의 레벨에 따른 객체의 멤버 연결
class Parent{
public void func(){}
}
class Child extends Parent{
@Override
public void func(){}
}
~~~~main
Child c = new Child();
c.func() // Child의 func이 실행 됨
Parent p = c;
p.func() // 여전히 child의 오버라이드 된 func이 실행 됨
정적 바인딩
컴파일 단계에서 참조 변수의 타입에 따라 연결이 달라짐
상속 관계에서 객체의 멤버 변수가 중복될 때 또는 static method
동적 바인딩
다형성을 이용해서 메서드 호출이 발생할 때 runtime에 메모리의 실제 객체의 타입으로 결정
상속 관계에서 객체의 instance method가 재정의 되었을 때 마지막에 재정의 된 자식 클래스의 메서드가 호출됨
속도나 메모리는 정적바인딩이 좋지만, 동적 바인딩이 다형성으로 효율적인 코드 재사용이 가능
System.out.println()에서 객체를 넣었을 때 해당 클래스의 toString() 함수에 따라 출력될 수 있었던 것이 다형성 덕분이었다.
부모 클래스에 대해 특정 메서드를 사용하도록 설계하고 자식 클래스에서 해당 메서드를 잘 오버라이드하면 동적 바인딩에 따라 효율적인 동작이 가능하다.
ex) 패스파인딩에 npc의 pathFind() 함수를 사용하도록 하고, npc를 지상npc와 비행npc로 상속하면 오버라이드된 pathFind 함수에 따라 육로를 따라갈지 최단거리로 날아갈 지 경로를 찾을 수 있을 것.
객체를 다루는 메서드에서 객체 별로 세부 기능을 구현하는 것이 아닌, 객체 자체에서 세부적인 기능을 구현하게 함으로써 코드의 효율성을 높여주는 특성이다.
'JAVA' 카테고리의 다른 글
[Java] Abstract : 추상 클래스 (0) | 2024.01.19 |
---|---|
[Java] 자주 Override하는 함수들 : Object (0) | 2024.01.18 |
[Java] Encapculation (0) | 2024.01.18 |
[Java] Package (0) | 2024.01.17 |
[Java] Inheritance : 상속 (0) | 2024.01.17 |