Code Archive/JAVA

Step7. Polymorphism(다형성) 클래스 계층구조를 이용하여 구현

쌍큐 2014. 9. 12. 13:55

**다형성(Polymorphism)**

동일한 메세지에 대해 다양한 형식으로 수행되는 것

즉 하나의 메서드로 여러가지 일이 수행되는 것이다.

코드의 표준화를 위해 사용한다.

다형성을 적용하기 위해서는 반드시 계층 구조 형성 되어야함

예)

재생버튼 - 곰플레이어 ,  CDPlayer 등

같은 메세지에 대해 각자의 방식으로 다양하게 재생된다.

--> 동일한 메서드명으로 오버라이딩


instanceof 객체 캐스팅

---------------------------------------------------------------

부모 타입의 변수로 자식 객체를 참조할 수 있다.

이 경우(부모 타입의 참조 변수)에는 부모의 상속받은

멤버와 오버라이딩한 메서드는 접근 가능.

하지만 자식의 독자적인 멤버에는 접근 불가능

--> 접근하기 위해서는 객체 캐스팅 절차가 필요하다.


Animal a=new Person();

Animal a1=new Dog();


Animal 이 부모

자식 Person , Dog

eat() 오버라이딩

다형성 지원되어 Animal 자식은 모두 처리 가능하다. 

rv.pass(new Dog());                    void  pass(Animal a){a.eat();}

rv.pass(new Person());      

rv.pass(new Tiger());


**instanceof 연산자**

객체의 타입을 비교하여 true or false 로 반환

단 is a 관계시(상속)에는 true 를 반환하므로 항상

자식부터 부모순으로 비교해야 한다.

Animal a=new Person();

System.out.println(a instanceof Person); // true

System.out.println(a instanceof Dog);// false

System.out.println(a instanceof Animal);// true


**다형성 적용 배열**

일반적으로 배열은 자신이 선언한 타입의 요소만

관리 가능

Car [] cars={ new Car("sm5"), new Car("k5")};

위와 같이 Car로 선언된 배열은 Car 객체만 추가 가능

하지만 계층구조 형성(상속관계)이 되어 있는 경우

Animal [] a={new Animal(), new Person(),new Dog()} 와 같이

하나의 부모 타입에 다양한 배열 요소를 추가할 수 있다.

이 경우 a[1] 은 Animal 타입으로 인식되어 Person의

독자적인 메서드 ticketing() 과 같은 메서드를 호출할 경우

캐스팅이 필요하다.

--다형성 예 --


class Vehicle{

public void go(){

System.out.println("가다");

}

}

class Car extends Vehicle{

public void go(){

System.out.println("자동차가 가다");

}

}

class Airplane extends Vehicle{

public void go(){

System.out.println("비행기가 가다");

}

public void fly(){

System.out.println("비행기가 날다");

}

}

public class TestPoly6 {

public static void main(String[] args) {

// 다형성이 적용되므로 Vehicle 부모타입의 배열에 

// 자식 객체 요소를 추가 가능 

Vehicle va[]={new Vehicle(),new Car(),new Airplane()};

// for 문 이용하여 배열의 모든 요소에 go() 를 호출! 

// 이 때 Airplane 인 경우 go() 를 호출한 후 fly() 도 호출!

for(int i=0;i<va.length;i++){

va[i].go();

if(va[i] instanceof Airplane){

Airplane a=(Airplane)va[i];

a.fly();

//((Airplane) va[i]).fly();

}//if

}//for

}//main

}//class