티스토리 뷰
Java/Java Basic
[Java] 2-04 - 매개변수 - 값 복사, 주소 복사, Call by value, Call by reference
jhk828 2021. 1. 9. 21:332. 매개변수
1. 매개변수 개념
매개변수의 의미
메서드를 호출해서 객체 간 메시지가 전달될 때 필요한 부가 정보를 매개변수 형태로 전달한다.
메서드 매개변수로 전달되는 데이터가 기본형이냐 참조형이냐에 따라 동작 방식이 달라지게 된다.
매개변수 타입에 따른 특징
값 복사
// 기본형 매개변수의 값 복사
int score = 80; // score 변수에 80 저장
int copyScore = score; // score 변수에 저장된 값을 copyScore 변수에 할당함
// - 메모리 상에는 두 변수가 같은 값을 가지게 된다.
// - 특정 변수의 값을 수정해도 다른 변수에는 영향을 미치지 않음
주소 복사
// 참조형 변수
int[] list = { 100, 85, 90 }; // list 변수에 일차원 배열 객체의 주소 값이 저장됨
int[] copyList = list; // copyList 변수에 list 변수에 저장된 주소 값을 할당함
// - list 변수에 저장된 배열 객체의 주소 값이 복사된다.
// - 하나의 일차원 배열 객체를 두개의 참조 변수가 참조하면서 데이터를 공유하게 된다.
// - 특정 변수로 배열의 값을 수정하면, 동일한 객체를 참조하는 다른 변수도 수정된 값을 인식한다.
기본 데이터 타입 : 값에 의한 호출 (Call by value)
매개 변수의 타입이 기본 데이터 타입인 경우
public class CallByValueTest {
public static void main(String[] args) {
int score = 10;
System.out.println("변경 전 score : " + score);
changeScore(score);
System.out.println("변경 후 score : " + score);
}
private static int changeScore(int score) {
// 매개 변수의 값을 수정한다.
score = 100;
System.out.println("변경된 score : " + score);
return score;
}
}
// 변경 전 score : 10
// 변경된 score : 100
// 변경 후 score : 10
참조 데이터 타입 : 주소에 의한 호출 (Call by reference)
참조형 매개변수는 참조하는 객체의 주소 값이 복사되어 전달된다.
메서드를 호출 할 때 넘겨준 인자 ----- 호출된 메서드의 매개 변수
- 같은 객체의 주소를 가지며, 하나의 객체를 두 개의 참조 변수가 공유한다.
public class CallByReferenceTest {
public static void main(String[] args) {
// 1. 정수형 배열 scoreList에 일차원 배열 객체를 생성하여 할당한다.
int[] scoreList = {40, 78, 98};
System.out.println("변경 전 score : " + scoreList[0]); // 40
// 2. changeScore() 메서드를 호출하면서 scoreList 변수를 인자로 넘김
changeScore(scoreList);
System.out.println("변경 후 score : " + scoreList[0]); // 100
}
private static int[] changeScore(int[] scoreList) {
// 3. scoreList 변수가 참조하는 객체의 0번 인덱스 값 수정
scoreList[0] = 100;
System.out.println("변경된 score " + scoreList[0]); // 100
return scoreList; // 배열 변경된 객체를 리턴함
}
}
// 변경 전 score : 40
// 변경된 score 100
// 변경 후 score : 100
따라서, 매개변수로 객체를 넘길 시
- 객체가 다른 객체의 메서드를 호출 할 때 단순히 메서드 수행에 필요한 값만 넘기고자 할 때는
- => 매개변수를 기본형으로 선언한다.
- 메서드 수행 이후에도 수행 결과를 지속적으로 유지하고자 하는 경우
- => 매개변수를 참조형으로 선언한다.
class Pair{
int x;
int y;
Pair(int x, int y) {
this.x = x;
this.y = y;
}
}
public class SwapTest {
public static void swap(int x, int y) {
// int 매개변수
int tmp;
tmp = x;
x = y;
y = tmp;
}
public static void swap(Pair p) {
// Pair 객체를 매개변수로 입력받아서 객체 변수의 값을 서로 바꾼다.
int tmp;
tmp = p.x;
p.x = p.y;
p.y = tmp;
}
public static void main(String args[]) {
// x, y 값과 Pair 객체를 초기화한다.
int x = 10, y = 20;
Pair p = new Pair(10, 20);
System.out.println("before: x, y (" + x + ", " + y + ")");
System.out.println("\tPair(" + p.x + ", " + p.y + ")");
swap(x,y);
swap(p);
System.out.println("after: x, y (" + x + ", " + y + ")");
System.out.println("\tPair(" + p.x + ", " + p.y + ")");
}
}
// before: x, y (10, 20)
// Pair(10, 20)
// after: x, y (10, 20)
// Pair(20, 10)
2. 가변적 매개변수
가변적 매개변수
- 매개변수의 숫자를 컴파일이나 실행 시에 미리 지정하지 않고 가변적으로 사용하는 방식
- 가변적 매개변수는 여러 개의 매개변수와 사용 가능. 그러나 매개변수 리스트 마지막 위치에서 한 번만 사용 가능
public class VariableArgumentTest {
public static double scoreSum(double... score) {
double sum = 0;
for (int i = 0; i < score.length; i++) {
sum = sum + score[i];
}
return sum;
}
public static void main(String[] args) {
System.out.println("국어 점수 총 합 : " + scoreSum(80, 60, 90));
System.out.println("자바 점수 총 합 : " + scoreSum(54.2, 78.5));
}
}
// 국어 점수 총 합 : 230.0
// 자바 점수 총 합 : 132.7
출처 - swexpertacademy.com/
'Java > Java Basic' 카테고리의 다른 글
[Java] 2-06 - 추상 클래스 (0) | 2021.01.10 |
---|---|
[Java] 2-05 - 자바의 상속, super, final (0) | 2021.01.10 |
[Java] 2-04 - 메서드 Overloading, this() 생성자 (0) | 2021.01.09 |
[Java] 2-03 - 생성자와 this (0) | 2021.01.09 |
[Java] 2-03 - 자바 Modifier : static, final, abstract, 인스턴스 변수, 클래스 변수, 상수, 추상 메소드와 추상 클래스 (0) | 2021.01.09 |
댓글