반응형

1. 개요

 상속 관계인 두 클래스의 메서드를 오버라이딩 한 후, 다형성의 원리를 적용하여 자료형과 참조 객체를 다르게 설정하였때 어떤 결과가 나올지 알아보았다.

 

 말이 조금 어렵게 느껴지니 예로 설명하면 다음과 같다.


 Parent라는 부모 클래스와 이를 상속받는 Child 자식 클래스가 있다.

 Parent 클래스에는 hi라는 메서드가 있기때문에 Child에서도 호출이 가능하나, 메서드를 재정의하고 싶어 메서드 오버라이딩을 하였다.

 객체 생성 시점에 Child child = new Child(); 형태로 생성 후 child.hi() 메서드를 호출해도 되지만, 다형성의 원리를 사용하여 Parent child = new Child(); 형태로 생성하였다.

 만약, 이 상황에서 child.hi() 메서드를 호출하면 Parent 클래스와 Child 클래스의 hi() 중 어떤 메서드가 실행될까?


 

 Child 객체를 참조하고있으니 Child 객체의 메서드가 호출될 것 같지만 자료형을 Parent이니 Parent의 메서드가 호출될 것 같기도 하다. 다형성에 대해 알아보고 이 고민을 해소해보자.


2. 다형성(Ploymorphism)이란?

 슈퍼클래스 타입의 변수가 서브클래스 타입의 객체를 참조할 수 있다는 성질이다.

 Child 클래스가 Parent 클래스를 상속받고 있다면 슈퍼 클래스 타입의 변수인 Parent가 Child 클래스를 참조할 수 있다는 의미인데, 예제를 보면 이해가 빠를 것이다. 다형성이란 말이 어렵지 사실 되게 익숙한 개념이다.

 

 그럼 예제를 통해 상속관계, 메서드 오버라이딩, 다형성이 적용된 객체를 생성해보도록 하겠다.


3. 예제

3.1. Parent.java

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Parent {
    
    protected String name;
    protected int age;
    
    public Parent(String name, int age) {
        this.name = name;
        this.age = age;
    }
    protected void hi() {
        System.out.println("안녕하십니까 올해로 "+age+"살인 "+name+"입니다.");
    }
}
cs

 

3.2. Child.java

1
2
3
4
5
6
7
8
9
10
11
public class Child extends Parent{
 
    public Child(String name, int age) {
        super(name, age);
    }
    
    @Override
    public void hi() {
        System.out.println("안녕? 내 이름은 "+name+"이고, "+age+"살이야! 만나서반가워~");
    }
}
cs

Parent 클래스를 상속받고 있으며 부모 클래스의 hi() 메서드를 오버라이드하여 재정의하였다.

 

3.3. Main.java

1
2
3
4
5
6
7
public class Main {
 
    public static void main(String[] args) {
        Parent child = new Child("심드류 아들",10);
        child.hi();
    }
}
cs

main 메서드에서 다음과 같이 자료형이 Parent인 child 변수에 Child 객체를 생성하여 초기화해주었다.

슈퍼클래스 타입(:Parent)인 변수(:child)가 서브클래스의 객체(new Child)를 참조하고 있다. 바로 이게 다형성이다.

그럼 이 상태에서 hi() 메서드를 실행하면 어떤 결과가 나올까?


4. 결과

Child 객체의 hi 메서드가 실행됨

 결과는 바로! Child 객체의 hi 메서드가 실행된다. 즉 자료형이 아닌, 참조 객체의 메서드가 실행되는 것이다.

 다형성의 원리를 사용하여 객체를 생성하고, 오버라이드된 메서드를 호출했을 때에는 슈퍼클래스의 메서드가 아닌, 서브클래스의 메서드가 호출된다. 즉, 참조 객체가 무엇이냐에 따라 호출하는 메서드가 동적으로 바뀔 수 있다는 뜻이다.

이러한 내용을 동적 바인딩(dynamic binding) 이라고 한다.


5. 정리

 상속관계에서 서브 클래스의 메서드를 오버라이딩 하고 다형성의 원리에 입각하여 객체 생성 후 메서드를 호출하면, 해당 메서드는 동적 바인딩된다.

 

반응형

+ Recent posts