middlefitting

[OOP] 다형성이란 무엇일까 본문

JAVA

[OOP] 다형성이란 무엇일까

middlefitting 2023. 2. 21. 23:02

다형성이란 객체지향의 4대원칙중 하나로 다형성을 잘 이해해야 객체지향을 잘 이해할 수 있다고 합니다.

 

다형성이란 단어 그대로 여러가지 형태를 가질 수 있는 능력을 말합니다.

 

다른 말로는 조상 타입의 참조 변수로 자손 타입의 객체를 다룰 수 있는 것을 말합니다.

 

"부모는 자식을 품을 수 있다" 라는 문장을 통해 좀 더 편하게 외우실 수 있습니다.

 

 

 

다형성 예시

import java.util.Objects;

public class Parent {
    String house;
}

class Child extends Parent{

    public Child(String house) {
        this.house = house;
    }

    void print_variable() {
        System.out.println(house);
    }
}

class main_logic {
    public static void main(String[] args) {
        Child child = new Child("Seoul");
        Parent parent = child;
        System.out.println(parent.house);	// Seoul
        System.out.println(child.house);	// Seoul

    }
}

이렇게 Parent 참조변수로 Child의 객체를 담을 수 있는 것을 확인하실 수 있습니다.

 

대신 Parent 참조변수를 통해 Child 객체를 담았을 때는 Parent의 멤버만 사용할 수 있습니다.

 

즉 위 코드에서 다음과 같은 코드는 에러가 발생할 것입니다.

 

child.print_variable(); //OK

parent.print_variable(); //ERROR

 

왜냐하면 Parent 클래스에는 해당 멤버가 정의되어 있지 않으니 사용할 수가 없는 것입니다.

 

참조변수는 마치 리모컨과 같아 자신이 정의한 멤버만 사용할 수 있습니다.

 

 

 

다형성의 장점

기능이 제한된다는 점에서 부모 참조변수에 자식을 담는 것이 큰 효용이 없어보일수도 있는데요,

 

다형성은 어마어마한 장점을 제공합니다.

 

그것은 같은 부모를 가지는 다양한 형태의 자식 인스턴스들을 부모 참조변수를 통해 한번에 처리할 수 있다는 것입니다.

 

즉 아래와 같은 코드가 가능해집니다.

 

import java.util.Objects;

public class Parent {
    String house = "Seoul";
}

class Child1 extends Parent{
    String job;
}

class Child2 extends Parent{
    String age;
}

class ParentUtil {
    static void homeTown(Parent parent) {
        System.out.println(parent.house);
    }
}

class main_logic {
    public static void main(String[] args) {
        Child1 child1 = new Child1();
        Child2 child2 = new Child2();
        ParentUtil.homeTown(child1);
        ParentUtil.homeTown(child2);
    }
}

Child1 의 인스턴스와 Child2의 인스턴스는 서로 다른 멤버를 가지지만, 

 

 Parent의 자식으로서 house라는 멤버를 공통으로 가지고 있습니다.

 

이에 ParentUtil 클래스에 정의된 메소드에서 그들을 공통으로 처리하는 것입니다.

 

Parent의 참조변수로 담길 수 있는 모든 객체들은 house 인스턴스 변수를 가지고 있으니 그것을 출력하는 간단한 메소드입니다.

 

위의 코드는 매우 간단한 코드이지만 이처럼 다형성을 잘 이용한다면 클래스를 단계별로 잘 분리해서 

 

그들의 공통적인 부분을 한번에 처리할 수 있습니다.

 

 

 

참고문헌

 

자바의정석 - 남궁성