[Java 객체지향] 메서드의 재정의와 가상 메서드 원리

2022. 1. 31. 10:56·Java

메서드의 호출과 실행

  • 프로그램이 메모리로 올라올 때 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
'Java' 카테고리의 다른 글
  • [Java 객체지향] 다운 캐스팅과 instanceof
  • [Java 객체지향] 다형성
  • [Java 객체지향] 오버라이딩 (메서드 재정의)
  • [Java 객체지향] 상속에서 클래스의 생성과정과 형변환
suaring
suaring
개발 공부 로그
  • suaring
    Sue's devlog
    suaring
  • 전체
    오늘
    어제
    • 분류 전체보기 (123)
      • Algorithm (2)
      • WEB (8)
      • Spring (26)
      • Java (83)
      • Kotlin (1)
      • Database (1)
      • Infra (0)
      • Git (1)
      • devlog (1)
  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
suaring
[Java 객체지향] 메서드의 재정의와 가상 메서드 원리
상단으로

티스토리툴바