현업에서 폴리모피즘은 정말정말 많이 사용된다.

그래서 너무너무너무너무 중요한 부분이다!!

 

1. 폴리모피즘이란?

부모타입으로 자식 객체를 생성

아래 코드의 3~5번째 라인과 같이 Employee 타입으로 자식 객체를 생성하는 것을 폴리모피즘 이라 한다.

Employee e = new Employee();
Manager m = new Manager();
Employee manager = new Manager();
Employee engineer = new Engineer();
Employee secretary = new Secretary();

Employee[] arr = {e, m, manager, engineer, secretary};

그런데,,

마지막 줄의 arr배열을 보자!!

배열의 정의는 같은 타입의 연속된 변수이다.

어??

저기 m은 Manager타입이 아닌가?? 왜 에러가 안나는걸까?

Manager클래스가 Employee클래스를 상속받았기 때문이다.

이렇게 여러개의 타입으로 묶는 경우는 부모 타입으로 묶으면 가능하다!!

이런것을 Heterogeneous Collection이라 한다.

반대로 일반적인 배열처럼 같은 타입으로 묶였으면 Homogeneous Collection이라 한다.

 

2. 폴리모피즘 특징

Q) 자식 클래스가 부모클래스에 있는 메소드를 오버라이딩(Overriding) 했을 때 어떤 메소드가 호출될까?

A) 자식 클래스의 메소드가 호출된다.

이런것을 Virtual Method Invocation이라 한다.

1. 컴파일한 시점의 메소드와 실행시점의 메소드가 서로 다르다.

처음에는 부모 클래스의 메소드가 컴파일 되지만 실행시점에서는 자식 클래스의 메소드가 실행된다.

2. 이런 현상은 부모타입으로 자식 객체를 생성하고(폴리모피즘), 오버라이딩 된 메소드를 호출할때만 발생한다.

 

3. instanceof

폴리모피즘과 뗄래야 뗄 수 없는 관계가 instanceof이다.

왜??

다음과 같은 코드가 있다고 하자.

Employee e1 = new Manager();
Employee e2 = new Engineer();
Employee e3 = new Secretary();

객체 e1, e2, e3 모두 Employee type인데 어떤게 Manager, Engineer or Secretary클래스의 객체인지 알 수 없다.

이 때 사용하는게 instanceof 이다.

Employee e1 = new Manager();
Employee e2 = new Engineer();
Employee e3 = new Secretary();

foo(e1);	// Manager 객체
foo(e2);	// Engineer 객체
foo(e3);	// Secretary 객체

pulbic void foo(Employee e){
	if (e instanceof Manager){
    	System.out.println("Manager 객체");
    } 
    else if (e instanceof Engineer){
    	System.out.println("Engineer 객체");
    } 
    else if (e instanceof Secretary){
    	System.out.println("Secretary 객체");
    }
}
<<결과값>>
Manager 객체
Engineer 객체
Secretary 객체

이런식으로 구분할 수 있다~!!

Posted by Jyoel :