기본형매개변수
기본형 매개변수
변수의 타입에는 크게 2가지가 있다.
메서드의 매개변수가 기본형일 때와 참조형일 때의 차이가 있다.
굉장히 중요하니, 그 차이를 정확히 알아야 한다. 이번시간 공부하는 내용과 다음 시간의 공부내용을 비교하며 숙지하자.
- 기본형 매개변수 - 변수의 값을 읽기만 할 수 있다.(read only)
- 참조형 매개변수 - 변수의 값을 읽고 변경할 수 있다. (read & write)
기본형 매개변수의 경우 변수의 값을 읽기만 할 수 있다.
참조형 매개변수의 경우에는 값을 읽고 변경할 수 있다는 특징이 있다.
[Ex6_6]
class Data {int x;}
public class Ex6_6 {
public static void main(String[] args) {
Data d = new Data();
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);
}
}
[실행 결과]
main() : x = 10
change() : x = 1000
After change(d.x)
main() : x = 10
이 프로그램을 실행하면, main메서드가 스택에 올라간다. 올라가면서 프로그램이 시작된다.
첫번째로 참조변수 d가 만들어지고, Data객체를 생성한다.
Data객체의 멤버가 1개이니, x 1개가 0으로 초기화 되어 만들어진다.
그리고 이 객체 주소가 100번지라고 하면, 이 주소값이 변수 d에 저장된다.
그리고, d.x=10에서 참조변수d가 가리키는 객체의 x값을 10으로 저장한다.
그래서 참조변수 d를 가리키는 x의 값에 10이 저장된다.
그다음 문장에서 println으로 값을 찍는데, d.x가 10이므로 10출력된다.
그리고, change(d.x)메서드를 호출해서 d.x값이 change메서드의 x로 복사가 된다.
즉, 현재 d.x의 값인 10이 복사된다.
그러면, static void change(intx)에서 Int x가 지역변수이므로 change메서드의 x에 10이 들어간다.
그다음, change메서드의 문장들이 실행된다.
change메서드의 지역변수 x에 10이 저장되어 있었는데, 1000으로 지역변수 x값이 바뀌어 저장된다.
그리고 println을 통해 지역변수 x가 출력된다. 즉 1000이 출력된다.
그리고나서 change메서드의 문장을 전부 수행했으므로 호출한 곳으로 다시 돌아간다.
이때, change메서드가 자기가 할 일을 다 수행했으므로 호출 스택에서 사라진다.
즉, 지역변수 x도 change메서드와 함께 사라진다.
그리고 다시 대기하고있던 main메서드가 다시 실행상태가 되고,
그다음문장들인 println을 호출해서 호출 스택에 println이 메인메서드 위에 올라간다.
After change(d.x)가 출력되고,
또 println이 호출되는데, 이때, println을 호출하기 전에, 괄호 안의 계산이 끝나야 호출되므로 d.x 가 먼저 읽힐 것이다.
즉, 10이 먼저 읽힌다.
최종적으로 println문장이 실행되며 main() : x = 10이 출력된다.
그리고나서 println메서드가 종료되어 사라지고,
대기중에던 main메서드도 더이상 실행할 문장이 없어서 main메서드도 종료되고 호출 스택은 완전히 비워지게 된다.
이 예제에서 핵심은, 기본형 매개변수는 읽기만 가능하다는 것. 즉 변경할 수 없다는 것이다.
코드만 보면, d객체의 x의 값을 1000으로 변경했는지, change메서드의 지역변수x를 1000으로 바꿧는지 햇갈릴 수도 있지만, 그림을 이용하면 쉽게 파악할 수 있다.
결국, change메서드는 지역변수 x를 바꾼것이고, 해당 메서드가 종료되면 지역변수x는 사라진다.
만약에 change메서드에서 d객체의 x값을 바꾸고 싶다면,
change메서드의 매개변수 타입을 기본형이 아니라 , 참조형을 바꿔야 한다.
다음 공부시간에, 참조형 매개변수를 다루는 예제랑 잘 비교해 보자.
'JAVA' 카테고리의 다른 글
static메서드와 인스턴스 메서드 (0) | 2022.03.28 |
---|---|
참조형 매개변수, 참조형 반환타입 (0) | 2022.03.27 |
호출 스택 (call stack) (0) | 2022.03.26 |
return문, 반환값 (0) | 2022.03.26 |
메서드 호출과 메서드의 실행흐름 (0) | 2022.03.25 |
댓글
이 글 공유하기
다른 글
-
static메서드와 인스턴스 메서드
static메서드와 인스턴스 메서드
2022.03.28 -
참조형 매개변수, 참조형 반환타입
참조형 매개변수, 참조형 반환타입
2022.03.27 -
호출 스택 (call stack)
호출 스택 (call stack)
2022.03.26 -
return문, 반환값
return문, 반환값
2022.03.26