개발기초지식
[면접질문대비] Static 클래스/메서드는 오버라이딩이 될까? NO!
수바니
2025. 6. 6. 22:56
1. 🔧 오버라이딩이란?
오버라이딩은 부모클래스의 메서드를 자식 클래스가 재정의하는 것
조건
1. 인스턴스 메서드여야 함 ( static 안됨)
2. 메서드 이름, 매개변수, 반환형이 같아야 함
3. 접근 제어자는 더 좁게 하면 안 됨
2. ❗ static 메서드는 오버라이딩되지 않는다
class Parent {
static void sayHello() {
System.out.println("Hello from Parent");
}
}
class Child extends Parent {
static void sayHello() {
System.out.println("Hello from Child");
}
}
Parent obj = new Child();
obj.sayHello(); // 출력: Hello from Parent
이건 ** 오버라이딩이 아니라 "메서드 숨김 (method hiding)" **
static 메서드는 클래스에 귀속 -> 인스턴스에 따라 다르게 동작되지 않음
따라서 다형성이 적용되지 않음
그래서 자식 클래스인 Hello from Child로 출력되는 것이 아닌 Hello from Parent로 출력
3. ✅ 정리: static은 오버라이딩이 아니라 숨김(hiding)
구분 | static 메서드 | 인스턴스 메서드 |
오버라이딩 가능? | X 안됨 (숨김만 가능) | 가능 |
다형성 적용 가능? | X 안됨 | 가능 |
실행 시점 결정 | 컴파일 시 클래스 기준 | 런타임 시 인스턴스 기준 |
4. 📦 static 클래스는 어떨까?
자바에서는 정적(static) 클래스는 ** 내부 클래스 (중첩 클래스) ** 에서만 사용할 수 있습니다.
class Outer {
static class Inner {
void hello() {
System.out.println("Static Inner");
}
}
}
1. 정적 내부 클래스는 외부 클래스의 인스턴스 없이도 생성 가능
2. 상속은 가능 하지만, 내부의 static 메서드는 마찬가지로 오버라이딩 불가
5. 🎯 결론 정리
질문 | 답변 |
static 메서드는 오버라이딩 가능한가요? | X 불가능! 숨김만 가능 |
왜 안되나요? | 클래스 소속 메서드이기 때문에 다형성이 적용되지 않음 |
static 클래스의 메서드는? | 내부에 static 메서드가 있다면 마찬가지로 오버라이딩 불가 |
정적 클래스 자체는 상속 가능한가요? | 가능! 단, 메서드는 숨김 |
📌 핵심 요약
static 메서드는 오버라이딩 되지않고 숨김 처리 됨
Parent obj = new child(); 처럼 부모 타입 참조를 사용할 경우, 항상 부모 클래스의 static 메서드가 호출됨
오버라이딩은 오직 인스턴스 메서드에서만 가능
📄 예제 코드
class Parent {
static void sayHello() {
System.out.println("👋 Hello from Parent");
}
}
class Child extends Parent {
static void sayHello() {
System.out.println("👋 Hello from Child");
}
}
public class Main {
public static void main(String[] args) {
Parent parent = new Parent();
Parent child = new Child(); // 업캐스팅
parent.sayHello(); // 👉 Hello from Parent
child.sayHello(); // 👉 Hello from Parent (❗ 오버라이딩 아님)
}
}
🔍 결과 설명
child.sayHello()는 child 클래스의 메서드가 아닌, Parent의 static 메서드를 호출
이유는 static 메서드는 클래스 레벨에서 정적으로 바인딩 되기 때문