인자(argument)와 매개변수(parameter)
기본형 매개변수와 참조형 매개변수의 차이를 얘기하기 전에 인자와 매개변수의 차이부터 짚고 넘어간다. 인자의 값이 '복사'되어 매개변수로 전달된다는 점이 중요하기 때문이다. 우선 Java 공식문서에 따르면 둘의 차이는 다음과 같다.
Parameters refers to the list of variables in a method declaration. Arguments are the actual values that are passed in when the method is invoked. When you invoke a method, the arguments used must match the declaration's parameters in type and order.
인자는 메서드가 실제로 실행될 때 전달해주는 값이고, 매개변수는 메서드에 어떤 값이 필요한지 정의해둔 변수다. 그래서 메서드가 실행될 때, 전달받은 인자는 메서드에 정의된 매개변수로 '복사'된다. 즉, 인자는 원본이고 매개변수는 복사본이다.
public class App {
public static void main(String[] args) {
int number = sum(2, 5); // 메서드를 실행할 때, 인자 2와 5가 전달된다.
System.out.println(number);
}
public static int sum(int x, int y) { // 전달받은 인자가 메서드에 정의된 매개변수 x와 y로 복사된다.
int result = x + y;
return result;
}
}
기본형 매개변수
위에서 설명했다시피, 메서드가 실행될 때는 전달된 인자의 값이 매개변수로 복사된다. 그래서 메서드가 실행되는 동안 매개변수의 값이 변경되더라도 전달된 인자의 값은 변경되지 않는다. 따라서 기본형 매개변수는 변수에 저장된 값만 읽을 수 있을 뿐 변경할 수는 없다.
public class Data {
private int number;
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
}
public class App {
public static void main(String[] args) {
Data data = new Data();
data.setNumber(5); // Data 인스턴스의 멤버변수 number의 값을 5로 변경
System.out.println(data.getNumber());
modify(data.getNumber()); // modify()에 Data 인스턴스의 멤버변수 전달
System.out.println(data.getNumber());
}
public static void modify(int x) { // 기본형 매개변수
x = x*2;
System.out.println(x);
}
}
/*
실행 결과
5
10
5
*/
참조형 매개변수
참조형 매개변수도 마찬가지로 전달된 인자의 값이 매개변수로 복사된다. 그러나 기본형 매개변수의 예시와 달리 Data 인스턴스의 멤버변수 값을 변경할 수 있다. 참조형 변수에는 '객체의 주소값'이 저장되기 때문이다. 따라서 참조형 변수는 변수에 저장된 주소값을 읽고, 해당 주소값으로 인스턴스를 조작할 수 있다. 즉, 인자로 전달된 참조변수와 메서드 내에서 매개변수로 사용되는 참조변수는 같은 객체를 가리킨다.
public class Data {
private int number;
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
}
public class App {
public static void main(String[] args) {
Data data = new Data();
data.setNumber(5); // Data 인스턴스의 멤버변수 number의 값을 5로 변경
System.out.println(data.getNumber());
modify(data); // modify()에 Data 인스턴스를 전달
System.out.println(data.getNumber());
}
public static void modify(Data data) { // 참조형 매개변수
data.setNumber(10);
System.out.println(data.getNumber());
}
}
// main()의 참조변수 data와 modify()의 매개변수인 참조변수 data는 같은 인스턴스를 가리킨다.
/*
실행 결과
5
10
10
*/'Java' 카테고리의 다른 글
| [Java] 서블릿(Servlet)의 개념과 동작 과정 (0) | 2023.08.13 |
|---|---|
| [Java] 상속과 참조변수 형변환을 활용한 다형성 구현 (0) | 2023.04.29 |
| [Java] 오버로딩 vs 오버라이딩 (0) | 2023.04.21 |
| [Java] 클래스를 바라보는 두 가지 관점 (0) | 2023.04.12 |
| [Java] Java의 특징과 Java 프로그램 실행 과정 (0) | 2023.04.10 |