프로그래밍/JAVA
static은 왜 쓰는걸까? (정적 바인딩 vs 동적바인딩)
hwangsehee
2024. 12. 22. 14:03
📌static 키워드는 특정 객체(instance)에 의존하지 않고 클래스에 직접 속한다.
따라서 다음과 같은 특징을 가진다.
- 객체 생성 없이 접근 가능하다.
- 클래스 단위로 접근이 가능하고 모든 객체가 static 값을 공유 할 수 있다.
- 오버라이딩이 불가능하다.
결론 : 위와 같은 특징 때문에 객체와 상관없는 상수값이나, 공통 유틸리티를 구현할 때 쓴다.
✏️ 왜 오버라이딩이 불가능할까?
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 메서드를 선언해도, 객체의 타입과는 상관없이 참조 변수의 타입에 따라 호출되는 메서드가 결정된다. (부모 클래스의 정적 메서드를 자식 클래스에서 숨긴다.)