참조 (Reference) 는 프로그래밍에서 변수나 객체가 다른 객체나 값을 가리키는 방법을 의미한다.
즉, 변수나 객체가 실제 데이터를 담고 있지 않고, 그 데이터가 저장된 위치(메모리 주소)를 가리키는 방식이다.
참조를 이해하려면 값 자체와 그 값을 가리키는 주소의 차이를 이해하는 것이 중요하다.
1. 기본 데이터 타입과 참조
값 타입 (Primitive Type)
- 값 자체를 변수에 저장한다
- Int, double, char
- 값이 그대로 저장되므로 다른 변수에 값을 할당할 때 값 복사가 이루어진다.
int a = 10; // a 변수에 10 이라는 값을 저장
int b = a; // b 변수에 a 라는 값을 복사 -> b 는 10
참조 타입 (Reference Type)
- 실제 값을 저장한 메모리 위치(주소)를 저장한다
- 배열, 클래스, 인터페이스
- 변수는 값이 아니라 메모리 주소를 가리키고, 그 주소를 통해 실제 객체나 값을 참조한다
class Person {
String name;
}
// Person 객체를 생성하고, 그 객체의 메모리 주소를 p1에 저장
Person p1 = new Person();
// p1이 가리키는 객체의 name 속성에 "Alice"를 저장
p1.name = "Alice";
// p2가 p1을 참조하므로 p2도 같은 객체를 가리키게 됨
Person p2 = p1;
// p2가 가리키는 객체의 name 속성을 "Bob"으로 변경
p2.name = "Bob";
// "Bob"이 출력됨. p1과 p2는 동일한 객체를 참조하기 때문
System.out.println(p1.name);
2. 참조의 특징
- 주소를 가리킨다: 참조는 값이 아닌 주소를 저장한다. 이 주소를 통해 해당 값이나 객체에 접근할 수 있다.
- 간접 접근: 객체나 배열의 실제 값은 참조를 통해 접근한다.
- 참조 복사: 참조형 변수는 객체의 복사본을 만들지 않고, 단지 다른 변수가 같은 객체를 참조하도록 할 뿐이다. 이로 인해 객체가 참조형 변수들 간에 공유될 수 있다.
3. 참조와 메모리 관리
- 스택(Stack): 기본 데이터 타입(값)은 스택에 저장된다. 스택은 값이 저장된 위치이다.
- 힙(Heap): 객체나 배열 등 참조 타입은 힙에 저장되고, 참조 변수는 그 주소를 스택에 저장한다.
public class ReferenceExample {
public static void main(String[] args) {
// 기본 데이터 타입
int x = 5;
int y = x; // 값 복사
y = 10; // y 값만 변경되고 x는 그대로 5
// 참조 타입
String[] arr1 = {"A", "B", "C"};
String[] arr2 = arr1; // arr2는 arr1이 가리키는 배열을 참조
arr2[0] = "Z"; // arr2에서 첫 번째 값을 변경하면 arr1도 영향을 받음
System.out.println(arr1[0]); // 출력: Z
}
}
위의 코드에서 arr1 과 arr2 는 같은 배령 객체를 참조하므로, arr2 에서 값을 변경하면 arr1 도 영향을 받는다. 이는 참조가 값이 아닌 주소를 저장하기 때문이다.
4. 참조와 값 복사 차이
- 기본 타입: 값 복사, 즉 변수에 저장된 실제 값을 다른 변수에 복사한다.
- 참조 타입: 객체의 주소를 복사한다. 그래서 여러 변수가 동일한 객체를 가리키게 된다.
'Java > 기본' 카테고리의 다른 글
[Java] 객체지향 프로그래밍 (3) | 2024.11.14 |
---|---|
[Java] 컴파일 오류? 런타임 오류? (1) | 2024.11.14 |
[Java] 순환참조 (1) | 2024.11.14 |
[Java] @NoArgsConstructor, @AllArgsConstructor (0) | 2024.11.12 |
[Java] 트랜잭션 (0) | 2024.11.11 |