쫑쫑이의 블로그

객체지향 4대 특성 - 다형성 (Polymorphism) 본문

공부/JAVA

객체지향 4대 특성 - 다형성 (Polymorphism)

쫑쫑2 2022. 9. 7. 22:35

다형성은 다양한 형태를 갖는 것이고, 장점으로는 재사용성이 있다고 알고 있다
다형성의 예시로 메서드 오버로딩과 오버라이딩이 있다고 알고 있다

 

=============================================================

 

하위 클래스는 상위 클래스의 멤버의 수와 같거나 많은 멤버를 갖는다

 

상위 클래스에서 하위 클래스를 참조할 수 있다

하위 클래스 내에 상위 클래스 멤버들을 모두 가지고 있기 때문이다

 

반대로 하위 클래스에서 상위 클래스 참조할 수 없다

상위 클래스 내에 하위 클래스 멤버들을 모두 가지고 있지 않을 수 있기 때문이다

 

class Person {
	void status() {
    	system.out.println("아는 사람");
    }
}

class Friend extends Person {
	void status() {
    	system.out.println("친구");
    }
}

class Honey extends Person {
	void status() {
    	system.out.println("애인");
    }
    void call() {
    	system.out.println("전화");
    }
}

public class Test {
	public static void main(String[] args) {
        Person p = new Person();
        Friend f = new Friend();
        Person h = new Honey(); // <----
    }
}

다음과 같은 클래스들이 있을 때 화살표로 표시한 부분이 상위 클래스에서 하위 클래스를 참조하는 것이다

Honey 클래스는 상위 클래스보다 많은 멤버(call 메서드)를 가지고 있지만 인스턴스 h는 call 메서드를 사용할 수 없다

하지만 status 메서드를 사용하면 Honey 클래스에 메서드 오버라이딩된 메서드를 사용한다

 

즉, 클래스의 멤버는 그대로 가지고 가고 싶은데

특정 메서드만 하위 클래스에서 오버라이딩된 메서드를 사용하고 싶을 때 이 방식을 사용하면 될 것이다

 

 

업캐스팅과 다운캐스팅

 

업 캐스팅
하위 클래스 타입에서 상위 클래스 타입으로 변경한다 (형변환 연산자 생략가능)
-> 하위 클래스 객체 참조 변수를 상위 클래스 객체 주소값으로 변경한다

 

위에서 다룬 예제가 업 캐스팅이다

public static void main(String[] args) {
    Honey h = new Honey();
    Person p = (Honey) h; // <---- 업캐스팅, (Honey) 생략 가능
    // Person p = new Honey();
}

 

다운 캐스팅

상위 클래스 타입에서 하위 클래스 타입으로 변경한다 (형변환 연산자 생략불가)

-> 상위 클래스 객체 참조 변수를 하위 클래스 객체 참조 주소값으로 변경한다

public static void main(String[] args) {
    Person p = new Person();
    Friend f = (Friend) p; // 에러 발생!
}

 

다운 캐스팅이 단순하게 업 캐스팅의 반대라고 생각하고 다음과 같이 사용하면 에러가 발생한다

다운 캐스팅은 업 캐스팅된 것을 원상복구하는 것이다

public static void main(String[] args) {
    Person p = new Honey();
    Honey h = (Honey) p; // <---- 다운 캐스팅, (Honey) 생략 불가
}

 

instanceof 연산자는 `A(참조변수) instanceof B(클래스)` A가 B의 인스턴스인지 true/false로 리턴해준다

예를 들어 모든 클래스는 Object 클래스의 하위 클래스이므로 A instanceof Object라고 입력하면 true값을 리턴한다