Java/기본

[Java] 참조란 무엇일까?

댕주 2024. 11. 14. 00:56

참조 (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