프로그래밍/JAVA

static은 왜 쓰는걸까? (정적 바인딩 vs 동적바인딩)

hwangsehee 2024. 12. 22. 14:03

 

📌static 키워드는 특정 객체(instance)에 의존하지 않고 클래스에 직접 속한다. 

 

따라서 다음과 같은 특징을 가진다.

  1. 객체 생성 없이 접근 가능하다.
  2. 클래스 단위로 접근이 가능하고 모든 객체가 static 값을 공유 할 수 있다. 
  3. 오버라이딩이 불가능하다.

결론 : 위와 같은 특징 때문에 객체와 상관없는 상수값이나, 공통 유틸리티를 구현할 때 쓴다. 


✏️ 왜 오버라이딩이 불가능할까?

static 메서드는 정적 메서드이다. (static은 정적이라는 뜻을 가지고 있음)

정적 메서드는 클래스에 바인딩되기 때문이다. 

즉, static 메서드는 객체가 아닌 클래스에 속하므로 객체 인스턴스를 기반으로 한 동적 메서드 오버라이딩과는 동작 방식이 다르기 때문이다. 

 

동적 바인딩 vs 정적 바인딩 

동적 바인딩 Dynamic Binding

  • 인스턴스 메서드는 객체가 생성될 때 바인딩 된다. 
  • 오버라이딩은 자식 클래스에서 부모 클래스의 메서드를 재정의하는 것으로, 실제 객체의 타입(구현체의 타입)에 따라 호출되는 메서드가 결정 된다. 
  • 자식 클래스에서 부모 클래스의 메서드를 동적으로 대체할 수 있다. 

정적 바인딩 Static Binding

  • 객체의 타입이 아닌, 메서드를 호출하는 클래스의 타입에 따라 메서드가 결정 된다. 
  • static 메서드는 컴파일 시점에 어떤 메서드를 호출 할지 결정되므로, 오버라이딩을 할 수 없다. 
  • 단, 메서드를 숨기는(Method Hiding) 방식이 가능하다.  
class Parent {
    public static void staticMethod() {
        System.out.println("Parent static method");
    }
}

class Child extends Parent {
    // static method hiding, not overriding
    public static void staticMethod() {
        System.out.println("Child static method");
    }
}

public class Main {
    public static void main(String[] args) {
        Parent p = new Parent();
        p.staticMethod();  // 출력: Parent static method

        Child c = new Child();
        c.staticMethod();  // 출력: Child static method

        Parent pc = new Child();
        pc.staticMethod(); // 출력: Parent static method (static 메서드는 객체가 아닌 클래스에 바인딩)
    }
}

 

  • static 메서드는 컴파일 시점에 결정되기 때문에 Parent 클래스의 staticMethod가 호출된다. 
  • Method Hiding : 자식 클래스에서 부모 클래스의 static 메서드를 선언해도, 객체의 타입과는 상관없이 참조 변수의 타입에 따라 호출되는 메서드가 결정된다.  (부모 클래스의 정적 메서드를 자식 클래스에서 숨긴다.)