IT/Java

자바 다형성, 정적바인딩, 동적바인딩, instanceof

노마드오브 2018. 7. 18. 00:19

○ 정적바인딩, 동적바인딩

정적바인딩(컴파일시)

  - 컴파일러가 객체 유무 관계없이 바인딩, 참조변수가 null이어도 컴파일러 오류 없다

동적바인딩(실행시)

  - 실제 실행시에 jvm이 실제 객체에서 오버라이딩이 있는지 확인하고 바인딩해줌


instanceof 연산자 : 실행시 실제 객체가 어떤 타입인지 확인

레퍼런스 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);

}


}