Java의 모든 Method는 Virtual Method다?

LSM ·2022년 2월 25일
0

1. 배경지식

Java의 Virtual Method를 알아보기 전 먼저 메모리 구조를 이해 할 필요가 있다.

사진 출처 : https://sfixer.tistory.com/entry/메모리-영역code-data-stack-heap

컴파일 언어에서 프로그램이 메모리에 적재되는 경우 대부분 위와 같은 구조로 적재가 될것이다.

하나하나 간략하게 보자면,

  • Stack 영역 : 프로그램의 함수 호출 시 생성되고, 함수 종료 시 사라지는 지역변수, 매개변수 및 리턴 값이 저장되는 영역이다. 스택 사이즈는 각 프로세스마다 할당 되고 프로세스가 메모리에 로드 될때 스택 사이즈는 고정 된다. 메모리의 최 상단에서 스택 처럼 쌓이는 구조이며 함수 종료시 현재 위치를 가르키는 PC register의 위치가 조정된다! (컴파일 타임 결정)
  • Heap 영역 : 동적 데이터 영역으로 C언어의 경우 malloc으로 생성된 자료형들이 저장되는 장소이고, Java의 경우 new 로 생성한 인스턴스의 변수가 저장되는 영역이다. 흔히 힙 영역이 가득 차면 OutOfMemoryError가 발생한다고 하며 스택 영역에 비해 액세스 속도가 조금 느린편이다. 스택 영역과 달리 메모리 해제가 자동으로 되지 않으며 이를 효율적으로 관리하기 위해 Java에서는 Garbage Collection(GC)이 있다. Thread-safe 하지 않기 때문에 적절히 synchronizing 해야한다 (런타임 결정)

  • Data 영역, Static영역이라고도 불린다. : 이 영역에서는 전역변수(global), 정적변수(static), 배열(array), 구조체(structure) 등이 저장된다.
    초기화 된 변수는 Data 영역이고, 아닌 변수는 bss 영역에 저장된다. 프로그램의 실행시 생성되고, 종료시 반환된다.

  • Code 영역 : 컴파일로 된 .class 코드 영역 (= 클래스/ 코드 /메서드 영역)이라고 부르며 0과 1로 된 2진수 (binary) 영역이다. 실행할 프로그램의 코드가 저장되는 영역으로 CPU는 코드영역에 저장된 명령어를 하나씩 가져가서 처리한다. 함수, 제어문, 상수 등이 지정된다.

2. Virtual Method

자 여기까지 보았다면, 위 메모리 구조에 대해서는 어느정도 이해했다고 생각한다. 그럼 이제 본론으로 들어가겠다.

메서드는 어떻게 호출되고 실행되는가?

먼저 메서드(함수)의 이름은 주소값을 나타낸다!

메서드는 명령어의 집합이고 프로그램이 로드되면 CODE 영역에 명령어 집합이 이진파일로 위치하게 된다.

해당 메서드가 호출 되면 명령어 집합이 있는 주소를 찾아 명령어가 실행된다!

이때 메서드에서 사용하는 변수들은 스택 메모리에 위치 하게된다. 반면 다른 인스턴스라도 같은 메서드의 코드는 같으므로 같은 메서드가 호출된다.

인스턴스가 생성되면 변수는 힙 메모리에 따로 생성되지만, 메서드 명령어 집합은 처음 한번만 로드 된다. 위에서 말했듯이 인스턴스마다 변수만 달라지지 메스드 구조는 같기 때문이다!!

사진 출처 : 한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지 Online. Java ch3-5

가상 메서드란?

가상 메서드 (Virtual Method) : 메서드의 이름과 메서드 주소를 가진 가상 메서드 테이블에서 호출될 메서드의 주소를 참조함

이렇게 들으면 무슨 소리지?? 라고 느낄 수있다고 생각한다.

아래 그림을 보고 이해해보자!

VIP Customer은 Customer을 extends 한 객체이다. 따라서 재정의 되지 않은 상속받은 함수는 Customer의 메서드 주소와 동일하다. 하지만 상속 후 override 한 경우에는 이름은 같지만 다른 메서드 영역을 가르키게 된다! 이러한 메서드와 메서드의 주소 (in Code영역) 를 유지하고 있는 것이 가상 메서드 테이블이다.

추가로 Java의 모든 메서드는 가상 메서드이다!!


참고자료

한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지 Online. Java ch3-5 을 기반으로 작성한 게시물입니다

profile
개발 및 취준 일지

0개의 댓글