김코딩

자바 - 다형성1 본문

Java

자바 - 다형성1

김코딩딩 2025. 4. 1. 12:43

오늘은 객체지향의 꽃이라고 불리는 다형성(Polymorphism)에 대해 정리해보려고 한다.

다형성이란?

다형성이란 말 그대로 "여러 가지 형태"를 의미한다.
자바에서는 하나의 타입으로 여러 객체(자식 클래스)를 다룰 수 있는 것을 말한다.

Parent p = new Child();

부모 타입으로 자식 객체를 담는 이 코드가 바로 다형성의 기본 형태이다.

 

다형적 참조

Parent parent = new Parent();
Child child = new Child();
Parent poly = new Child(); //핵심
  • parent: 그냥 부모
  • child: 그냥 자식
  • poly: 부모 타입이지만 실제로는 자식 객체를 담고 있음 → 다형적 참조

이 때 poly.childMethod()는 호출 불가! 왜냐면 poly는 Parent 타입이기 때문이다.

 

자식 메서드를 호출하려면? ➡️ 다운캐스팅!

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

 

  • 이렇게 하면 자식 타입의 기능까지 접근할 수 있다.
  • 하지만 조심! 진짜 자식이 아닌데 캐스팅하면 ClassCastException 오류가 난다!
Parent wrong = new Parent();
Child oops = (Child) wrong; //런타임 오류

 

 

안전하게 캐스팅하려면? ➡️ instanceof 사용

if (parent instanceof Child) {
Child child = (Child) parent;
    child.childMethod();
}

 

  • instanceof를 통해 실제 타입이 맞는지 확인 후 캐스팅 가능
  • 자바 16부터는 아래처럼 더 간단히 쓸 수 있다!
if (parent instanceof Child child) {
        child.childMethod(); // 자동으로 캐스팅됨
}

 

업캐스팅 vs 다운캐스팅

업캐스팅 자식 → 부모 안전함 O (자동)
다운캐스팅 부모 → 자식 위험함 X (명시적 필요)

다형성과 메서드 오버라이딩

class Parent {
    void method() {
        System.out.println("Parent");
    }
}

class Child extends Parent {
    @Override
    void method() {
        System.out.println("Child");
    }
}

Parent p = new Child();
p.method(); // 출력: Child

 


변수는 부모 타입이지만, 실제 인스턴스는 자식이기 때문에 오버라이딩된 메서드가 호출된다.

  • 변수는 오버라이딩 안 됨
  • 메서드는 오버라이딩 됨 → 무조건 하위 클래스 우선 실행

핵심 요약

  • 부모는 자식을 참조할 수 있다 (업캐스팅)
  • 자식을 쓰려면 다운캐스팅이 필요하다
  • 다운캐스팅 전에는 instanceof로 타입 체크 필수!
  • 오버라이딩된 메서드는 실제 인스턴스 기준으로 동작한다

마무리
다형성은 자바 객체지향에서 굉장히 중요한 개념이다.
지금은 좀 어렵게 느껴질 수 있지만, 예제와 함께 코드를 직접 실행해보면서 익숙해지면 분명 큰 무기가 될 것이다.

'Java' 카테고리의 다른 글

자바 - 메서드  (0) 2025.02.26
자바 - 반복문  (0) 2025.01.31
자바 - Scanner  (1) 2024.04.25
자바 - 형변환  (0) 2024.04.25