오버라이딩과 다형성(Overriding and Polymorphism)

신광진·2021년 3월 18일
2

Java

목록 보기
13/19
post-thumbnail
post-custom-banner

오버라이딩(Overriding)


오버라이딩(Overriding)이란 상위 클래스에 선언되어 있는 메소드를 하위 클래스에서 동일하게 선언하여 사용하는 것입니다.

메소드의 이름, 시그니처가 동일하지만 하위 클래스에서 구현내용을 재정의 하여 사용할 수 있습니다.

[오버라이딩(Overriding) 예시]

public class Parent {
    public static void main(String[] agrs) {

        Parent p1 = new Parent();
        Parent p2 = new Child();
        Parent p3 = new ChildOther();

        p1.printX();
        p2.printX();
        p3.printX();
    }

    public void printX() {
        System.out.println("printX - Parent");
    }
}

class Child extends Parent {
    @Overriding
    public void printX() {
        System.out.println("printX - child");
    }
}

class ChildOther extends Parent {
    
}

[출력]

System.out.println("printX - Parent");
System.out.println("printX - Child");
System.out.println("printX - Parent");

우선 코드와 출력결과를 살펴보기 전에 상속에서 부모클래스와 자식클래스의 형변환에 대해 알아보겠습니다.

  • 자식클래스의 객체는 부모클래스의 타입을 가질 수 있다.
  • 부모클래스의 객체는 자식클래스의 타입을 가질 수 없다.
  • 부모클래스의 객체가 자식클래스의 타입을 가지기 위해서는 강제 형변환이 필요하다.

이러한 규칙이 있는 이유는 자식클래스는 부모클래스의 모든 변수와 메소드를 사용가능합니다

하지만, 자식클래스는 부모클래스에 없는 변수나 메소드를 추가하여 사용할 수 있습니다.

그렇기 때문에 부모클래스에는 없지만 자식클래스에는 존재하는 변수나 메소드가 있을 수 있기 때문에 부모클래스의 객체는 자식클래스 타입을 가질 수 없습니다.


class Child extends Parent {
    @Overriding
    public void printX() {
        System.out.println("printX - child");
    }
}

위와 같이 부모클래스(상위클래스)에 있는 printX()라는 메소드를 자식클래스(하위클래스)에서 그대로 사용하면서 구현부를 재정의하여 사용하는것을 오버라이딩(Overriding)이라고 합니다.

위에 보이는 @Overriding이라는 것은 어노테이션(Annotation)이라는 것인데, 시스템에게 이것은 오버라이딩한 메소드니까 잘못 정의되어 있으면 경고해달라고 알려주는 역할이라고 생각하시면 됩니다

어노테이션(Annotation)에 관해서는 잘 모르기 때문에 간단히 설명드리겠습니다.

혹시나 궁금하신 분들은 구글링으로 찾아보시면 많은 정보가 나올겁니다

다형성(polymorphism)


다형성(polymorphism)이란 하나의 객체가 여러가지 타입을 가질 수 있는 것이라고 생각하면 됩니다

여러분은 이미 다형성의 예시를 오버라이딩 예시에서 보셨습니다.

public class Parent {
   public static void main(String[] agrs) {

       Parent p1 = new Parent();
       Parent p2 = new Child();
       Parent p3 = new ChildOther();

바로 이부분입니다.

세 개의 객체 모두 클래스 타입은 Parent입니다.

하지만 각각 다른 클래스의 생성자를 호출하고 있습니다

자바에는 instanceOf라는 메소드를 통해 객체의 클래스 타입을 알 수 있습니다

위에서 다형성은 하나의 객체가 여러가지 타입을 가진다고 설명하였는데 사실인지 예제로 확인해보겠습니다.

[다형성(polymorphism) 예시]

public class Parent {
    public static void main(String[] agrs) {

        Parent p1 = new Parent();
        Parent p2 = new Child();
        Parent p3 = new ChildOther();

        Parent[] arr = {p1, p2, p3};
        
        for(Parent item : arr) {
        	System.out.println("---------------");
        	if(item instanceof Child) {
        		System.out.println("is Child Type");
        	} 
        	if(item instanceof ChildOther) {
        		System.out.println("is ChildOther Type");
        	} 
        	if(item instanceof Parent) {
        		System.out.println("is Parent Type");
        	}
        }
    }
}

[출력]

---------------
is Parent Type
---------------
is Child Type
is Parent Type
---------------
is ChildOther Type
is Parent Type

부모클래스를 제외한 자식클래스들은 두 가지의 클래스 타입을 가진것을 볼 수 있습니다.

이러한 것이 다형성(ploymorphism)입니다.

다형성의 예시는 매우 많습니다.

예를들어 오버로딩(Overloading)도 다형성을 구현하는 방법 중 하나입니다.

다형성이라는것은 한마디로 정의하기 매우 어려운 개념이라고 생각합니다

제가 작성한 예시말고도 많은 정보들이 있으니 꼭 여러사이트에서 다형성에 대해 찾아보시기 바랍니다.

profile
이거 왜안되냐
post-custom-banner

0개의 댓글