해결된 질문
작성
·
78
0
18:41
유형 8에서는 업캐스팅 형태일때, 메소드를
부모: static void display()
자식: static void display()
위와 같이 선언하여야 하며, 부모 메소드에서 static을 없애면 에러가 난다고 하셨습니다.
그렇다면 만약,
유형 9와 같이 업캐스팅 형태가 아니고,
Child obj = new Child(); 로 인스턴스를 생성하였는데,
부모: static void display()
자식: void display()
와 같은 형태로 메소드가 구성되어 있다면
obj.display()를 했을때, 에러가 발생하나요?
자식에도 static이 있어야지 상속이 가능하다는 부분이 업캐스팅일때만 적용되는건지, 업캐스팅이 아니어도 동일하게 적용되는건지 궁금합니다.
답변 2
1
네 오류 발생합니다. 아래와 같이 말씀하시는 것이죠?
public class TestInheritance {
public static void main(String[] args) {
Child obj = new Child();
obj.display();
}
}
class Parent {
static void display() {
System.out.println("Parent display");
}
}
class Child extends Parent {
void display() {
super.display();
System.out.println("Child display");
}
}
정적 메서드는 클래스 자체로 사용하는 것이고, 인스턴스 메서드는 해당 객체가 사용하는 메서드입니다.
정적 메서드를 상속 받았는데 인스턴스 메서드처럼 사용하면 오류 발생합니다.
출력문:
ERROR!
/tmp/VyVZtZAfH2/Main.java:16: error: display() in Child cannot override display() in Parent
void display() {
^
overridden method is static
1 error
ERROR!
error: compilation failed
-1
안녕하세요, 인프런 AI 인턴입니다. 주무세요님.
말씀하신 내용은 Java의 메서드 오버로딩 및 오버라이딩과 관련된 중요한 개념들입니다. Java에서 static
메서드와 인스턴스 메서드의 차이점에 대해 설명드리겠습니다.
업캐스팅에서의 메서드 접근:
static
메서드와 인스턴스 메서드는 다르게 동작합니다. static
메서드는 참조 타입에 따라 호출되며, 실제 객체에 의해 결정되지 않습니다. 따라서 static
메서드가 업캐스팅 시 오버라이딩되는 것이 아니라 숨김(hiding)이 발생합니다.Child obj = new Child();의 경우:
void display()
처럼 인스턴스 메서드로 정의하고, 부모 클래스에는 static void display()
로 정의되었다면, obj.display()
를 호출 시 에러가 발생하지 않습니다.static
메서드는 오버라이딩이 되지 않으며, 자식의 인스턴스 메서드를 호출하게 됩니다.따라서, 업캐스팅 여부에 관계없이 static 함수는 상속되는 것이 아니라 메서드 숨김이 발생하며, 각자의 Invoking class 타입에 따라 호출됩니다.
관련된 더 깊이 있는 설명을 확인하고 싶으시다면 아래의 유사한 기존 답변을 참고하시길 바랍니다:
이해가 되셨길 바라며, 질문에 대한 궁금증이 풀리셨기를 바랍니다. 저 역시 질문자님의 이해를 돕기 위해 최선을 다하고 있으며, 현재 베타 기능으로 인해 다소 부족함이 있을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면 언제든지 질문해 주세요. 지식공유자께서 빠르게 답변을 드릴 것입니다.
위의 AI 답변에서는 에러가 발생하지 않고 실행 가능하다고 되어 있어서, 그렇게 이해하고 넘어갈 뻔했습니다.
하마터면 잘못 이해하고 넘어갈 뻔했네요.
끝까지 답변 잘 달아주셔서 감사드립니다.