Spring 오픈 카톡방에 흥미로운 질문이 올라왔다. 부모클래스의 static 메소드를 오버라이딩한 자식메소드에서 왜 super로 접근이 불가능 하냐는 질문이었다.

static 메소드
자바에서 메소드에 static을 붙이면 Class.methodName(); 으로 호출이 가능하다. 대신에 이렇게 만들어진 static 메소드는 해당 클래스로 부터 만들어진 인스턴스에서 호출할 수 없다. 그래서 클래스 메소드라고 부르기도 한다.
앞서말한 코드를 보자, 메소드 내부에 super를 참조하는 내용을 작성하기 전까지는 오류가 나지 않았는데, 작성하니 저런 오류가 발생했다.
원인은 근본적인 곳에 존재했다. 애초에 this, super는 클래스 기준의 this, super로의 참조가 아닌 생성된 객체 기준에서 this, super로의 접근하는 개념이다. 그런데 앞서 보았듯 static메소드(클래스 메소드)에서 super를 참조하려고 하니 오류가 생긴 것이다. 애시당초 static 메소드에서는 super와 this 사용이 불가능하다.
그리고 착각한게 한가지 더 있다. 사실 Child클래스의 method()는 오버라이딩 된게 아니라 Child 자체의 클래스 메소드이다. "클래스 메소드" 말 그대로 해당 클래스에 관한 메소드라서 오버라이딩 같은게 불가능하다.
알고보면 별 것 아닌(?) 근본적인 문제였지만, 생각도 못했던 것이라 신선했고, 자바의 근본 개념에 대해서 다시 한 번 학습해봐야 겠다는 생각이 들었다. 잊혀질 만한 내용은 블로그에 남겨서 다시 되새기고 잊더라도, 다시 찾아서 복습할 수 있도록 해야겠다.
'[IT]' 카테고리의 다른 글
[JMeter] 웹 앱 성능 테스트 도구 (대용량 트래픽 생성) (0) | 2021.03.28 |
---|---|
[InteliJ] GroupId, ArtifactId (0) | 2021.03.27 |
[Redis] Redis 란 무엇인가? (0) | 2021.03.23 |