인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

주무세요님의 프로필 이미지
주무세요

작성한 질문수

(2025) 일주일만에 합격하는 정보처리기사 실기

Hiding (정적 메서드가 중복일 때는?)

정적 메서드가 자식 클래스에만 있는 경우

해결된 질문

작성

·

53

0

예시 코드에서 static void print()가 부모 클래스에 없고 자식 클래스에만 있다면,

하이딩이 일어나지 않고 자식 클래스에 있는 static void print()를 출력하나요?

답변 3

0

네가지 질문이 있습니다.

  1. 예시 코드에서 static이 세번 나오는데 써놓으신 ”앞에 static이 붙은 메서드는 변수명 앞의 타입을 따라간다! (P myVar에서 P를 말함)“ 이 문장에서 앞?이 세 부분중에 어느부분을 말씀하시는건지 헷갈려요,,

  2. 그리고 첫번째 class P에 있는 static이 지워지면 다시 Child가 출력되는지.

  3. 또는 마지막 Main에 있는 static이 지워지면 어떤값이 출력되는지...?(출력결과에는 딱히 상관없는지)

  4. class C에 있는 static이 지워지면 이럴때는 여전히 Parent가 출력되는게 맞나요??

제가 어설프게 이해한거같아서 질문드립니다...!

주말코딩님의 프로필 이미지
주말코딩
지식공유자

1 - 앞이란 메서드 호출시 사용된 변수의 선언부에 적힌 타입입니다.
P myVar = new C(); 여기에서는 P입니다.

 

2 - class P의 print()에서 static을 제거하면 한 쪽만 static이 붙어있을 때 말씀이시죠? 그러면 컴파일 오류가 발생합니다. 코드가 제대로 실행되지 않습니다.

 

3 - main 함수에 대해서는 시험에서 다루지 않습니다. 신경쓰지 않으셔도 됩니다. 하지만 답변을 드리자면 main 함수에서는 static이 없으면 프로그램의 시작점을 못 찾아서 오류 발생합니다.

 

4 - Class C에서 static을 없애면 인스턴스 메서드로 바꾼다는 말씀이신데, 이 경우에도 오류가 발생합니다. 재정의하려는 것은 정적 메서드인데, 인스턴스 메서드로 재정의하려고 하기 때문입니다.

 

 

0

주말코딩님의 프로필 이미지
주말코딩
지식공유자

안녕하세요,

 

혹시 이 경우를 말씀하시는 걸까요?

class P {
    // public static void print() 제거됨
}

class C extends P {
    public static void print() {
        System.out.print("Child");
    }
}

public class Main {
    public static void main(String[] args) {
        P myVar = new C();
        myVar.print(); // 오류 발생!
    }
}

 

이 경우에는 아예 P에 print()라는 메서드가 없어서 코드 자체가 동작하지 않습니다.

(변수 myVarP 타입이므로, myVar.print()를 호출하려면 P 클래스에 해당 메서드가 있어야 함.)

 

혹시 다른 예시인 경우 대댓글로 말씀 부탁드립니다.

주무세요님의 프로필 이미지
주무세요
질문자

답변 감사드립니다

혹시

P myVar = new C();

가 아닌

C myVar = new C();
myVar.print();

라면, C 클래스에 있는 print가 에러 없이 작동할까요?

0

안녕하세요, 인프런 AI 인턴입니다. 주무세요님.

질문하신 내용인 자바에서의 정적 메서드(static method) 상속에 대해 설명드리겠습니다. 자바에서는 클래스 상속 시 일반 메서드와 정적 메서드의 동작 방식이 다소 다릅니다.

정적 메서드의 상속 특성

  1. 하이딩(메서드 가리기):

    • 정적 메서드는 클래스 레벨에서 호출되며, 객체 인스턴스와 관련이 없습니다. 만약 자식 클래스에 부모 클래스와 동일한 이름의 정적 메서드가 정의될 경우, 이는 하이딩이라고 불리며, 자식 클래스의 메서드가 호출됩니다.
  2. 자식 클래스에만 있는 경우:

    • 만약 부모 클래스에는 없고 자식 클래스에만 해당 정적 메서드가 정의되어 있다면, 그 메서드는 자식 클래스의 메서드로만 존재하며, 자식 클래스의 이름으로 직접 호출될 수 있습니다.

결론적으로, 자식 클래스에만 존재하는 정적 메서드는 하이딩과 관련 없이 자식 클래스에서만 호출 가능하며, 부모 클래스를 통해 접근하는 경우는 없습니다.

다음의 유사한 질답을 통해 추가적인 이해를 돕고자 관련 정보를 제공하니 확인해주시기 바랍니다:

이 링크에서는 자바의 상속 메커니즘에 대해 자세히 설명하고 있으며, 어떤 경우에 부모 클래스와 자식 클래스에서 동작하는지 다룹니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

주무세요님의 프로필 이미지
주무세요

작성한 질문수

질문하기