작성
·
148
0
안녕하세요.
메서드 관련 질문입니다.
메서드는 공통된 기능이기 때문에 인스턴스 변수처럼 내부에 가지고 있지는 않고 메서드 영역에 있는 걸 필요할 때(호출할 때) 가져와서 쓴다.
이것과 관련하여 질문 3가지 문의 드립니다.
1. 각각의 객체에는 필드값만 가지고 있고 메서드는 아예 가지고 있지 않은거죠 ?
2. 컴파일이 될 때 메서드 영역 > 클래스 영역 이 부분에 클래스의 관련 코드들이 다 들어가 있는 걸로 이해했는데 그러면 다음의 두 경우는 어떻게 이해하면 될까요 ? (두 경우 다 추상 클래스, 인터페이스에는 메서드의 바디가 작성되어 있지 않고 나중에 작성되는 경우) -> 메서드 영역의 클래스 영역에 처음에는 바디가 없으니 관련 정보가 전혀 없을 거 같은데 이와 같이 나중에 오버라이딩을 해주었을 때 메서드 영역의 클래스 영역에서 어떻게 되는지 궁금합니다. 새로운 클래스 영역에 메서드로 정의되는 부분이 아니라 기존에 클래스 영역에서 정의가 되어야 하는데 문제는 클래스 영역의 기존 메서드를 수정하자니 다음의 두 케이스는 해당 객체를 생성할 때에만 적용되는 일회성 코드라 ...
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
0
안녕하세요, 인프런 AI 인턴입니다.
질문에 대한 답변은 다음과 같습니다.
네, 맞습니다. 각 객체는 고유의 상태를 나타내는 필드 값을 가지고 있으며, 메서드는 클래스가 공유하는 행동 또는 로직을 정의합니다. 따라서, 메서드는 메서드 영역에 위치하고, 객체는 각자의 필드 값만을 가집니다.
추상 클래스나 인터페이스에서 메서드는 실제 구현이 없이 선언만 있습니다. 이러한 메서드들은 인스턴스화 될 때가 아니라, 서브 클래스에서 구현(오버라이드)될 때 메서드 영역의 클래스 영역에 구현 내용이 저장됩니다. 즉, 컴파일 시점에서 추상 메서드나 인터페이스의 메서드는 구현 내용 없이 메서드 시그니처만 메모리에 로드되고, 실행 시점에 구체 클래스에서 구현된 메서드가 메모리에 로드됩니다. 따라서, 위의 2.1과 2.2 예제에서 익명 내부 클래스로 구현한 메서드들은 해당 객체의 타입에 따라 메모리에 로드되어 실행됩니다.
핵심은, 메서드 영역에서 클래스 정보는 타입별로 관리되며, 실행 시점에 오버라이딩된 메서드가 호출되어 해당 구현이 수행된다는 것입니다. 이는 자바의 다형성 원리와 동적 바인딩에 기반한 동작으로, 추상 메서드나 인터페이스 메서드가 나중에 구현될 때 실제 호출되는 메서드의 버전을 결정합니다.
메서드 시그니처만 메모리에 로드되었다 실행시점에 구체화 시킨 클래스에서 구현된 메서드가 메모리에 로드된다고 하셨는데 위의 예제를 보면 상속받아 메서드를 오버라이딩 한 것이 아니라 기존에 메서드 시그니처만 존재하는 클래스에서 일시적으로 구현한 방식입니다.
이럴 때에는 메모리 영역의 클래스 영역에서 어떤 로직이 수행되나요 ? (위의 예제처럼 실행될 때 익명객체 처럼 구현하여 객체 생성할 때)