char
byte
short
int
long
float
double
boolean
class Data { int x; } //x:멤버변수
class Ex6_6 {
public static void main(String[] args) {
Data d = new Data(); //객체생성(main에 d라는 참조변수 생성, d는 Data인스턴스를 참조)
d.x = 10; //참조변수d가 가리키는 객체의 멤버변수x의 값이 10
System.out.println("main() : x = " + d.x);
change(d.x);
System.out.println("After change(d.x)");
System.out.println("main() : x = " + d.x);
}
static void change(int x) { // 기본형 매개변수
x = 1000;
System.out.println("change() : x = " + x);
}
}
class Ex6_6 {
public static void main(String[] args) {
클래스 Ex6_6이 메모리에 로드되고 클래스의 메인메모리가 호출되면서 프로그램이 시작된다.
Data d = new Data();
Data클래스가 메모리에 로드되고, 참조변수d가 메인메서드에 지역변수로 생성된다.
Data의 인스턴스가 생성되고 생성된 인스턴스의 주소가 d에 저장된다.
d.x = 10;
d가 참조하고 있는 인스턴스의 멤버변수x에 10을 저장한다.
change(d.x);
change메서드를 호출하면서 매개변수로 d가 참조하고 있는 x의 값(10)을 넘겨준다. d.x의 값이 change의 매개변수 x에 복사된다.
static void change(int x) { // 기본형 매개변수
x = 1000;
System.out.println("change() : x = " + x);
}
change의 지역변수 x에 1000을 저장한다.(x의 값이 10에서 1000으로 변경된다.)
인스턴스의 멤버변수x의 값은 변경되지 않음
👉 기본형 매개변수는 읽기만 가능(수정 불가)
class Data2 { int x; }
class Ex6_7 {
public static void main(String[] args) {
Data2 d = new Data2(); //참조변수d가 main메서드에 지역변수로 생성
d.x = 10; //참조변수d가 참조하고있는 인스턴스의 멤버변수x에 10을 저장
System.out.println("main() : x = " + d.x);
change(d); //change메서드를 호출하면서 매개변수로 참조변수d값(인스턴스의 주소)을 넘겨준다.
System.out.println("After change(d)");
System.out.println("main() : x = " + d.x);
}
static void change(Data2 d) { // 참조형 매개변수
d.x = 1000;
System.out.println("change() : x = " + d.x);
}
}
class Ex6_7 {
public static void main(String[] args) {
Ex6_7클래스가 메모리에 로드되고, 클래스의 메인메서드가 호출되면서 프로그램이 시작된다.
Data2 d = new Data2();
Data2클래스가 메모리에 로드되고, 참조변수d가 메인메서드에 지역변수로 생성된다.
Data2의 인스턴스가 생성되고, 생성된 인스턴스의 주소가 참조변수d에 저장된다.
d.x = 10;
참조변수d가 참조하고 있는 인스턴스의 멤버변수x에 10을 저장한다.
change(d);
change메서드를 호출하면서 매개변수로 참조변수d 값(인스턴스의 주소)을 넘겨준다.
static void change(Data2 d) { // 참조형 매개변수
d.x = 1000;
System.out.println("change() : x = " + d.x);
}
change메서드에 Data2인스턴스를 참조하는 참조변수d가 생성된다.
그 d가 참조하는 인스턴스의 멤버변수x에 1000을 저장한다. 이때 메인메서드의 d.x값도 1000으로 변경된다.
👉 참조형 매개변수는 읽기와 수정이 가능!
class Data3 { int x; }
class Ex6_8 {
public static void main(String[] args) {
Data3 d = new Data3();
d.x = 10;
Data3 d2 = copy(d); //static 매서드는 객체 생성없이 호출 가능(호출시 참조변수 없음)
System.out.println("d.x ="+d.x);
System.out.println("d2.x="+d2.x);
}
static Data3 copy(Data3 d) { //main의 d주소를 copy의 참조변수d에 대입
Data3 tmp = new Data3(); // 새로운 객체 tmp를 생성한다.
tmp.x = d.x; // d.x(copy메서드의 d)의 값을 tmp.x에 복사한다.
return tmp; // 복사한 객체의 주소를 반환한다.
}
}
class Ex6_8 {
public static void main(String[] args) {
Ex6_8클래스가 메모리에 로드되고 클래스의 메인메서드가 호출되면서 프로그램이 시작된다.
Data3 d = new Data3();
Data3클래스가 메모리에 로드되고, 참조변수 d가 메인메서드에 지역변수로 생성된다.
Data3의 인스턴스가 생성되고, 생성된 인스턴스의 주소(예:0x100)가 참조변수 d에 저장된다.
d.x = 10;
참조변수d가 참조하고 있는 인스턴스의 멤버변수 x에 10을 저장한다.
Data3 d2 = copy(d);
메인메서드에 참조변수d2가 지역변수로 생성되고 copy메서드가 호출되면서 매개변수로 참조변수d의 값을 넘겨준다.
static Data3 copy(Data3 d) {
Data3 tmp = new Data3();
tmp.x = d.x;
return tmp;
}
copy메서드에 Data3인스턴스를 참조하는 참조변수d가 생성된다.
copy메서드에 참조변수tmp가 지역변수로 생성된다.
새로운 Data3의 인스턴스가 생성되고, 생성된 인스턴스의 주소(예:0x200)가 tmp에 저장된다.
tmp가 참조하고 있는 새로운 인스턴스의 멤버변수x에 d가 참조하고 있는 x값(10)을 대입한다.
tmp가 참조하고 있는 주소(예:0x200)를 반환하고 copy메서드가 종료된다.
메인메서드의 d2에는 tmp의 주소(예:0x200)가 저장된다.