개발기초지식

[면접질문대비] 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 메서드는 클래스 레벨에서 정적으로 바인딩 되기 때문