컴퓨터공학 💻 도서관📚
Part2. 3-5 메서드 재정의와 가상 메서드 원리 본문
코드의 변수나 함수들이 메모리에 올라가게 되면 크게 두 가지 영역으로 나뉘는데
1. Code 영역과 2. Data영역(상수 영역, 스태틱 영역) 이다.
Code영역에는 프로그램의 함수, 메서드들이 들어가게 된다.
함수에 구현되어 있는 기능, instruction(명령어)들은 인스턴스마다 다르지 않다
인스턴스마다 다른 것은 변수이다 (변수의 종류, 변수의 값)
변수는 지역변수인 경우 stack 메모리에, 인스턴스 변수인 경우 heap 메모리에 잡힌다.
함수의 이름은 일종의 주소이다.
그래서 함수 이름은 원래 같으면 안 되는데, 왜 오버로딩이 가능하냐면
함수 이름에 더미 파라미터(매개변수)를 좀 붙여서 함수 이름을 조금씩 바꾼다.
사실은 같은 이름의 함수는 없다
함수가 사용하는 메모리 영역은 인스턴스마다 따로 생기지는 않는다는 것을 기억하자
인스턴스마다 따로 생기거나 함수 호출 때마다 따로 생기는 메모리 영역은 변수가 사용하는 영역이다.
변수가 쓰는 영역과 / 함수가 쓰는, 함수의 인스트럭션 세트가 차지하고 있는 영역은 다른 영역이다.
변수가 쓰는 영역은 stack / heap 메모리
함수가 쓰는 영역은 Code 영역 (변수가 아닌 로직만 갖고 있음)
* 메서드는 어떻게 호출되고 실행 되는가?
자바의 모든 메서드는 가상 메서드이다.
메서드(함수)의 이름은 주소값을 나타낸다
메서드는 명령어들의 모음이고 프로그램이 로드되면 코드 영역(메서드 영역)에 명령어 set이 위치한다
해당 메서드가 호출 되면 명령어 set 이 있는 주소를 찾아 명령어가 실행된다
이때 메서드에서 사용하는 변수들은 스택 메모리에 위치 하게됨
따라서 다른 인스턴스라도 같은 메서드의 코드는 같으므로 같은 메서드가 호출됨
인스턴스가 생성되면 변수는 힙 메모리에 따로 생성되지만, 메서드 명령어 set은 처음 한번만 로드 된다
public class TestMethod {
int num;
void aaa() {
System.out.println("aaa() 호출");
}
public static void main(String[] args) {
TestMethod a1 = new TestMethod();
a1.aaa();
TestMethod a2 = new TestMethod();
a2.aaa();
}
}
a1 과 a2 는 참조변수이고 main함수의 지역변수이므로 스택 메모리에 있고
a1.num 과 a2.num 은 인스턴스 변수이고 힙 메모리에 있다.
가상 메서드 : 실제로 그 함수 이름으로 호출이 되는게 아닌
가상 메서드 테이블에서 해당 함수 이름이 가리키는 주소를 가지고 메서드를 호출한다.
가상 메서드 테이블 : 각각의 메서드들의 주소를 가지고 있는 테이블
재정의된 경우는 재정의 된 메서드의 주소를 가리킨다.
'✅🌲강의 복습 노트 > 패캠 JavaSpring 강의,코드 복습' 카테고리의 다른 글
Part2. 3-7 상속은 언제 사용 할까? (0) | 2025.06.05 |
---|---|
Part2. 3-6 다형성과 다형성을 사용하는 이유 (0) | 2025.05.26 |
Part2. 3-4 메서드 재정의하기 (overriding) (1) | 2025.05.22 |
Part2. 3-3 상속에서 클래스 생성 과정과 형 변환 (0) | 2025.05.22 |
Part2. 3-2 상속을 활용한 멤버십 클래스 구현하기 (0) | 2025.05.21 |