작성
·
117
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
같은 형식입니다.
따라서 이 경우도 일반적인 클래스, 인터페이스와 완전히 똑같은 방식으로 작동합니다.
컴파일러는 생각보다 똑똑합니다 🙂
감사합니다.