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

생각하는자님의 프로필 이미지
생각하는자

작성한 질문수

김영한의 실전 자바 - 기본편

클래스와 인터페이스 활용

메모리 구조(인터페이스는 정확히 어느 시점에 호출 되는지?)

해결된 질문

작성

·

413

0

 학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.


1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
안녕하세요. 공부를 하면서 상속된 클래스랑 인터페이스가 있는 경우 어떻게 메모리상 에서 어떻게 될까?라고 생각하다가 답이 안 나와서 질문을 드립니다.

poly.ex6 예제 에서 추상 클래스 및 인터페이스 클래스를 만들었습니다.

근데 메모리상에
이 그림처럼 만들어 진다고 하였는데

Bird 를 만들었을때 인터페이스Fly 가 어느때 호출이 되고 호출이 종료되는지 를 자세히 모르겟더라고요.

그래서
Bird ,AbstractAnimal 생성자에 soutm을 찍고 하였지만,
이렇게 만 나오지. Fly는 인터페이스라 body를 못 만드니 soutm도 못 만들고 알 수 있는 방법이 없더군요. 이럴 경우 어떻게 Fly 인터페이스가 언제 호출이 되는지 알고 싶습니다.
예상으로는

Bird 호출 -> AbstractAnimal 호출 -> AbstractAnimal 종료 -> Fly 호출 -> Fly 종료 -> Bird 종료 라고 생각하기는 했습니다.(extend를 먼저 쓰니까 부모가 먼저 호출되고 implements 에서 맨 앞에 있는것부터 순차적으로 호출 종료 된다고 생각했습니다.)

답변 부탁드립니다.

답변 2

2

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 생각하는자님

인터페이스는 개념상 존재하는 것이지 실제로 호출이 될 수는 없습니다.

추상 클래스의 추상 메서드도 개념상 존재하는 것이지 실제로 호출이 될 수는 없습니다.

우리가 추상 메서드를 호출하는 순간 자바는 실제 오버라이딩 된 구현 메서드를 찾아서 호출하게 됩니다.

감사합니다.

이 질문을 통해서 저가 얼마나 인터페이스에 대해서 몰랐다는 것을 드러내는 사건(계기)가 되었네여. 당연한 것을 질문 드려서 죄송합니다.

0

안녕하세요, 인프런 AI 인턴입니다.
생각하는자님의 질문에 답변 드리겠습니다.

인터페이스의 메소드는 구현한 클래스의 객체가 생성될 때 메모리에 할당되는 것이 아니라, 인터페이스 자체는 메소드의 시그니처를 가지고 있기 때문에 호출 시점은 구현한 클래스의 객체를 통해 해당 인터페이스 메소드가 호출되는 시점입니다.

예를 들어, Fly 인터페이스를 구현한 Bird 클래스의 객체가 생성될 때, Bird 클래스에 구현된 fly() 메소드가 메모리에 할당됩니다. 그러므로, Fly 인터페이스의 fly() 메소드는 직접적으로 메모리에 로드되지 않습니다. 대신, Fly 인터페이스를 구현하고 있는 Bird 객체를 통해 fly() 메소드가 호출될 때 구현된 내용이 실행됩니다.

일반적으로 객체 생성 과정에서는 생성자 호출 순서가 부모 클래스의 생성자부터 시작되므로, Bird 객체를 생성할 때 AbstractAnimal의 생성자가 먼저 호출되고, 그 다음에 Bird 클래스의 생성자가 호출됩니다. 그 후 객체의 생성이 완료된 후에 Bird 객체의 fly() 메소드를 호출하면 Fly 인터페이스에 정의된 fly() 메소드가 호출된 것으로 간주됩니다.

결론적으로, 인터페이스는 호출이 되고 종료되는 특정 시점이라기보다는 구현한 클래스의 메소드가 호출될 때 그 행동이 실행되는 것으로 이해하시면 됩니다. 따라서 Bird 객체의 fly() 메소드가 호출되는 시점이 인터페이스 Flyfly()가 호출되는 시점입니다.

질문에 답변이 되었기를 바라며, 추가적인 궁금증이 있으시다면 언제든지 질문해 주시기 바랍니다.

메소드의 시그니쳐가 뭔가요? 처음 들어서 감이 안 잡히는데, 저가 구글에 검색해서 알아 본 바로는(저의 지식의 한계) 메서드를 판별 하는 기능? 이라고 생각을 하게 되는데, 정확한 답변 부탁 드립니다.(그리고 이 답변을 보시는 여러 분들에게 죄송합니다... 답변이 늦게 달리는것을 보고 내가 어려운 질문을 했나.. 라는 생각이 들었고, 이것 때문에 중급 강의가 늦어 지는거 아닌가..라는 생각을 하게 되네요)

생각하는자님의 프로필 이미지
생각하는자

작성한 질문수

질문하기