Programming/JAVA

[JAVA] 다형성(Polymorphism)

잇나우 2020. 2. 24. 21:21
반응형

다형성(Polymorphism)

하나의 메소드나 클래스가 다양한 방법으로 동작하는 것을 의미한다. 혹은 하나의 객체가 여러가지 타입을 가질수 있는것을 말한다. 두 의미 달라보이지만 말만 다르지 똑같은 결과를 말하고 있는 것이다. 오버로딩 또한 다형성의 예라고 볼 수 있는데 이점에 대해서는 이견이 존재한다.

클래스 다형성

상속관계에서 상위타입의 변수로 하위타입을 참조할 수 있는 것을 다형성이라고 한다. 즉 부모 클래스 데이터타입의 변수로 자식 클래스 타입의 인스턴스를 참조할 수 있다.

class Parent {
    public void superObj() {
        System.out.println("부모 클래스");
    }
}

class Child {
    public void superObj() {
        System.out.println("자식 클래스");
    }
    public void subObj() {
        System.out.println("서브 오브젝트");
    }
}

Parent obj = new Child(); // Child의 인스턴스 이지만 데이터타입이 Parent

obj.superObj(); // "자식 클래스" 출력
obj.subObj();  // 오류발생

Child의 인스턴스를 obj라는 변수에 담았는데 그 변수의 데이터타입은 Parent이다. obj.superObj()를 했을 경우 오버라이드를 하였으면 오버라이드의 우선순위가 높아 Child 클래스의 superObj가 호출되고 오버라이드가 되어있지 않으면 Parent 클래스의 superObj가 호출된다. 하지만 obj.subObj의 경우 Parent 클래스에는 subObj 메소드가 존재하지 않기 때문에 오류가 발생한다. 이처럼 상속 관계에 있는 클래스 에서만 타입 변환을 할 수 있다. 부모 타입에 저장된 자식 타입의 실제 데이터 타입을 알려면 instanceof연산자를 사용해야한다.

그렇다면 다형성은 왜 사용할까? 다형성을 사용하지 않는다면 같은 동작을 수행하는 메소드를 매개변수의 데이터 타입만 바꿔서 여러개의 메소드를 만들어서 사용해야한다. 즉 오버로딩을 해야하는데 만약 그 클래스가 상속관계에 있다면 여러개의 오버로딩한 메소드가 아닌 하나의 부모 클래스 타입을 매개변수로 가진 메소드를 대상으로 여러가지를 호출할 수 있는 것이다.

반응형