[Java] 자바와 C언어에서 오버로딩, 오버라이딩, 바인딩
자바와 C언어에서 오버로딩, 오버라이딩, 바인딩이 어떻게 다르게 동작하는지, 그리고 상속이 있을 때 Parent p = new Child(); 에서 변수와 메서드가 어떻게 동작해?
1. 자바(Java)
오버로딩(Overloading)
- 정의: 같은 이름의 메서드를 매개변수 타입이나 개수로 구분해 여러 개 만드는 것
- 바인딩 시점: 컴파일 타임(Static binding)
- 호출할 메서드는 컴파일 시점에 결정됨
오버라이딩(Overriding)
- 정의: 부모 클래스에 정의된 메서드를 자식 클래스에서 재정의하는 것
- 바인딩 시점: 런타임(Dynamic binding)
- 호출할 메서드는 실행 시점에 객체 타입에 따라 결정됨
변수
- 변수는 오버라이딩 불가
- 참조 변수 타입에 따라 접근하는 변수가 결정됨 (컴파일 시 결정)
예:
class Parent {
int x = 100;
void method() { System.out.println("Parent method"); }
}
class Child extends Parent {
int x = 200;
void method() { System.out.println("Child method"); }
}
Parent p = new Child();
System.out.println(p.x); // 100 - 변수는 참조 타입 Parent 기준
p.method(); // Child method - 메서드는 객체 타입 Child 기준
2. C언어 (상속 개념이 명확하지 않음)
- C언어는 객체지향 언어가 아니고 상속 개념이 내장되어 있지 않음
- 따라서 오버로딩/오버라이딩, 바인딩 개념도 없음
- 함수 포인터로 흉내낼 수 있지만, 직접적인 다형성 지원은 불가능
3. 비교 정리
구분 | 자바 | C언어 |
---|---|---|
오버로딩 | 가능 (컴파일 타임에 메서드 결정) | 불가능 |
오버라이딩 | 가능 (런타임에 메서드 결정) | 없음 (함수 포인터로 간접 구현 가능) |
변수 바인딩 | 참조 타입에 따라 결정 (컴파일 타임 결정) | 변수는 그냥 변수, 타입에 따른 결정 없음 |
상속 | 내장된 개념, 다형성 지원 | 없음 (직접 구현해야 함) |
4. Parent p = new Child();
일 때
- 변수 참조:
Parent
타입의 변수에 선언된 멤버만 접근 가능 - 메서드 호출: 객체 타입(
Child
)에 따라 오버라이딩된 메서드가 실행됨