백엔드/Java

오버라이딩(Override)

삐삐에스 2024. 7. 4. 16:57

상속은 부모가 가진 것을 물려받아 그대로 사용하거나 추가하여 사용할 수 있는 것이다.

"추가"에 포커싱을 해서 오버라이딩에 대해 살펴보자.

 

아래 코드는 Phone이라는 클래스이다. 이 클래스를 살펴보면 printLogo()라는 메소드가 있는 것을 확인할 수 있다. 

public class Phone {
    // 필드
    private String brand;

    // 메소드
    void printLogo() {
        if (this.brand == "Samsung") {
            System.out.println("*** " + brand + " ***");
        } else {
            System.out.println("@@@ " + brand + " @@@");
        }
    }
}

 

 

나는 이 클래스를 상속받는 Galaxy라는 자식 클래스를 만들 것이다.

public class Galaxy extends Phone{
    public Galaxy() {
        super("Samsung");
    }

    private void printLogo() { // 여기서 에러남
        System.out.println("Galaxy Logo");
    }
}

 

위 코드를 보면 printLogo()라는 부모 클래스의 메소드를 오버라이딩하고 있다.

 

여기서 오버라이딩에 대해 간략히 설명하자면, 오버라이딩은 상속 관계에서 쓰이는 개념으로 메소드 이름, 매개 변수, 리턴 타입이 같고 구현부를 다르게 하여 메소드를 정의하는 것을 말한다.

 


 

 

그런데 주석으로 달아놨다시피 private void printLogo()에서 에러가 난다.

 

에러를 보면 "weaker access privileges('private')을 할당하려고 시도하고 있다." 라는 내용이다.

맨 앞에서 상속에 대해 설명한 내용을 보면 "그대로 사용하거나, 추가하여 사용하는..." 이라고 했는데, 여기에 힌트가 있다!

접근 제어의 관점에서도 확장은 가능하지만 감소는 안된다는 뜻이다.

 

다시 코드로 돌아가서 보면, Phone 클래스에서는 printLogo()가 default의 접근제어자를 갖고 있다.

그런데 Phone 클래스를 상속받은 Galaxy 클래스에서는 printLogo()가 더 좁은 개념인 private의 접근제어자를 갖고 있다.

 

즉, 자식 클래스에서 부모 클래스에 있는 메소드를 오버라이딩할 때에는 접근 제어자 확장(더 넓은 접근제어자를 사용하는 것)은 가능하지만 접근 제어 범위를 줄이는 것은 불가하다!!!

 

 


오버라이딩에 있어서 접근 제어자에도 제한이 있다는 것을 처음 알게되었다. Java를 꽤 많이 알고 있다고 생각했는데 생각보다 무지한 상태라는걸 뼈저리게 느끼는 중이다.. 더 열심히 공부해야겠다!

반응형