메서드의 호출과 실행
- 프로그램이 메모리로 올라올 때 Data 영역과 Code 영역으로 나뉘게 된다.
- 이 때, Code 영역에는 method, 즉 instruction set이 저장된다.
- 인스턴스는 힙메모리에 따로 생성되고, instruction set은 처음 프로그램 로드시 한번만 로드된다.
- instruction set은 인스턴스마다 다른 기능을 제공하는 것이 아닌 동일한 기능을 제공한다.
- 달라지는 것은 메서드에 사용되는 스택에 저장된 멤버 변수와 힙에 저장된 인스턴스이다.
- 따라서 다른 인스턴스라도 메서드의 코드는 같으므로 같은 메서드를 호출한다.
- 함수가 호출이 되면 Code 영역에 저장된 instruction set를 찾아 호출한다.
- 함수의 이름은 주소로 변환되므로 같은 이름의 함수는 존재하지 않는다.
- overriding은 함수의 이름에 dummy parameter를 붙이는 방식으로 조금씩 바꿔서 구현한다.
예제 코드
TestMethod.java
public class TestMethod {
int num;
void aaa() { // 메서드
System.out.println("aaa() 호출");
}
public static void main(String[] args) {
TestMethod a1 = new TestMethod(); // 인스턴스 a1 생성
a1.aaa();
TestMethod a2 = new TestMethod(); // 인스턴스 a2 생성
a2.aaa();
}
}

가상 메서드의 원리
- 가상 메서드 테이블에 해당 메서드 이름이 가리키는 주소를 가지고 있음
- 재정의되지 않은 메서드의 경우 상위 클래스의 메서드의 주소를 가리킴
- 재정의된 메서드의 경우 하위 클래스 자신의 메서드의 주소를 가리킴
- 가상 메서드의 원리를 따르지 않는다면 Customer 타입인 vc는 Customer의 calcPrice 메서드가 불림
지금까지 배운 상속, 오버라이딩 등의 기능을 이용해 객체지향의 가장 큰 특징 중 하나인 다형성을 구현할 수 있다.
'Java' 카테고리의 다른 글
| [Java 객체지향] 다형성 (0) | 2022.01.31 |
|---|---|
| [Java 객체지향] 오버라이딩 (메서드 재정의) (0) | 2022.01.30 |
| [Java 객체지향] 상속에서 클래스의 생성과정과 형변환 (0) | 2022.01.30 |