남궁성님의 Java의 정석(3rd Edition)을 보고 정리한 글입니다.
1. 매개변수를 전달하는 방법
Java에서 메서드 매개변수를 전달할 때 두가지 방법이 있다. 기본타입을 매개변수로 넘기는 경우 이를 Call by Value라고 하고, 참조타입을 넘기는 경우 Call by Reference라고 한다.
- Call by Value
- Call by Reference
a. Call by Value(값에 의한 전달)
Call by Value는 값에 의한 전달을 뜻한다. Call by Value는 단순히 변수의 값만 읽어 올 수 가 있어 변수의 값을 변경 할 수 없다.(Read Only)
public class Class1 {
public static void main(String[] args) {
int a = 9;
set(a);
System.out.println(a);
}
static void set(int a) {
a = 5;
}
}
실행결과
9
set 메서드에서 main메서드로부터 넘겨받은 a의 값 9를 5로 변경했는데도 값이 a의 값은 변경되지 않았다. main메서드에서는 단순히 a의 값 9를 전달했을 뿐이다. set메서드에서는 원본이 아닌 복사본을 변경했으므로 원본에 영향을 끼치지 못한다.
b. Call by Reference(주소에 의한 전달)
Call by Reference는 주소에 의한 전달이라고 한다. 즉 매개변수를 전달할 떄 객체(번지수)를 전달한다. Call by Reference 넘겨받은 매개변수의 번지수를 알고 있기 때문에 값을 읽어오는 것은 물론 값을 변경할 수도 있다.(Read & Write)
public class exexe {
public static void main(String[] args) {
int[] a = { 1, 2, 3, 4, 5 };
set(a);
System.out.println(Arrays.toString(a));
}
static void set(int[] a) {
a[0] = 10;
a[1] = 20;
a[2] = 30;
a[3] = 40;
a[4] = 50;
}
}
실행 결과
[10, 20, 30, 40, 50]
Java에서 배열은 참조타입이다. 그러므로 매개변수를 전달할 때 a의 번지수가 전달된다. 번지수를 알고 있다. 즉 원본의 주소를 set 메서드는 원본의 주소를 알고있는 셈이다. 그러므로 배열 a에 해당하는 요소들을 읽어올 수도 있고, 값을 변경하는 것이 가능하다.
'Programming > Java' 카테고리의 다른 글
[Java] 생성자와 this / super (0) | 2023.10.13 |
---|---|
[Java] 오버로딩과 오버라이딩 (0) | 2023.10.13 |
[Java] JVM 구조 (0) | 2023.10.13 |
[Java] 배열(Array) (0) | 2023.10.09 |
[Java] 조건문과 반복문 (1) | 2023.10.09 |