본문 바로가기
JAVA

[Tip] static 메서드의 오버라이딩 불가

by MINNI_ 2021. 5. 7.

[ 결론 : 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

 

댓글