본문 바로가기

Java/Java

(JAVA) Method 오버라이딩에 대해서

오버 라이딩이란 상위 클래스의 메서드를 하위 클래스에서 해당 클래스에 맞게 재정의 하는 것을 의미한다.

그렇다면 Static 메서드는 재정의가 가능할까?

 

코드를 통해서 살펴보자!

 

Money가 static 메서드 인 점에 주목하자

public class Parent {

    public static void Money() {
        System.out.println("(부모) 돈 입니다.");
    }

    public void House() {
        System.out.println("(부모) 집 입니다...");
    }
}
public class Child extends Parent{
    
    public void House() {
        System.out.println("(자식) 집 입니다...");
    }

    public static void Money() {
        System.out.println("(자식) 돈 입니다.");
    }
}
public class Main {
    public static void main(String[] args) {
        Parent parent = new Parent();
        parent.House();
        parent.Money();


        Parent child = new Child();
        child.House();
        child.Money();


    }
}

위의 Main 클래스를 실행하면 결과가 어떻게 예상되는가?

 

1.

(부모) 집입니다...
(부모) 돈입니다.
(자식) 집입니다...
(자식) 돈입니다.

 

2.

(부모) 집입니다...
(부모) 돈입니다.
(자식) 집입니다...
(부모) 돈입니다.


많은 이들이 1번을 예상했겠지만 애석하게도 정답은 2번이다.

Parent child = new Child();

static 메서드는 클래스 메서드라고도 한다. 해당 메서드는 런타임 시점이 아닌 컴파일 시점에 메모리에 올라간다.

따라서 컴파일 시점에 Parent 클래스로 타입이 명시되어있기 때문에 Parent가 가지고 있는 메서드를 호출하는 것이다.

 

이러한 이유로 static 메서드는 다형성을 적용할 수가 없다.

 

 

static 메서드는 정말 오버 라이딩할 수 없는 것일까?

좋은 방법은 아니지만 Hiding이라는 기법이 존재한다.

 

거창한 방법은 아니고 위에 언급하였던

Parent child = new Child();

해당 코드를

Child child = new Child();

위와 같이 명시해주면 된다. 

 

객체지향 관점에서 실제 구현 타입을 이와 같이 명시하는 것은 좋은 방법이 아니기 때문에 웬만하면 사용하지 말도록 하자!


Code Link

https://github.com/mike6321/PURE_JAVA/tree/master/EffectiveStudy

 

mike6321/PURE_JAVA

Contribute to mike6321/PURE_JAVA development by creating an account on GitHub.

github.com

References

https://woovictory.github.io/2019/07/31/Java-Static-Method-Override/

 

[Java] Static Method Overriding?!

Java에서 오버라이딩이란 기본적이면서 중요한 개념이다. 간략하게 말하면 부모 클래스의 메소드를 자식 클래스에서 재정의하여 사용하는 것이라고 할 수 있다. 그러면 여기서 의문이 하나 생기는데, static 메소드는 오버라이딩이 될까? 오버라이딩이 어떤 개념이라는 것은 알지만, 실제로 이런 경우를 생각해보니 대답을 하기 쉽지 않다. 대답을 하더라도 이유를 정

woovictory.github.io

 

'Java > Java' 카테고리의 다른 글

(JAVA) CallByValue & CallByReference  (0) 2020.05.17
(JAVA) Garbage Collector  (0) 2020.05.10
(JAVA) Method Overloading에 대해서  (0) 2020.04.07
(JAVA) Interning of String in JAVA  (0) 2020.04.02
(JAVA) static keyword in java  (0) 2020.03.04