JAVA
[Tip] static 메서드의 오버라이딩 불가
MINNI_
2021. 5. 7. 18:05
[ 결론 : static 메서드의 오버라이딩은 불가!!]
1. 컴파일 타임(Compile Time) vs 런타임(Run Time)

- 컴파일 타임
- 개발자가 작성한 소스 코드를 컴파일하여 기계어코드로 변환하는 과정
- 컴파일이 진행되는 과정 - 런타임
- 컴파일 과정을 마친 프로그램이 사용자에 의해 실행되는 과정
2. 정적 바인딩(Static binding) vs 동적 바인딩(Dynamic binding)
- 정적 바인딩
- 컴파일 타임에 성격이 결정
- 컴파일러가 어떤 메소드를 실행할지 컴파일 타임에 결정 - 동적 바인딩
- 런타임에 성격 결정
3. static 메소드 오버라이딩 불가 => static hiding
- static hiding
- 부모 클래스와 자식 클래스의 동일한 이름의 정적 메서드는 재정의가 아닌 새로 추가된 것이며, 서로 구별됨 - static 메소드는 컴파일 시, 메모리에 올라가고 메소드 영역에 존재하며, 실제 객체를 찾는 작업을 시행 X
- 컴파일 시점에 선언된 타입의 메소드를 호출 - 오버라이딩은 런타임 시, 사용될 메소드 결정
- static은 클래스 단위의 성격, 오버라이딩은 객체 단위의 성격을 지님
- 따라서, static 메소드는 오버라이딩 불가 X
- 예제
// static 메소드 X -> 오버라이딩 가능
class Vehicle{
String color;
int speed;
public Vehicle(String color, int speed) {
this.color = color;
this.speed = speed;
}
void show() {
System.out.printf("자동차 색상은 %s이고, 자동차 속도는 %d이다.", color, speed);
}
}
class Car extends Vehicle{
int displacement;
int gears;
public Car(String color, int speed, int displacement, int gears) {
super(color, speed);
this.displacement = displacement;
this.gears = gears;
}
void show() {
System.out.printf("자동차 색상은 %s이고, 자동차 속도는 %d, 자동차 배기량은 %d, 자동차 기어단수는 %d이다."
, color, speed, displacement, gears);
}
}
public class OverrideTest {
public static void main(String[] args) {
Car c = new Car("파랑", 200, 1000, 5);
c.show();
System.out.println();
Vehicle v = c;
v.show();
}
}
// [ 결과 ]
자동차 색상은 파랑이고, 자동차 속도는 200, 자동차 배기량은 1000, 자동차 기어단수는 5이다.
자동차 색상은 파랑이고, 자동차 속도는 200, 자동차 배기량은 1000, 자동차 기어단수는 5이다.

// static 메소드 O -> 오버라이딩 불가
class Vehicle{
static String color;
static int speed;
public Vehicle(String color, int speed) {
this.color = color;
this.speed = speed;
}
static void show() {
System.out.printf("자동차 색상은 %s이고, 자동차 속도는 %d이다.", color, speed);
}
}
class Car extends Vehicle{
static int displacement;
static int gears;
public Car(String color, int speed, int displacement, int gears) {
super(color, speed);
this.displacement = displacement;
this.gears = gears;
}
static void show() {
System.out.printf("자동차 색상은 %s이고, 자동차 속도는 %d, 자동차 배기량은 %d, 자동차 기어단수는 %d이다."
, color, speed, displacement, gears);
}
}
public class OverrideTest {
public static void main(String[] args) {
Car c = new Car("파랑", 200, 1000, 5);
c.show();
System.out.println();
Vehicle v = c;
v.show();
}
}
// [ 결과 ]
자동차 색상은 파랑이고, 자동차 속도는 200, 자동차 배기량은 1000, 자동차 기어단수는 5이다.
자동차 색상은 파랑이고, 자동차 속도는 200이다.

[ 참조 ]
velog.io/@cchloe2311/Java-static-method-%EC%83%81%EC%86%8D
[Java] static method 상속
전에 \[Java] static 글을 쓰다가 "상속불가능 -> 확장에 어려움" 부분을 좀 더 정리해보는게 좋을거같아서 쓰는 글~일단 static method와 일반 method가 메모리에 올라가는 타이밍을 설명해볼게용compile-tim
velog.io
blog.naver.com/gngh0101/221206214829
자바 오버라이딩(Overriding)에 제대로 이해하기 - 고급편 (static, hiding 기법 )
자바 오버라이딩(Overriding )에 제대로 이해하기 - 고급 (static, hiding 기법 ) 오버라이딩(Overriding...
blog.naver.com
woovictory.github.io/2020/07/05/Java-binding/
[Java] 동적바인딩 vs 정적바인딩
최근에 갑자기 동적 바인딩과 정적 바인딩에 관한 내용이 떠올랐는데, 말로 설명하지 못하는 모습을 보고 정확히 알지 못한다는 것을 알게 되었다. 그래서 정리하려고 한다.
woovictory.github.io