• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

메서드 시그니쳐 관련 질문

24.06.11 11:20 작성 조회수 75

0

안녕하세요.

메서드 관련 질문입니다.

컴파일이 될 때 메서드 영역 > 클래스 영역 이 부분에 클래스의 관련 코드들이 다 들어가 있는 걸로 이해했는데 그러면 다음의 두 경우는 어떻게 이해하면 될까요 ? (두 경우 다 추상 클래스, 인터페이스에는 메서드의 바디가 작성되어 있지 않고 나중에 작성되는 경우) -> 메서드 영역의 클래스 영역에 처음에는 바디가 없으니 관련 정보가 전혀 없을 거 같은데 이와 같이 나중에 오버라이딩을 해주었을 때 메서드 영역의 클래스 영역에서 어떻게 되는지 궁금합니다. 새로운 클래스 영역에 메서드로 정의되는 부분이 아니라 기존에 클래스 영역에서 정의가 되어야 하는데 문제는 클래스 영역의 기존 메서드를 수정하자니 다음의 두 케이스는 해당 객체를 생성할 때에만 적용되는 일회성 코드라 ...

2.1 AbstractAnimal은 추상클래스로 sound()가 추상 메서드입니다.

AbstractAnimal animal = new AbstractAnimal() {

@Override public void sound() {

System.out.println("test");

}

};

2.2 InterfaceAnimal interface 입니다.

InterfaceAnimal interfaceAnimal = new InterfaceAnimal() {

@Override

public void sound() {

System.out.println("test");

}

@Override

public void move() {

System.out.println("test");

}

};

추상 메서드의 경우 메서드 시그니처만 메모리에 로드되었다 실행시점에 구체화 시킨 클래스에서 구현된 메서드가 메모리에 로드된다고 하셨는데 위의 예제를 보면 상속받아 메서드를 오버라이딩 한 것이 아니라 기존에 메서드 시그니처만 존재하는 클래스에서 일시적으로 구현한 방식입니다.

이럴 때에는 메모리 영역의 클래스 영역에서 어떤 로직이 수행되나요 ? (위의 예제처럼 실행될 때 익명객체 처럼 구현하여 객체 생성할 때)

답변 1

답변을 작성해보세요.

1

안녕하세요. 인프린님

익명 클래스의 경우에도 컴파일러가 컴파일 시점에 모두 체크해서 클래스를 만들게 됩니다.

컴파일러는 새로운 익명 클래스를 생성합니다. 이 익명 클래스는 AbstractAnimal 또는 InterfaceAnimal을 상속받아 필요한 메서드를 구현합니다.

컴파일러는 클래스 파일을 생성할 때 익명 클래스에 이름을 부여합니다. 예를 들어, AbstractAnimal$1.class 또는 InterfaceAnimal$1.class 같은 형식입니다.

따라서 이 경우도 일반적인 클래스, 인터페이스와 완전히 똑같은 방식으로 작동합니다.

컴파일러는 생각보다 똑똑합니다 🙂

감사합니다.

채널톡 아이콘