새발블로그
레퍼런스 타입 매개변수 본문
레퍼런스 타입 매개변수 (Reference Type Parameter)
Java에서 함수에 값을 넘길 때, 기본형(Primitive Type)과 참조형(Reference Type)은 작동 방식이 다르다.
1. 기본형(Primitive Type)과 참조형(Reference Type)
| 구분 | 예시 | 전달 방식 | 원본 변화 |
| 기본형 | int, double, boolean 등 | 값 자체를 복사 | ❌ 변화 없음 |
| 참조형 | List<T>, int[], Map<K,V> 등 | 참조(주소)를 복사 | ✅ 원본이 함께 수정됨 |
2. 참조형 매개변수의 특징
참조형 데이터는 객체의 주소값이 함수로 전달된다.
함수 내에서 이 객체를 수정하면, 호출한 곳의 원본 객체도 함께 수정된다.
예제: 리스트 요소 증가시키기
import java.util.*;
public class IncrementElements {
// 리스트의 모든 요소를 1 증가시키는 함수
public static void incrementElements(List<Integer> data) {
for (int i = 0; i < data.size(); i++) {
data.set(i, data.get(i) + 1);
}
}
public static void main(String[] args) {
List<Integer> numbers = new ArrayList<>(List.of(1, 2, 3));
incrementElements(numbers); // 함수 호출
System.out.println("원본 리스트: " + numbers);
}
}
출력 결과:
원본 리스트: [2, 3, 4]
3. 원본을 보호하려면?
원본 데이터를 변경하지 않으려면, 함수 호출 전에 깊은 복사(Deep Copy)를 해야 합니다.
import java.util.*;
public class IncrementElements {
public static void incrementElements(List<Integer> data) {
for (int i = 0; i < data.size(); i++) {
data.set(i, data.get(i) + 1);
}
}
public static void main(String[] args) {
List<Integer> numbers = new ArrayList<>(List.of(1, 2, 3));
// 복사본 생성
List<Integer> copiedNumbers = new ArrayList<>(numbers);
incrementElements(copiedNumbers); // 복사본 수정
System.out.println("원본 리스트: " + numbers);
System.out.println("복사본 리스트: " + copiedNumbers);
}
}
출력 결과:
원본 리스트: [1, 2, 3]
복사본 리스트: [2, 3, 4]