BE/JAVA

[JAVA] 자바 다형성 기본 및 활용

coding_jelly 2021. 11. 22. 14:57
목차
1. 다형성이란? 
2. 다형성의 이점 
3. 다형성 필수 조건 
4. 다형성 구현 방법
5. 예제 
6. 객체 타입 확인 : instanceof 

 

📌 1. 다형성이란? 

다형성(polymorphism)이란 부모-자식 상속 관계에 있는 클래스에서

상위 클래스가 동일한 메시지로 하위 클래스들을 서로 다르게 동작시키는 객체 지향 원리입니다. 

다형성을 활용하면 부모 클래스가 자식 클래스의 동작 방식을 알수 없어도 오버라이딩을 통해 자식 클래스를 접근할 수 있습니다.

그렇다면 어떻게  부모가 자식이 어떤 일을 하는 지 몰라도,  자식 멤버 함수를 호출시킬 수 있을 까요? 

이유는 동적 바인딩 때문입니다. 동적바인딩이란, 메서드가 실행 시점에서 성격이 결정되는 바인딩인데요.

프로그램의 컴파일 시점에 부모 클래스는 자신의 멤버 함수밖에 접근할 수 없으나,

실행 시점에 동적 바인딩이 일어나 부모클래스가 자식 클래스의 멤버함수를 접근하여 실행할 수 있습니다. 

 

📌 2. 다형성 장점 

1) 유지보수가 쉽다 

개발자가 여러 객체를 하나의 타입으로 관리가 가능하기 때문에 코드 관리가 편리해 유지보수가 용이합니다.  

2) 재사용성 증가

다형성을 활용하면 객체를 재사용하기 쉬워지기 때문에 개발자의 코드 재사용성이 높집니다.

3) 느슨한 결합

다형성을 활용하면 클래스간 의존성이 줄어들며 확장성이 높고 결합도가 낮아져 안전성이 높아집니다. 

 

📌 3. 다형성 필수 조건

1) 상속 관계

다형성을 활용하기 위해서는 필수로 부모-자식 간 클래스 상속이 이루어져야 합니다. 

2) 오버라이딩 필수 (자식 클래스에서 메소드 재정의) 

다형성이 보장되기 위해서는 하위 클래스 메소드가 반드시 재정의되어 있어야 합니다. 

3) 업캐스팅 (자식 클래스의 객체가 부모 클래스 타입으로 형변환 되는 것)

부모 타입으로 자식클래스를 업캐스팅하여 객체를 생성해야 합니다. 

 

📌 4. 다형성 구현 방법 

1) 상속 클래스 구현 (부모-자식 클래스 구현) 

2) 메소드 오버라이딩 

3) 업캐스팅하여 객체 선언 

4) 부모 클래스 객체로 자식 메소드 호출 

 

📌 5. 다형성 예시  

1) 상속 클래스 구현 (부모-자식 클래스 구현) 

- 부모 자식간 상속 클래스를 구현합니다. 

- 부모 클래스는 Book 클래스 이며 자식 클래스는 Novel(소설) 클래스입니다.  

- 디폴트 생성자 외 인수 있는 생성자를 추가해 생성자를 중복 정의합니다. 

class Book{
    public String name;
    public String publisher; 
    Book(){
    	this.name = "";
        this.publisher = "";
    }
    Book(String name, String publisher){
        this.name = name;
        this.publisher = publisher;
    }
    void print(){
        System.out.println("print : Book");
    }; 
}

 

2) 메소드 오버라이딩 

- 자식 클래스인 Novel, SF  클래스에 부모 메서드를 오버라이딩하여 재정의합니다.

class Novel extends Book{
    public String name;
    public String publisher; 
    Novel(String name, String publisher){
        super(name, publisher);
    }
    @Override
    void print(){
        System.out.println("print : Novel");
    }
}
class SF extends Book{
    public String name;
    public String publisher; 
    SF(String name, String publisher){
        super(name, publisher);
    }
    @Override
    void print(){
        System.out.println("print : SF");
    }
}

 

3) 업캐스팅하여 객체 선언 

업캐스팅(자식 클래스 객체를 부모 클래스로 형변환)하여 아래와 같이 객체를 선언합니다.

Book b = new Novel("메타버스 소설","출판사(IT)");
Book c = new SF("메타버스", "SF출판사");

 

4) 부모 클래스 객체로 자식 메소드 호출 

부모 클래스 Book 으로 생성된 객체의 멤버 함수를 선언합니다.

Book b = new Novel("소설","소설출판사");
b.print();

Book c = new SF("메타버스", "SF출판사");
c.print();

 

결과적으로 위와 같이 다형성을 활용하면

부모 클래스로 객체를 선언했으나 실행시점에 동적 바인딩되어 자식클래스의 멤버함수가 호출되는 것을 볼 수 있습니다. 

print : Novel
print : SF

 

 

📌 6. 객체 타입 확인 : instanceof 

instanceof 는 객체 타입을 확인하는 연산자로, 객체의 실제 타입을 알아보기 위한 연산자입니다. 

아래와 같이 "객체 instanceof 타입" 과 같이 사용합니다. 

객체 instanceof 타입

 

instanceof 연산자는 해당 객체가 타입이 맞다면 true, 아니면 false를 반환합니다. 

if(c instanceof SF){
    c.print(); //true
}
if(b instanceof Novel){
    b.print(); //true
}