[ 결론 : 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
blog.naver.com/gngh0101/221206214829
woovictory.github.io/2020/07/05/Java-binding/
'JAVA' 카테고리의 다른 글
CH07. 제네릭, 열거형, 컬렉션 (0) | 2021.08.04 |
---|---|
CH06. java.lang 패키지와 유용한 클래스 (0) | 2021.05.10 |
CH05. 상속, 오버라이딩, package, 제어자, 다형성, 추상클래스, 인터페이스 (0) | 2021.05.03 |
CH04. 객체지향, 클래스와 객체, 변수와 메서드, 오버로딩, 생성자, this레퍼런스, 변수 초기화 (0) | 2021.04.29 |
CH03. 반복문과 배열 그리고 예외 처리 (0) | 2021.04.28 |
댓글