강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của pcappli8573
pcappli8573

câu hỏi đã được viết

CS Knowledge Essentials | Mạng lưới thiết kế mẫu Hệ điều hành Cơ sở dữ liệu Cấu trúc dữ liệu

Q. Overloading và Overriding là gì? ★★★

오버라이딩 관련하여 질문드립니다.

Đã giải quyết

Viết

·

34

0

안녕하세요.

강의 잘 듣고 있습니다.

오버라이딩 관련하여 질문드립니다.

class Parent {
    static void display() { System.out.println("부모의 static"); }
}

class Child extends Parent {
    static void display() { System.out.println("자식의 static"); }
}

public class MyClass {
  public static void main(String args[]) {
    Child c = new Child();
    c.display(); 
  }
}

만약 이렇게 하면 자식과 부모에서 오버라이딩이 가능한 것 같은데 이렇게 일반적으로 사용하지 않는지 궁금합니다.

 

감사합니다.

면접운영체제기술면접

Câu trả lời 2

0

kundol님의 프로필 이미지
kundol
Người chia sẻ kiến thức

안녕하세요 승환님 ㅎㅎ

static 메서드는 인스턴스 메서드와 달리 런타임이 아니라 컴파일 시점에 바인딩됩니다.

Java에서 우리가 말하는 메서드 오버라이딩의 핵심 효과는 런타임 다형성이기 때문에 런타임 다형성이 들어가야 올바르게 오버라이딩이 들어간 것입니다. 런타임에 JVM이 실제 객체 타입(Child)을 보고 메서드를 결정하는 것이죠.

 

승환님 코드를 보면 오버라이딩인 것 같지만 다형성이 결여된 컴파일 시점에 이미 child로 결정된 바인딩에 불과합니다.

여기서 다형성이란 하나의 인터페이스(또는 부모 타입)로 여러 다른 객체를 동일하게 다루면서, 실제 동작은 객체 타입에 따라 달라지는 특성입니다.

 

class Parent {
    static void display() { System.out.println("parent static"); }
}

class Child extends Parent {
    static void display() { System.out.println("child static"); }
}
class Parent2 {
    void display() {
        System.out.println("parent method");
    }
}

class Child2 extends Parent2 {
    @Override
    void display() {
        System.out.println("child method");
    }
}

class Main {
    public static void main(String[] args) {
    Parent c = new Child();
    c.display(); 
    
    Parent2 p = new Child2();
    p.display();
    }
}

출력:

parent static

child method

 

지금 Child의 경우 참조변수 타입이 Parent이기 때문에 Parent.display()가 호출됩니다

 

Child2의 경우 올바른 오버라이딩 이기 때문에 parent2로 정의했지만 child로 나옵니다.

즉 부모 타입의 참조변수로 자식 객체를 가리켜도, 실제 실행은 자식의 메서드가 선택되는 것이 다형성입니다

 


 

또 질문 있으시면 언제든지 질문 부탁드립니다.

좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.


0

안녕하세요, 인프런 AI 인턴입니다. 박승한님 😊

오버라이딩과 관련하여 질문해 주신 부분에 대해 답변드리겠습니다.

static 메서드와 오버라이딩

Java에서 static 메서드는 특정 클래스에 속하며, 인스턴스가 아닌 클래스 자체에서 호출됩니다. 이는 오버라이딩과는 조금 다른 개념이므로, 정확히 말하면 static 메서드는 오버라이딩되지 않고, 재정의 (Shadowing) 된다고 할 수 있습니다.

코드 설명

  • static 메서드 displayChild 클래스에 의해 재정의됩니다. 그러나 이를 일반적인 오버라이딩이라고 하지 않습니다.
  • Child 객체를 사용해 c.display()를 호출하면, Child 클래스의 display 메서드가 호출됩니다. 이는 Child에 있는 static 메서드가 사용되기 때문입니다.
  • static 메서드는 객체의 인스턴스가 아닌 클래스의 소속된 메서드이기 때문에 다형성을 지원하지 않고, 이를 통해 상속에서 메서드를 가리는 형태의 재정의가 일어납니다.

이 동작 때문에 static 메서드가 클래스의 메서드를 가리는 형태의 재정의는 가능하지만, 일반적으로 오버라이딩이라고 하지는 않습니다. static 메서드는 주로 공통적으로 사용할 목적을 위해 클래스 레벨에서 정의되며, 이러한 방식은 오버라이딩 목적이 아닌, 재정의하려는 곳의 코드를 명확하게 하거나 필요에 따라 사용할 수 있습니다.

유사한 질문과 답변에 대한 참고 링크:
- 교안 98P 질문: C++에서 오버로딩과 오버라이딩에 대한 차이를 이해하는 데 도움이 될 수 있는 질문입니다.

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

Hình ảnh hồ sơ của pcappli8573
pcappli8573

câu hỏi đã được viết

Đặt câu hỏi