본문 바로가기
Java

자바 OOP (2) - 상속과 다형성 기초

by gentle-tiger 2025. 6. 17.
프로젝트 중 느낀 자바 기초의 부족함을 보완하고자 핵심 주제를 순차적으로 복습할 예정입니다.
자바 코어 → 자바 스레드 → 자바 OOP → 자바의 예외 → 자바의 컬렉션 → 최대 절전 모드 순으로 정리할 예정입니다. 

 

상속과 다형성 기초

  1. 상속이란 무엇입니까?
  2. 다형성이란 무엇입니까?
  3. Java는 다형성을 어떻게 구현합니까?
  4. 다양한 형태의 다형성에 대해 설명하십시오.
  5. 런타임 다형성 또는 동적 메서드 디스패치란 무엇입니까?
  6. 동적 바인딩이란 무엇입니까?

 

상속이란 무엇입니까?

상속은 기존 클래스의 속성과 동작을 새로운 클래스가 물려받아 재사용하고, 필요한 부분은 확장하거나 재정의할 수 있도록 하는 객체 지향의 원리입니다. 이를 통해, 코드 중복을 제거하고, 공통 로직을 상위 클래스에 모아 유지보수에 효과적입니다. Java에서는 extends 키워드를 상속만 허용하지만, 인터페이스 구현을 통해 다중 상속이 가능합니다. 

 

 

다형성이란 무엇입니까?

다형성(Polymorphism)은 동일한 메서드나 연산자가 동일한 이름으로 호출되지만, 객체 타입에 따라 다른 방식으로 동작하도록 하는 객체 지향의 핵심 개념입니다. 이를 통해 호출하는 쪽은 구체 타입을 몰라도 공통된 인터페이스나 상위 타입만 알고 일관되게 객체를 사용할 수 있으므로, 코드의 유연성과 교체 가능성이 크게 향상됩니다.

다형성은 공통된 상위 타입을 기반으로 여러 객체를 동일한 방식으로 처리할 수 있도록 설계하고, 실행 시점에 각 객체의 실제 동작을 선택하는 동적 바인딩이 작동해야 의미가 있습니다. 이를 통해 개발자는 상위 타입만 의존하고, 새로운 구현체를 추가해도 기존 코드를 변경하지 않아도 되므로 OCP(Open-Closed Principle)를 실질적으로 구현할 수 있습니다. 

 

 

Java는 다형성을 어떻게 구현합니까?

Java는 다형성을 컴파일타임(정적)과 런타임(동적) 두 가지 방식으로 지원합니다. 컴파일타임 다형성은 메서드 오버로딩과 연산자 오버로딩으로 구현되며, 동일한 이름의 메서드를 매개 변수 목록으로 구분하여 호출 시점에 결정됩니다. 런타임 다형성은 메서드 오버라이딩과 동적 메서드 디스패치로 구현됩니다. 상위 클래스 타입의 참조 변수가 실제로는 하위 클래스 객체를 참조할 떄, 실행 시점에 적합한 하위 클래스 메서드가 호출됩니다. 

 

 

다양한 형태의 다형성에 대해 설명하십시오.

다형성은 크게 정적 다형성(Static Polymorphism)과 동적 다형성(Dynamic Polymorphism)으로 구분됩니다. 정적 다형성은 컴퍼일 시점에 어떤 메서드가 호출될지 결정되며, 예시로 메서드 오버로딩이 있습니다. 동적 다형성은 살행 시점에 적합한 메서드가 호출되며, 예시로 메서드 오버라이딩이 있습니다. 부모 타입의 참조로 자식 객체를 다룰 수 있고, JVM은 실제 객체 타입에 따라 오버리이딩된 메서드를 실행합니다. 

 

 

런타임 다형성 또는 동적 메서드 디스패치란 무엇입니까?

런타임 다형성은 실행 시점에 호출할 메서드를 JVM이 결정하는 메커니즘입니다. 이를 동적 메서드 디스패치(Dynamic Method Dispatch)라고도 하며, 이는 상속 구조에서 부모 클래스 참조 변수로 자식 클래스의 오버라이딩된 메서드를 호출할 때 핵심 역할을 합니다. 아래에서 a의 타입은 Animal이지만, 참조하는 실제 객체는 Dog이므로 Dog의 eat()이 실행됩니다.

Animal a = new Dog();
a.eat(); // Animal에 정의된 eat() 대신 Dog의 eat()이 실행됨

 

 

동적 바인딩이란 무엇입니까?

동적 바인딩(Dynamic Binding)은 호출할 메서드의 실제 구현이 실행 시점에 연결(Binding)되는 것을 의미합니다. Java는 모든 비정적 메서드를 호출에서 동적 바인딩을 사용하여 런타임 다형성을 지원합니다. 반대로, 정적 메서드나 private 메서드는 컴파일 시점에 바인딩되므로 동적 바인딩이 적용되지 않습니다. 이러한 동적 바인딩 덕분에 Java 프로그램은 실행 환경에 따라 객체의 실제 타입에 맞는 메서드를 안전하게 호출할 수 있습니다.