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

Toughie님의 프로필 이미지
Toughie

작성한 질문수

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

인터페이스 객체 생성

작성

·

368

0

안녕하세요!
인터페이스와 메모리 구조에 관련된 질문이 있습니다.

강의를 통해서 인터페이스를 구현한 클래스의 객체를 생성하면
힙에는 인터페이스 객체(x001), 클래스 객체(x002)가 함께 생성된다고 이해했습니다.
(x000<시작 주소>이라는 공간 안에 x001과 x002가 함께 있는 형태)


상속의 경우, 부모 클래스 객체와 자식 클래스 객체가 같은 공간에 생성된다는 것이 명확히 이해가 되는데
인터페이스의 객체가 생성된다는 것이 정확한 표현인 것인지, 설명을 위한 개념인지 궁금합니다.

인터페이스는 인스턴스 멤버가 없는 추상메서드만 존재하기에 인스턴스화 된다는 거 자체가 이해가 안돼서요..
혹시 가상 메서드 테이블이 존재하는 메모리 공간이 형성되는데 이것을 인터페이스 객체라고 표현하신 걸까요?

그렇다면 참조변수를
인터페이스 타입으로 했을 때는 인터페이스 메서드테이블을 먼저 확인하고,
오버라이딩 된 클래스의 메서드를 호출하며

참조변수를 클래스 타입으로 했을 때는
해당 클레스의 메서드 테이블을 바로 확인하고 클래스의 오버라이딩 된 멤버 메서드를 호출한다.

위와 같은 이해가 맞는 것인지 궁금합니다.
감사합니다.

답변 2

2

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

안녕하세요. Toughie님

인터페이스는 개념상 존재하는 것이고 별도의 인터페이스 객체가 생성되는 것은 아닙니다 🙂

이 부분은 사실 일반 클래스의 메서드도 동일합니다. 메서드의 경우에도 실제 힙 영역에 생성되는 것은 아닙니다. 메서드의 실제 정보들은 메서드 영역에 존재합니다.

실제로 객체를 생성하면 객체의 필드 데이터와 메타데이터라는 부분이 생성됩니다. 이 메타데이터 안에는 객체가 어떤 클래스의 인스턴스인지에 대한 정보를 포함합니다. 이 정보를 사용해서 내가 어떤 클래스의 객체이고, 또 상위 인터페이스는 어떤 것이 있는지를 인지할 수 있습니다 .

감사합니다.

Toughie님의 프로필 이미지
Toughie
질문자

메타데이터의 개념이 있었군요!

 

인터페이스를 구현한 클래스 인스턴스가생성되면 힙에는

 

어떤 클래스의 인스턴스인지,

어떤 인터페이스를 구현했는지 등에

대한 1. 메타데이터/

 

메소드 영역과 매핑되는

포인터들의 모임인 2. 가상메서드 테이블,

 

멤버변수들이 생성되는

  1. 필드데이터

이 정도로 이해하면 괜찮을까요?

객체생성 부분은 사실 이것보다 더 복잡하겠지만 하나씩 알아가는 재미가 있네요😀

 

답변 감사드립니다!

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

안녕하세요. Toughie님

참고로 가상 테이블에 대한 정보는 힙 영역에 존재하지 않습니다.

왜냐하면 이런 정보를 각각의 인스턴스 마다 모두 가지고 있을 필요는 없기 때문입니다.

이런 정보는 메서드 영역에 생성됩니다. 클래스의 각 인스턴스는 자신이 속한 클래스의 가상 메서드 테이블을 참조한다 정도로 생각하시면 됩니다.

감사합니다.

0

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

Toughie님의 질문은 인터페이스와 메모리 구조 및 가상 메서드 테이블의 동작 원리에 대한 것으로 이해됩니다. 인터페이스를 통한 객체 생성과 관련하여 인터페이스 자체가 메모리 상에 실제로 인스턴스화되는 것은 아닙니다. 대신, 인터페이스를 구현하는 구체 클래스의 인스턴스가 생성될 때 해당 클래스의 타입으로 메모리에 할당됩니다.

인터페이스는 메서드의 시그니처(이름, 파라미터 타입 및 순서 등)만을 정의하며, 구현 내용은 갖지 않습니다. 따라서, 인터페이스 타입의 참조 변수는 구현 클래스의 인스턴스를 참조할 수 있지만, 인터페이스 자체로는 구현된 메서드의 몸체(body)를 갖지 않기 때문에 인스턴스화될 수 없습니다.

Java의 가상 메서드 테이블(vtable)은 객체의 메서드 호출을 동적으로 결정하는 데 사용됩니다. 클래스가 인터페이스를 구현할 경우, 해당 클래스의 가상 메서드 테이블에는 인터페이스의 메서드 시그니처와 구현 클래스에서 오버라이딩한 메서드의 주소가 매핑됩니다. 이를 통해 인터페이스 타입의 참조 변수로 구현 클래스의 메서드를 호출할 때, 실제 호출해야 할 메서드로 동적 바인딩이 가능합니다.

Toughie님의 이해는 크게 맞으며, 추가적으로 명확히 설명드리자면, 인터페이스 타입의 참조 변수를 사용할 때와 클래스 타입의 참조 변수를 사용할 때 메서드를 찾는 과정은 비슷합니다. 다만, 인터페이스 타입 참조변수는 해당 인터페이스를 구현한 클래스의 인스턴스를 참조할 수 있고, 이 인스턴스의 실제 타입에 따라 호출되는 메서드가 결정됩니다.

비슷한 주제로 이전에도 질문이 있었습니다. 아래 링크에서 답변된 내용을 참고하시면 좋을 것 같습니다:

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

Toughie님의 프로필 이미지
Toughie

작성한 질문수

질문하기