티스토리 뷰
📘 오버라이딩이란 무엇인가 — 자바(Java)와 C++의 바인딩 차이
virtual 키워드의 필요성과 동작 방식
📌 오버라이딩이란?
프로그래밍에서 오버라이딩(Overriding)은 상속 관계에서 발생하는 중요한 개념입니다.
오버라이딩이란 자식 클래스가 부모 클래스에서 상속받은 메소드를 자신의 방식으로 다시 정의하는 것을 뜻합니다.
예를 들어, 부모 클래스에 print()라는 메소드가 정의되어 있다면, 자식 클래스는 똑같은 이름과 매개변수를 가지는 print()를 작성해 부모의 동작을 덮어쓸 수 있습니다. 이를 통해 자식 클래스는 자신에게 맞는 동작을 구현할 수 있고, 부모 클래스의 기능을 그대로 사용하거나 수정할 수 있습니다.
📖 오버라이딩을 사용하면 코드 재사용성과 확장성이 높아집니다.
부모 타입으로 여러 자식 객체를 통일성 있게 다루면서도, 각 객체마다 다른 동작을 수행하게 만들 수 있습니다.
이러한 동작을 가능하게 하는 핵심이 바로 바인딩입니다.
🔷 바인딩이란?
메소드 호출 시 어떤 코드가 실행될지 결정하는 시점
오버라이딩된 메소드를 호출할 때, 실제로 어떤 클래스에 정의된 메소드가 실행될지를 결정하는 과정을 바인딩이라고 합니다.
즉, 바인딩은 메소드 호출과 정의된 코드의 연결을 의미합니다.
📖 바인딩에는 두 가지 방식이 있습니다.
- 🪧 정적 바인딩(static binding)
메소드 호출이 컴파일 시점에 결정됩니다.
참조 변수의 선언 타입에 따라 어떤 메소드를 호출할지 고정됩니다.
실행 중 객체가 어떤 클래스인지 확인하지 않습니다. - 🔗 동적 바인딩(dynamic binding)
메소드 호출이 실행 시점에 결정됩니다.
참조 변수가 실제로 가리키는 객체의 클래스에 정의된 메소드를 실행합니다.
오버라이딩된 메소드가 있다면 자식 클래스의 것이 호출됩니다.
오버라이딩의 진정한 효과는 동적 바인딩이 적용될 때만 발휘됩니다.
왜냐하면 부모 타입으로 선언한 변수로 여러 자식 객체를 다룰 때도 각 객체에 맞는 메소드가 실행되기 때문입니다.
🟡 자바(Java)의 오버라이딩과 바인딩
자바에서는 모든 인스턴스 메소드가 기본적으로 동적 바인딩됩니다.
즉, 참조 변수의 타입이 부모 클래스라도, 실제 객체가 자식 클래스라면 자식 클래스에서 오버라이딩한 메소드가 호출됩니다.
자바의 메소드는 자동으로 virtual method처럼 동작하기 때문입니다.
💻 코드 예제
class Parent {
void print() { System.out.println("Parent"); }
}
class Child extends Parent {
void print() { System.out.println("Child"); }
}
public class Main {
public static void main(String[] args) {
Parent p = new Child();
p.print();
}
}
🔷 실행 결과
Child
✅ 자바에서는 virtual 같은 키워드를 쓸 필요 없이, 오버라이딩된 메소드가 호출됩니다.
즉, 자바는 오버라이딩된 메소드가 항상 동적 바인딩되도록 설계되어 있습니다.
🟡 C++의 오버라이딩과 바인딩
C++에서도 오버라이딩이 가능합니다.
하지만 메소드가 기본적으로 정적 바인딩되도록 설계되어 있기 때문에 부모 클래스의 포인터나 참조로 자식 객체를 가리키더라도, virtual 키워드를 사용하지 않으면 부모 클래스의 메소드가 호출됩니다.
💻 코드 예제: virtual 없는 경우
#include
using namespace std;
class Parent {
public:
void print() { cout << "Parent\n"; }
};
class Child : public Parent {
public:
void print() { cout << "Child\n"; }
};
int main() {
Parent* p = new Child();
p->print();
delete p;
}
🔷 실행 결과
Parent
💻 코드 예제: virtual 있는 경우
#include
using namespace std;
class Parent {
public:
virtual void print() { cout << "Parent\n"; }
};
class Child : public Parent {
public:
void print() { cout << "Child\n"; }
};
int main() {
Parent* p = new Child();
p->print();
delete p;
}
🔷 실행 결과
Child
✅ C++에서 오버라이딩된 메소드가 동적 바인딩되려면, 부모 클래스의 메소드에 반드시 virtual을 붙여야 합니다.
🟥 자바와 C++ 차이 표
💡 TMI
오버라이딩이 바르게 동작하지 않으면 다형성이 깨집니다.
다형성을 기대하면서 부모 클래스 메소드에 virtual을 선언하지 않으면 C++ 프로그램은 부모 클래스의 메소드를 실행합니다.
이는 자바에 익숙한 개발자들이 C++을 작성할 때 자주 범하는 실수입니다.
특히 인터페이스 구현, 라이브러리 설계 등에서 virtual을 빠뜨리면 심각한 버그가 발생합니다.
C++11 이후에는 override 키워드도 함께 사용하는 것이 권장됩니다.
override를 붙이면 부모 클래스 메소드를 올바르게 오버라이딩했는지 컴파일러가 확인합니다.
이렇게 하면 의도치 않은 동작을 예방할 수 있습니다.
✅ 정리
🎯 요점:
- 오버라이딩이란 자식 클래스가 부모 클래스의 메소드를 재정의하는 것입니다.
- 오버라이딩된 메소드가 어떤 기준으로 실행되는지 결정하는 것이 바인딩입니다.
- 자바는 메소드가 기본적으로 virtual처럼 동작해 동적 바인딩됩니다.
- C++은 기본적으로 정적 바인딩되며,
virtual을 붙여야 동적 바인딩됩니다. - 이 차이를 이해하지 못하면, 특히 C++에서는 예상과 다른 동작으로 오류가 발생합니다.
'자바' 카테고리의 다른 글
| 자바의 상속과 오버라이딩 완전 정리 (2) | 2025.07.14 |
|---|---|
| 자바 동적 바인딩 이해:부모 메서드에서 호출한 메서드가 자식 메서드를 실행하는 이유 (3) | 2025.07.14 |
| 자바의 상속과 메모리 구조를 이해하기 위한 기초부터 완전한 설명 (0) | 2025.07.14 |
- Total
- Today
- Yesterday
- C++
- 알고리즘기초
- 동적 계획법
- 코딩테스트
- 문제풀이
- 그리디
- 객체지향
- python 알고리즘
- 백준
- 파이썬코딩
- c언어
- 프로그래밍
- 프로그래머스
- 상속
- 알고리즘 문제풀이
- 그래프 탐색
- 알고리즘
- 브루트포스
- 문자열처리
- 코딩 테스트
- 코딩
- DP
- Python
- 문제 풀이
- dfs
- 동적계획법
- 파이썬
- HTML
- 그리디알고리즘
- 알고리즘문제풀이
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
