○ 정적바인딩, 동적바인딩
●정적바인딩(컴파일시)
- 컴파일러가 객체 유무 관계없이 바인딩, 참조변수가 null이어도 컴파일러 오류 없다
●동적바인딩(실행시)
- 실제 실행시에 jvm이 실제 객체에서 오버라이딩이 있는지 확인하고 바인딩해줌
레퍼런스 instanceof 클래스명
- 레퍼런스 : 참조변수 타입이 아니고, 참조변수가 가지고 있는 객체의 타입
- 클래스명 : 레퍼런스와 같거나, 레퍼런스의 부모이면 true
ex) Animal animal = new Puppy(); 일 경우, animal은 Puppy타입이다
파일명 : Test2.java
package com.test;
class Animal {
Animal() {
super();
}
int age;
void speak() {
System.out.println("소리내기");
}
}
class Puppy extends Animal {
Puppy() {
super();
}
@Override
void speak() {
System.out.println("멍멍~");
}
void beFriendly() {
System.out.println("친근하기 애교부리기");
}
}
class Cat extends Animal {
@Override
void speak() {
System.out.println("야옹~");
}
}
class Duck extends Animal {
@Override
void speak() {
System.out.println("꽥꽥~");
}
}
class Hamster extends Animal {
@Override
void speak() {
System.out.println("찍찍~");
}
}
class Vet {
// 객체의 관계주입 방법 2가지: 생성자를 통한 주입, 메소드를 통한 주입
// 주사놓기
void giveShot(Animal animal) {
animal.speak();
// animal.beFriendly(); // 강아지용 메소드는 호출불가
// 인스턴스는 실행중인 객체를 의미
if (animal instanceof Cat) { // 실행시 실제 객체가 어떤 타입인지 확인
System.out.println();
} else if (animal instanceof Puppy) {
System.out.println("Puppy");
Puppy puppy = (Puppy) animal; // 다운캐스팅
puppy.beFriendly(); // 강아지 객체만이 가진 요소 사용
} else if (animal instanceof Animal) { // 부모타입 true
System.out.println("Puppy");
}
Puppy puppy = (Puppy) animal;
}
void giveShotToPuppy(Puppy puppy) {
puppy.speak();
puppy.beFriendly();
}
// void giveShotToCat(Cat cat) {
// cat.speak();
// }
// void giveShotToDuck(Duck duck) {
// duck.speak();
// }
}
public class Test2 {
public static void main(String[] args) {
// Puppy puppy = new Puppy();
// puppy.speak();
//
// Cat cat = new Cat();
// cat.speak();
//
// System.out.println("================");
//
// // 업캐스팅 - 다형성
// Animal animal;
// animal = new Puppy(); // 동적바인딩
// animal.speak(); // 멍멍~
// animal = new Cat();
// animal.speak(); // 야옹~
//
// System.out.println("================");
Vet vet = new Vet();
Puppy puppy = new Puppy();
Cat cat = new Cat();
Duck duck = new Duck();
Hamster hamster = new Hamster();
// 이렇게 프로그램을 하게 되면, 동물 클래스가 추가될 때마다 vet에서 함수를 생성해줘야 되므로 번거롭다.
// 그래서 코드관리에 용이하도록 다형성을 이용한다.
// vet.giveShotToPuppy(puppy);
// vet.giveShotToCat(cat);
// vet.giveShotToDuck(duck);
vet.giveShot(puppy);
vet.giveShot(cat);
vet.giveShot(duck);
vet.giveShot(hamster);
}
}
'IT > Java' 카테고리의 다른 글
자바 다형성 예제 (ArrayList) (0) | 2018.07.20 |
---|---|
자바 다형성, 도형 예제 (0) | 2018.07.18 |
자바 다형성, 참조형(레퍼런스형) 형변환, 업캐스팅, 다운캐스팅 (0) | 2018.07.18 |
자바 상속, super() 생성자 호출 (0) | 2018.07.17 |
자바 상속, 메소드 오버라이딩, 메소드 오버라이딩 제약사항, 생성자 (0) | 2018.07.17 |