자바의 정석 가자!

[자바의 정석 - 기초편] Chapter6 - 23,24 기본형 매개변수, 참조형 매개변수, 참조형 반환타입

'쪼리' 2022. 10. 26. 10:26

ch6-23 기본형 매개변수

(기본형 매개변수 : 메서드의 매개변수의 타입이 기본형이라는 것)

> 기본형 매개변수 - 변수의 값을 읽기만 할 수 있다.(read only)

> 참조형 매개변수 - 변수의 값을 읽고 변경할 수 있다.(read & write)

 

* ch6-23,24 : 기본형 매개변수와 참조형 매개변수 중요중요 강의 여러번 보고 제대로 알고 넘어가라!

기본형 매개변수 예제

위의 기본형 매개변수 예제 단계별 과정.

1. 예제 실행 - main 메서드 스택에 올라감 : 프로그램 시작

2. 참조변수 d만들어짐, 객체 생성(Data의 객체 만들어짐. 처음엔 0으로 자동 초기화)

3. 참조변수 d가 가리키는 객체x의 값을 10으로 저장(처음엔 d.x는 0)

4. println -> d가 가리키는 객체x의 값 10 출력

5. change메서드 호출 - d.x의 값이 x로 복사. 따라서 change메서드에 10이 매개변수로 들어감

6. chage메서드가 main메서드 위로 스택에 올라가고 지역변수 x에 10이 대입됨.

7. change메서드 문장 실행 : change메서드의 지역변수 x에 1000이 대입됨. 

(main에 있는 d가 가리키는 객체x와 change메서드 안의 지역변수인 x가 이름은 같지만, 다른 저장공간. 

이름만 같지 전혀 다른 공간임.)

8. println -> x 값 1000 출력

9. 문장 다 수행했으니까 change메서드 호출한 곳으로 돌아감.

10. 호출스택에서 change메서드 사라지고 지역변수 x도 함께 사라짐

11. 대기하고 있던 main메서드가 실행상태가 되고,

12. println -> After change(d.x) 출력

main메서드 위로 println메서드 호출스택에 올라가고 출력하고(작업수행)사라짐

13. println -> d가 가리키는 객체x의 값은 10. 따라서 10 출력

main메서드 위로 println메서드 호출스택에 올라가고 출력하고(작업수행) 사라짐

14. main메서드 더이상 실행할 문장 X , 종료되면서 호출스택에서 제거되고 스택은 완전히 비워지게 됨.

 

* 객체 x와 지역변수 x 이름만 같다. 전혀 다른 공간이다.

* 따라서 지역변수를 바꾼 거지, d가 가리키는 객체x의 값은 여전히 10이다.

* 심지어 바꿀 수도 없다! 왜냐면, 기본형 매개변수이기 때문이다.

* 기본형 매개변수는 오직 읽기만 가능! 객체x에 저장된 값을 바꿀 수 없다!

* 만약 객체 x값을 바꾸고 싶다면, 참조형 매개변수여야 함.

 

예제 코드만 보고 스택 그림 그려봐라~!

ch6-24 참조형 매개변수

(참조형 매개변수 : 메서드의 매개변수의 타입이 참조형이라는 것)

> 기본형 매개변수 - 변수의 값을 읽기만 할 수 있다.(read only)

> 참조형 매개변수 - 변수의 값을 읽고 변경할 수 있다.(read & write)

참조형 매개변수 예제

위의 참조형 매개변수 예제 단계별 과정.

1. 프로그램 실행 -> main메서드 호출되면서 스택에 main메서드 올라감

2. main메서드 첫줄 실행하면 먼저 참조변수 d만들어지고 Data2의 객체 만들어짐 : 처음엔 0으로 자동초기화됨.

만약 주소가 100번지면 이 주소값 100번지가 대입연산자에 의해서 d에 대입됨.

3. 참조변수 d가 가리키는 객체 x값에 10을 저장.

4. println -> d.x값은 10출력

println메서드가 main메서드 위로 호출스택에 올라감 -> 실행 (10 출력) -> 메서드 종료-> 호출스택에서 사라짐 -> main메서드로 돌아옴

5. change메서드 호출

(참조변수 d를 줌, main메서드의)

main메서드는 대기상태로 돌입, change메서드 실행상태

6. change메서드의 참조형 매개변수에 d값 : 100번지가 대입됨,복사됨.

7. 1000을 참조변수 d가 가리키는 x에 저장.

여기서 d는 change메서드의 지역변수d

change의 지역변수d가 가리키는 객체 x값을 1000으로 바꾼다.

8. println-> d가 가리키는 x의 값 : 1000 을 출력

9. change메소드로 돌아옴

10. 더이상 실행할 문장 X. change메서드 종료

11. 호출한 곳으로 돌아감.

12. main 메서드로 돌아감. 대기상태였던 main메서드 실행상태 돌입

13. println -> After chage 출력

14. println -> d가 가리키는 객체 x의 값 1000 출력

15. main메서드 더이상 실행할 문장 X, 종료, 스택 완전히 비워짐, 프로그램 종료

 

참조형 매개변수를 사용하기 때문에, main메서드의 참조변수 d가 가리키는 객체 x의 값을 바꿀 수 있다.

main메서드가 change메서드를 호출할 때, main메서드에 있는 지역변수 d의 값을 change메서드에 있는 지역변수로 복사해준 거임.

change에 있는 참조변수d도 객체를 같이 가리킬 수 있게 된 거임.

 

차이점.

main메서드가 단순히 객체가 가진 값을 줬는데, 이번에는 객체가 어디 저장되어있는지 그 주소를 준 거임.

객체를 다룰 수 있는 주소값을 주니까, change메서드에서 객체를 다룰 수 있게 된 거임.

 

참조형 매개변수를 통해서, 객체의 주소를 전달해주면, 참조변수를 이용해서 객체를 다룰 수 있게 됨.

객체의 주소를 아니까, 값을 읽어올 수도 쓸 수도 있는 거임.

(이 객체에 대한 참조변수를 갖고 있으니까 )

 

 

ch6-25 참조형 반환타입

반환타입이 참조형인 경우에, 객체의 주소를 반환한다.(=객체를 반환)

(참조형 : 객체 주소를 주고받아)

 

참조형 반환타입

 

코드만 보고 그림을 하나하나 그려보거라!!!!!!

감 잡힐 때까지 그림을 그려보면, 완전히 이해할 수 있다!!!!!!

오늘 집에서 하기 약속