[Java] static method 상속

Chloe Choi·2020년 11월 30일
1

Java

목록 보기
3/5

전에 [Java] static 글을 쓰다가 "상속불가능 -> 확장에 어려움" 부분을 좀 더 정리해보는게 좋을거같아서 쓰는 글~

일단 static method와 일반 method가 메모리에 올라가는 타이밍을 설명해볼게용

static binding vs. dynamic binding

static binding

compile-time에 올라감
따라서, compiler가 어떤 method를 실행할지 컴파일 타임에 결정함

dynamic bindig

runtime에 올라감
따라서, overriden instance method는 runtime에 어떤 method가 실행될지 결정

이런 동작을 이해하면, 부모클래스의 static method는 자식클래스에서 접근이 가능해도 자식클래스의 일부가 아니라는 것을 알 수 있겠죠?? (따라서 당연히 같은 static method를 자식클래스에 추가해도 둘은 독립적인 함수입니다!!)

그리고 무엇보다 overrinding의 사전적 의미를 생각해보면 static method의 상속이 불가능한 것을 쉽게 이해할 수 있습니다.

overriding의 사전적의미 in Java
: 특정 메서드가 객체의 런타임 타입에 따라 호출되는 것

재정의된 static method는 컴파일타임 타입에 따라 호출되기 때문에 완전 다른거죵

이런 동작때문에 static method를 자식클래스에서 재정의하는 것을 overriding 한다고 하지 않고 hiding 한다고 합니다!

예제

코드

class SuperClass{
	public static void staticMethod(){
		System.out.println("SuperClass: inside staticMethod");
	}
}


public class SubClass extends SuperClass{
	//overriding the static method
	public static void staticMethod(){
		System.out.println("SubClass: inside staticMethod");
	}

	public static void main(String []args){
		SuperClass superClassWithSuperCons = new SuperClass();
		SuperClass superClassWithSubCons = new SubClass();
		SubClass subClassWithSubCons = new SubClass();

		superClassWithSuperCons.staticMethod();
		superClassWithSubCons.staticMethod();
		subClassWithSubCons.staticMethod();
	}
}

output

SuperClass: inside staticMethod
SuperClass: inside staticMethod
SubClass: inside staticMethod

일반적인 함수였다면 두번째 줄이 세번째 줄과 동일한 출력을 가져야겠죠?(런타임 타입에 의해 자식클래스에서 재정의된 함수이기 때문에!) 근데 부모클래스의 static method가 불린것으로 보아 static method는 항상 컴파일타임 타입의 정보만 사용하는 것을 확인할 수 있습니다!!!!

참고

스택오버플로우-Can I override and overload static methods in Java?

profile
똑딱똑딱

0개의 댓글