📌 학습 목차
25. 참조형 반환 타입
25. 참조형 반환 타입
•매개 변수뿐만 아니라 메서드의 반환 타입 또한 참조형이 될 수 있으며, 이는 곧 반환값의 타입이 참조형임을 의미함
이때 모든 참조형 타입의 반환값은 '객체 주소'의 정숫값을 의미함
📌 // 반환 타입이 참조형인 메서드의 호출 관계
package chap_06;
class Data3 {
int x;
}
class _25_Example {
public static void main(String[] args) {
Data3 a = new Data3();
a.x = 10;
Data3 b = copy(a);
System.out.println(a.x + " / " + b.x); // 10 / 10
}
static Data3 copy(Data3 a) { // 참조형 반환 타입
Data3 c = new Data3();
c.x = a.x;
return c; // 참조형 반환값인 객체 주소 반환
}
}
1) public class Example {} / public static void main(String[] args) {}
•Example 클래스가 메모리에 로드된 후, 클래스의 main 메서드가 호출되면서 프로그램이 시작됨
이때 main 메서드를 위한 메모리 공간이 호출 스택에 할당되어 main 메서드가 실행됨
2) Data3 a = new Data3();
•Data3 클래스가 메모리에 로드된 후, Data3 타입의 참조 변수 a가 main 메서드의 지역 변수로 생성됨
•new 연산자에 의해 Data3 클래스의 인스턴스(0x100)가 생성된 후,
Data3 인스턴스의 멤버 변수 x는 자료형의 기본값인 0으로 자동 초기화됨
•대입 연산자에 의해 Data3 인스턴스 주소 0x100이 참조 변수 a에 저장되어 참조 변수 a로 Data3 인스턴스 멤버에 접근할 수 있게 됨
3) a.x = 10;
•대입 연산자에 의해 10이 a.x(main 메서드에서 참조 변수 a가 참조하고 있는 Data3 인스턴스의 멤버 변수 x)에 저장됨
4) Data3 b = copy(a);
•Data3 타입의 참조 변수 b가 main 메서드의 지역 변수로 생성되고, main 메서드에서 copy 메서드를 호출함
main 메서드는 호출 스택에 대기 상태로 남고 copy 메서드를 위한 메모리 공간이 호출 스택에 할당됨
•copy 메서드의 매개 변수로 객체의 주소를 넘겨주는 참조형을 선언함에 따라,
참조 변수 a에 저장된 Data3 인스턴스 주소 0x100이 copy 메서드의 매개 변수 a로 복사됨
•copy 메서드의 참조 변수 a가 main 메서드의 참조 변수 a와 같은 Data3 인스턴스를 참조하게 됨에 따라,
copy 메서드의 참조 변수 a 또한 Data3 인스턴스 멤버에 접근해 값을 읽거나 변경할 수 있게 됨
5) Data3 c = new Data();
•Data3 타입의 참조 변수 c가 copy 메서드의 지역 변수로 생성됨
•new 연산자에 의해 Data3 클래스의 인스턴스(0x200)가 생성된 후,
Data3 인스턴스의 멤버 변수 x는 자료형의 기본값인 0으로 자동 초기화됨
•대입 연산자에 의해 Data3 인스턴스 주소 0x200이 참조 변수 c에 저장되어 참조 변수 c로 Data3 인스턴스 멤버에 접근할 수 있게 됨
6) c.x = a.x;
•대입 연산자에 의해 a.x(copy 메서드에서 참조 변수 a가 참조하고 있는 Data3 인스턴스 주소 0x100의 멤버 변수 x) 값인 10이
c.x(copy 메서드에서 참조 변수 c가 참조하고 있는 Data3 인스턴스 주소 0x200의 멤버 변수 x)에 저장됨
7) return c; / Data3 b = copy(a); -> Data3 b = c(0x200);
•copy 메서드의 반환 타입이 객체의 주소를 반환하는 참조형을 선언함에 따라,
참조 변수 c에 저장된 Data3 인스턴스 주소 0x200이 copy 메서드의 작업 결과로 반환됨
•copy 메서드의 반환값인 Data3 인스턴스 주소 0x200은 return문에 의해 메서드를 호출한 곳으로 되돌아가며,
대입 연산자에 의해 main 메서드의 지역 변수인 참조 변수 b에 저장됨
•main 메서드의 참조 변수 b가 copy 메서드의 참조 변수 c와 같은 Data3 인스턴스를 참조하게 됨에 따라,
main 메서드의 참조 변수 b 또한 Data3 인스턴스 멤버에 접근해 값을 읽거나 변경할 수 있게 됨
•copy 메서드 반환값의 타입, copy 메서드의 반환 타입, copy 메서드의 반환값을 저장한 main 메서드의 참조 변수 b의 타입이
참조형 Data3으로 서로 일치함을 알 수 있음
8) System.out.println(a.x + " / " + b.x);
•실행이 종료된 copy 메서드는 호출 스택에서 제거된 후, 자신을 호출한 main 메서드로 되돌아감
이때 대기 상태였던 main 메서드는 copy 메서드를 호출한 이후부터 실행을 재개함
•main 메서드에서 println 메서드를 호출한 상태로,
main 메서드는 호출 스택에 대기 상태로 남고 println 메서드를 위한 메모리 공간이 호출 스택에 할당되어 a.x와 b.x값인 10이 출력됨
•실행이 종료된 println 메서드는 호출 스택에서 제거된 후, 자신을 호출한 main 메서드로 되돌아감
•main 메서드에 더 이상 실행할 코드가 없으므로 main 메서드가 종료되고, 동시에 호출 스택 전체가 비워지면서 프로그램이 종료됨
Reference
[남궁성의 정석코딩] Java의 정석 기초편 강의
[도우출판] Java의 정석 기초편 / 기본편