기본형 매개변수 - 변수의 값을 읽기만 가능 (read only)
참조형 매개변수 - 변수값을 읽고 변경이 가능(read & write)
기본형 매개변수 에제
//기본형
class Data {int x;}
class test{
pulic static void main(String[] args){ //호출스택에 main생성
Data d = new Data (); //main스택에 d생성후 Data값 대입(d엔 Data의 주소값 저장 "*" )
d.x = 10; //d가 가리키는 x의 값을 10으로 변경
System.out.println("main() : x = "+d.x); //(A)
change(d.x); //d.x는 data의 주소값이 아닌 1000을 대입
System.out.println("After change(dx.)");
System.out.println("main() : x = "+d.x); //(B)
}
#####################
static void change(int x){ //change 스택에 생성 -> 기본형 매개변수
x = 1000; //x는 1000으로 대입
System.out.println("change() : x = "+x); //(C)
}
#####################
}
해당 코드에서 얘기하고 싶은점은 변수가(d.x)가 어떤 스택에 생성되고 값이 달라지는걸 보여주며 동시에 매개변수를 비교하기 위한 예시코드이다.
이전에 설명한 호출스택과 연결되는데 (A),(B),(C) 모두 d.x를 출력하는 println 라인에 붙어있는걸 확인할수 있다.
세세하게 설명하자면
(A) - d.x는 호출스택에서 main에 생성된 d.x의 주소를 의미한다. (포인터)
(B) - d.x는 호출스택에서 main에 생성된 d.x의 주소를 의미한다. (포인터)
(C) - d.x는 호출스택에서 change에 생성된 d.x를 의미한다. (지역변수)
(A),(B)에 값을 넣는경우 d.x는 x가 들어가있는 주소를 찾아가 값을 바꾼뒤 그 주소를 갖고있는것이고, 실제 값을 출력하는건 Data의 x변수가 값을 갖는것이다.(main이 종료될경우 main에서 조작한 데이터는 전부 원래의 값으로 돌아간다)
(C)는 x의 값을 바꾸는 것인데 여기선 매개변수가 d.x(지역변수)로 인식되어 change에서 생성한 스택(x)에 값을 넣고 출력하는 것이다. -> 여기서 d.x(지역변수)는 스택 종료시 값이 사라지기 때문에 (B)를 실행해도 기존값인 10이 출력되는걸 알수있다.

참조형 매개변수
하단 예제를 읽기에 앞서 "d.x"와 "d.x(지역변수)"는 다른것임을 염두에 두고 읽으면 된다.
//참조형 매개변수
class Data {int x;}
class test{
pulic static void main(String[] args){ //호출스택에 main생성
Data2 d = new Data2 (); //main스택에 d생성후 Data2값 대입(d엔 Data2의 주소값 저장 "*" )
d.x = 10; //d가 가리키는 x의 값을 10으로 변경
System.out.println("main() : x = "+d.x); //(A)
change(d.x); //d.x는 data2의 주소값이 아닌 1000을 대입
System.out.println("After change(dx.)");
System.out.println("main() : x = "+d.x); //(B)
}
#######################
static void change(Data2 d){ //change 스택에 생성 -> 참조형 매개변수
d.x = 1000; //x는 1000으로 대입
System.out.println("change() : x = "+d.x); //(C)
}
#######################
}
기본형 코드와 참조형 코드에서 달라진점은 change 메소드의 매개변수 타입이 바뀌었단점이다.
(C) - d.x는 호출스택에서 "change에 생성된 d.x이며 d.x는 (A)의 주소값을갖고있음"을 의미한다. (참조변수)
(C)는 x의 값을 바꾸는 것인데 여기선 매개변수가 d.x(참조변수)로 인식되어 change에서 생성한 스택(x)에 d.x(지역변수)의 주소값 넣고 출력하는 것이다. -> d.x(지역변수)는 d.x의 주소를 타고 들어가(참조하여) 값을 변경한 것이기에 상단의 기본형 매개변수와 다르게 (B)가 다르게 출력됨을 알수있다.

참조형 반환타입
//참조형 반환타입
class Data {int x;}
class test{
pulic static void main(String[] args){ //호출스택에 main생성
Data3 d = new Data3 (); //main스택에 d생성후 Data3주소값 대입(d엔 Data3의 주소값 저장 "*" )
d.x = 10; //d가 가리키는 x의 값을 10으로 변경
Data3 d2 = copy(d); //main스택에 d2생성후 data3의 주소값을 대입
System.out.println("d.x = "+d.x);
System.out.println("d2.x = "+d2.x); //(B)
}
#######################
static Data3 copy (Data3 d){ //스택에 copy 생성
Data3 tmp = new Data3(); //copy 스택에 tmp 객체 생성(엘리먼트)
tmp.x = d.x; //tmp.x에 d.x(10) 대입
return tmp; //복사한 객채의 주소 (tmp) 반환 -> 참조형 반환타입
}
#######################
}

반환타입이 참조형이란건 객체의 주소를 반환한다는 의미인데 여기서 return tmp는 주소값 즉, d.x의 주소값을 들고있고 d.x는 10을 갖고 있으므로 d.x와 d2.x는 같은 값(같은 주소)이 출력됨을 확인할수 있다.
'JAVA' 카테고리의 다른 글
| 생성자(Constructor)와 this (2) | 2023.02.06 |
|---|---|
| 오버로딩 (0) | 2023.02.02 |
| 메서드 (1) | 2023.01.30 |
| 클래스 변수,인스턴스 변수 (1) | 2023.01.30 |
| 인터페이스란? (3) | 2023.01.13 |