자바 에서 왜 this 가 현재 인 스 턴 스 를 호출 할 수 있 습 니까?
자바 를 처음 배 웠 을 때 모두 this 키 워드 를 접 했 을 것 입 니 다.특히 구조 함수 가 값 을 부여 할 때 다음 과 같은 예제 가 있 습 니 다.
public class Person {
private String name;
private int age;
public Person(String name, int age) {
// this ,
this.name = name;
this.age = age;
}
}
구조 함수 에서 구성원 변수 이름과 매개 변수 이름 이 같 으 면 this 키 워드 를 추가 해 야 합 니 다.그렇지 않 으 면 매개 변수 name 을 그 자체 에 할당 할 뿐 Person.name 에 할당 하지 않 았 습 니 다.부분 변수의 우선 순위 가 구성원 변수 보다 높 기 때 문 입 니 다.this 키 워드 를 추가 하면 this 가 현재 인 스 턴 스 를 가리 키 기 때문에 대상 의 구성원 변 수 를 할당 할 수 있 습 니 다.그런데 왜 this 키 워드 를 통 해 현재 대상 에 접근 할 수 있 습 니까?
2.스 택 프레임
이 문 제 를 파악 하려 면 먼저 JVM 이 방법 을 실행 할 때 방법 스 택 의 스 택 프레임 구 조 를 알 아야 한다.
자바 가상 머 신 은[방법]을 가장 기본 적 인 운영 단위 로 하고[스 택 프레임]은 JVM 을 지원 하 는 방법 으로 뒤의 데이터 구 조 를 호출 하 는 것 입 니 다.이것 은 JVM 이 실 행 될 때 데이터 구역 의[가상 머 신 스 택]중의 스 택 요소 이기 도 합 니 다.
쉽게 말 하면 방법의 집행 과정 은 하나의 스 택 프레임 이 스 택 에 들 어가 서 스 택 에서 나 오 는 과정 으로 볼 수 있다.
스 택 프레임 에 방법 이 저 장 된 것:부분 변수 표,조작 수 스 택,동적 연결 과 방법 으로 주소 등 정 보 를 되 돌려 줍 니 다.
javac 프로그램 을 사용 하여 원본 코드 를 바이트 코드 로 컴 파일 한 후,한 방법의 스 택 프레임 은 얼마나 큰 부분 변수 표 가 필요 합 니까?얼마나 깊 은 작업 스 택 은 이미 계산 되 었 고,방법 표 의[Code]속성 에 기록 되 었 습 니 다.이 모든 것 은 프로그램 이 실 행 될 때 와 무관 합 니 다.
다시 말 하면 하나의 방법 은 몇 개의 부분 변 수 를 가지 고 있 는 지,컴 파일 할 때 이미 확정 되 었 으 며,프로그램의 운행 에 따라 바 뀌 지 않 는 다 는 것 이다.오늘 우리 가 탐구 하고 자 하 는[this]문 제 는 바로 방법 창고 의 부분 변수 표 에 있다.
3.분석
우 리 는 여전히 자바 p 명령 으로 컴 파일 된 Class 파일 을 분석 하 는데 이것 이 가장 설득력 이 있다.
public class Person {
public void say() {
}
public static void staticSay() {
}
}
이전 코드 와 같이 각각 인 스 턴 스 방법 과 정적 방법 이 있 습 니 다.우 리 는 정적 방법 에서[this]에 접근 할 수 없다 는 것 을 알 고 있 지만 인 스 턴 스 방법 에서 가능 합 니 다.먼저 javac Person.java,그리고 javap-verbose Person,얻 은 정보 가 좀 길 어 요.저 는 이 두 가지 방법의 정보 만 붙 일 게 요.
public void say();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=0, locals=1, args_size=1
0: return
LineNumberTable:
line 8: 0
public static void staticSay();
descriptor: ()V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=0, locals=0, args_size=0
0: return
LineNumberTable:
line 12: 0
[Code]란 에 중점 을 두 고 say()는 부분 변수 가 있 고 매개 변수 가 있 습 니 다.staticSay()는 부분 변수 도 없고 인자 도 없습니다.의 심 스 럽 죠?say()방법 형 삼 은 비어 있 고 방법 체 도 비어 있 습 니 다.왜 컴 파일 한 후에 부분 변수 와 형 삼 이 있 는 지 보 여 줍 니까?
사실은 인 스 턴 스 방법 에 있어 서 적어도 하나의 매개 변수 와 부분 변 수 는 현재 대상 이다.JVM 은 대상 의 인 스 턴 스 방법 을 호출 할 때 대상 자체 의 인용 을 0 번 매개 변수 로 전달 합 니 다.그러면 this 키 워드 를 통 해 대상 자체 에 접근 할 수 있 습 니 다.사실은 0 번 째 매개 변수 에 접근 하 는 것 입 니 다.
아래 와 같이 이 두 가지 방법 은 사실 등가 이다.
public void say(Person this, String text) {
System.out.println(text);
}
public void say(String text) {
System.out.println(text);
}
4.총화자바 가상 머 신 은 방법 을 실행 할 때 방법 을[스 택 프레임]으로 포장 합 니 다.스 택 프레임 에[부분 변수 표]가 있 고 매개 변수 도 부분 변수 표 의 일부분 입 니 다.한 방법의 부분 변수 표 가 얼마나 큰 지 는 컴 파일 할 때 이미 확정 되 었 으 며 프로그램의 운행 에 따라 달라 지지 않 습 니 다.
인 스 턴 스 방법 에 있어 서 컴 파일 할 때 숨겨 진 0 번 인 자 를 자동 으로 추가 합 니 다.바로 현재 클래스 입 니 다.JVM 은 대상 의 인 스 턴 스 방법 을 호출 할 때 대상 을 0 번 매개 변수 로 자동 으로 참조 하여 전달 합 니 다.[this]를 방문 하 는 것 은 0 번 매개 변수 입 니 다.
자바 에서 왜 this 가 현재 인 스 턴 스 를 호출 할 수 있 는 지 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 this 호출 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.