Skip to main content

[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)에 따라 오버라이딩된 메서드가 실행됨