다형성의 이해1: 다형적 참조, 오버라이딩

JWJ·2025년 9월 28일

Java Basic

목록 보기
7/8

개요

객체 지향 프로그래밍에서 제공하는 다형성 에 대해서 살펴보자. 다형성은 공통 부분(메서드, 변수)을 자식 클래스에게 상속해주거나, 역할과 구현의 기능을 분리하는 강력한 기능을 제공한다. 이를 이해하기 위해서는 다형적 참조와 메서드 오버라이딩을 이해해야 한다.

1. 다형적 참조

다형적 참조란 자바에서 부모 타입은 자신은 물론, 자신을 기준으로 모든 자식 타입을 참조할 수 있다는 뜻이다.

//다형적 참조 예시
Parent poly = new Child(); //이게 다형적 참조임
//Child  child   = new Parent(); //이건 안됨

public Class Parent{
	public void parentMethod(){
    	print("parentMethod")
    }
}

public Class Child extends Parent{
	public void childMethod(){
    	print("childMethod")
    }
}

이때 Parent poly = new Child() 를 유심히 살펴보자. 이러한 poly 가 생성되면 아래와 같이 인스턴스가 만들어진다.

  • 인스턴스 내부에 Parent Child 모두 생성되지만 poly 는 부모 타입을 가르키기 때문에 childMethod 의 접근이 힘들다.

  • 이러한 이유로 다형적 참조를 활용할 때 캐스팅이 언급된다. poly 를 다운 캐스팅하면 childMethod 접근이 가능하기 때문이다.

Child child = (Child) poly;
child.childMethod();

캐스팅시 주의점

캐스팅인 업, 다운 2가지 종류가 있다. 자바에서는 업캐스팅은 Parent poly = new Child() 처럼 다형적 참조를 활용할 수 있기에 오히려 권장된다.
다만 다운 캐스팅은 런타임 에러가 발생할 수 있기 때문에 명시적으로 (Child) poly 처럼 작성해야 한다. 참고로 instanceof 키워드를 활용하여 캐스팅 가능 여부를 체크하는 것이 매우 중요하다. 아래의 코드를 살펴보자

Parent parent = new Parent();
Child child = (Child) parent;
child.childMethod(); //런타임 에러 발생

  • parent 의 인스턴스 내부에는 child 인스턴스를 포함하지 않아서 런타임 에러가 발생한다. 이러한 이유로 instanceof 함수를 활용하여 참조하는 인스턴스 타입을 확인해야 한다.
Parent parent = new Parent();
// parent 가 Child 인스턴스를 참조하는 경우
if (parent instance of Child){
	Child child = (Child) parent; //다운 케스팅
    child.childMethod();
}

2. 메서드 오버라이딩

앞서 상속파트에서 일부 오버라이딩 메모리 구조를 파악했지만, 이번 장에서는 다형적 참조 시 메서드 오버라이딩의 동작 방식을 집중적으로 살펴보자.

public class Parent {
	String value = "parent"
    public void method() {
    	print("parentMethod")
    }
}

public class Child extends Parent {
	String value = "child"
    
    @Override
    public void method() {
    	print("childMethod")
    }	
}

Parent poly = new Child();
poly.method(); //부모와 자식 메서드 중 뭐가 실행될까?

  • poly 는 먼저 Parent method 에 접근하지만, 자식 클래스에 오버라이딩한 method 가 있으면 그 메서드가 우선순위를 가진다. 따라서 위 코드에서는 childMethod 가 프린티 된다.
profile
인사이트를 얻고 정리하는 공간입니다

0개의 댓글