Java 메서드 오버라이딩과 static 메서드
요약
Java 메서드 오버라이딩(Override)과 정적 메서드(static method)의 차이를 알아봅니다. Parent ref = new Child() 패턴에서 인스턴스 메서드와 static 메서드의 호출 방식을 이해하여 정보처리기사 실기 문제를 풀어봅니다.
오버라이딩 핵심 정리
| 개념 | 설명 | 예시 |
|---|---|---|
| 오버라이딩 | 부모의 메서드를 자식이 재정의 | int x(int i) { return i + 3; } |
| 동적 바인딩 | 실제 객체 타입의 메서드가 호출됨 | ref.x(2) -> Child의 x() 호출 |
| static 메서드 | 참조 변수 타입에 따라 호출됨 | ref.id() -> Parent의 id() 호출 |
| 오버로딩 | 같은 이름, 다른 매개변수의 메서드 | x(int i) vs x(String s) |
메서드 오버라이딩이란? 쌩기초
오버라이딩(Overriding) 은 부모 클래스에서 이미 정의된 메서드를 자식 클래스에서 같은 이름, 같은 매개변수로 다시 정의하는 것입니다. 코드에서 @Override 표시가 보이면 오버라이딩된 메서드라는 뜻입니다.
Override는 over(위에) + ride(타다), 즉 기존 것 위에 타고 올라가 덮어쓴다는 뜻입니다. 부모의 메서드 위에 자식의 메서드를 덮어씌우는 것이므로 "오버라이딩"입니다.

위 코드에서 Child 클래스의 x(int i) 메서드는 Parent 클래스의 x(int i) 메서드를 오버라이딩한 것입니다. 메서드 이름(x), 매개변수(int i), 반환 타입(int)이 모두 같습니다.
오버라이딩이 필요한 이유
상속을 사용하면 부모의 메서드를 그대로 물려받습니다. 하지만 자식 클래스에서 다른 동작이 필요할 때가 있습니다. 이때 오버라이딩을 사용합니다. 특히 추상 클래스의 추상 메서드는 자식 클래스에서 반드시 오버라이딩해야 합니다.
static 메서드와 인스턴스 메서드 기초
Parent ref = new Child() 패턴에서 인스턴스 메서드와 static 메서드의 호출 과정이 다릅니다. 이 차이가 시험에서 가장 중요한 핵심입니다.
인스턴스 메서드 ref.x(2):
- ref가 가리키는 실제 객체를 확인 → Child 객체
- 그 객체에게 "x(2) 실행해줘" 요청 → Child의
x(int)실행 - 2 + 3 = 5
static 메서드 ref.id():
- ref의 선언 타입만 확인 → Parent
ref.id()를Parent.id()로 치환 — 실제 객체가 뭔지 아예 안 봄Parent.id()실행 → "P"
static 메서드는 객체 없이도 Parent.id()로 직접 호출할 수 있는 메서드입니다. 그래서 ref.id()도 "ref 타입이 뭐지? Parent네" → Parent.id() 이렇게 처리됩니다. 자식 클래스에서 같은 이름의 static 메서드를 정의해도, 이것은 오버라이딩이 아니라 각 클래스에 독립적으로 존재하는 별개의 메서드입니다.

인스턴스 메서드 vs static 메서드 비교 기초
| 구분 | 인스턴스 메서드 | static 메서드 |
|---|---|---|
| 키워드 | static 없음 | static 있음 |
| 소속 | 객체에 소속 | 클래스에 소속 |
| 오버라이딩 | 가능 | 불가능 |
| 호출 과정 | 실제 객체를 확인 → 그 객체의 메서드 실행 | 선언 타입만 확인 → 해당 클래스의 메서드로 치환 |
| 예시 | ref.x(2) → Child의 x() | ref.id() → Parent의 id() |
메서드 오버로딩 심화
오버로딩(Overloading)은 같은 이름의 메서드를 매개변수의 타입이나 개수를 다르게 하여 여러 개 정의하는 것입니다.
위 코드에서 x(int i)와 x(String s)는 이름은 같지만 매개변수 타입이 다릅니다. Java는 전달하는 인자의 타입에 따라 어떤 메서드를 호출할지 자동으로 결정합니다.
오버라이딩 vs 오버로딩 비교
| 구분 | 오버라이딩 (Overriding) | 오버로딩 (Overloading) |
|---|---|---|
| 의미 | 부모 메서드를 자식이 재정의 | 같은 이름의 메서드를 여러 개 정의 |
| 메서드 이름 | 같음 | 같음 |
| 매개변수 | 같음 | 다름 (타입 또는 개수) |
| 클래스 관계 | 부모-자식 간 | 같은 클래스 내에서도 가능 |
| 결정 시점 | 런타임 (동적 바인딩) | 컴파일타임 (정적 바인딩) |
오버라이딩은 실제 객체 타입을 기준으로 실행 시점에 어떤 구현을 호출할지 결정되고, 오버로딩은 컴파일러가 선언 타입과 인자 타입을 보고 컴파일 시점에 어떤 메서드를 호출할지 고정합니다. 두 개념이 한 코드에 섞이면 "먼저 컴파일타임에 호출 메서드 고정 → 다음 런타임에 실제 구현 선택"의 2단계 해석이 필요합니다. 자세한 2단계 해석 패턴은 메서드 오버로딩 - 컴파일타임 바인딩 페이지를 참고하세요.