인프런 커뮤니티 질문&답변
메서드 오버라이드
해결된 질문
작성
·
47
답변 2
0
주말코딩
지식공유자
안녕하세요,
네 순수 부모인 경우 부모 필드만 보셔야 합니다.
자식 것으로 되어있으면 인스턴스 메서드 같은 경우 자식 메서드를 실행해야 합니다.
부모에서 static인 경우에는 상속되지 않기 때문에 앞에 타입이 Parent이면 하이딩 처리가 되어 부모 것을 실행하셔야 합니다.
public class Main {
public static void main(String[] args) {
Parent ref = new Child();
System.out.println(ref.x(2) + ref.id());
}
}
class Parent {
public int x(int i) {
return i + 3;
}
public static String id() {
return "P";
}
}
class Child extends Parent {
public int x(int i) {
return i + 2;
}
public static String id() {
return "C";
}
}
출력문: 4P
0
안녕하세요, 인프런 AI 인턴입니다. jongbin7245님.
자바에서 메서드 오버라이딩(Overriding)과 관련하여 혼란스러울 수 있는 부분에 대한 설명을 드리겠습니다.
메서드 오버라이딩
- 오버라이딩은 자식 클래스에서 부모 클래스의 메서드를 재정의하는 것입니다. 이때, 실제 객체의 타입에 따라 오버라이딩된 메서드가 실행됩니다.
- 즉,
Parent ref = new 자식();구조일 경우,ref가 자식 객체를 참조하고 있으므로, 자식 클래스의 오버라이딩된 메서드가 실행됩니다.
정적 메서드 및 변수
- 정적(static) 메서드와 정적 변수는 클래스 소속이므로, 오버라이딩이라는 개념이 적용되지 않습니다. 따라서 참조 타입의 클래스에 정의된 메서드나 변수가 호출됩니다.
- 만약
Parent ref = new 자식();인 상황에서 정적 메서드나 변수를 호출하면, 부모 클래스의 것이 호출됩니다.
관련 예시
class Parent {
static int x = 2;
int y = 3;
static void printStatic() {
System.out.println("Parent static method");
}
void print() {
System.out.println("Parent instance method");
}
}
class Child extends Parent {
static int x = 4;
int y = 5;
static void printStatic() {
System.out.println("Child static method");
}
@Override
void print() {
System.out.println("Child instance method");
}
}
public class Test {
public static void main(String[] args) {
Parent ref = new Child();
// 정적 변수와 메서드
System.out.println(ref.x); // 2 출력
ref.printStatic(); // "Parent static method" 출력
// 인스턴스 메서드
ref.print(); // "Child instance method" 출력
}
}
여기서 보듯이, ref.print();는 “Child instance method”를 출력하지만, 정적 변수나 메서드는 Parent 클래스의 것이 호출됩니다.
자바의 이 특성은 객체 지향 프로그래밍에서 다형성을 구현하는 데 중요한 요소입니다. 필요에 따라 인스턴스 변수와 정적 변수/메서드의 동작 차이를 염두에 두시길 바랍니다.
관련 토론이나 추가 설명이 필요하다면, 다음 링크들을 참고해 보시면 도움이 될 것입니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.




