울음참고 개발공부
Published 2024. 9. 30. 10:35
Java | 참조(Reference) Java
728x90

 

 

 

 

 

 

 

 

 

참조의 의미와 자바의 GC(가비지컬렉터)가 어떻게 동작하는지 

초보자의 시점에서 알아보자 

 

 

 

 

 

 

참조(Reference)란?

 

 

 

 

어떤 객체를 가리키고 있다는 뜻 

- 객체의 주소를 기억해서 그 객체에 접근할 수 있게 해주는 역할

 

 

 

예시

public class Example {
    public static void main(String[] args) {
        Person person = new Person(); // 'person'은 Person 객체를 참조하고 있음
        person.setName("John");
        
        Person anotherPerson = person; // 'anotherPerson'도 같은 Person 객체를 참조함
        
        System.out.println(person.getName()); // John
        System.out.println(anotherPerson.getName()); // John
    }
}

class Person {
    private String name;
    
    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

 

 

 

 

설명

 

  • 'Person person = new Person();'  해당 코드에서 'new Person()'으로 만들어진 객체는 Heap(힙) 메모리에 저장되고 person 이라는 참조 변수가 그 객체를 가르키고 있음
  • 그 후에 `Person anotherPerson = person;' 코드를 보면 anotherPerson 도 같은 Person 객체를 가르키고 있음
  • 즉, 같은 객체를 두개의 참조변수가 가르키고 있는 상태이다

 

< 핵심 >

 

-> 참조변수(person, anotherPerson )는 객체가 어디에 저장되어 있는지 기억하고 있음

->  이 참조가 사라지면(더 이상 아무도 가르키지 않으면), 그 객체는 더이상 사용되지 않는 객체가 됨

 

 

 

 

참조가 사라지는 경우 

 

 

 

참조가 사라진다는 것? 

 

: 더 이상 그 객체를 가르키는 변수가 없다는 뜻 

( 또는 변수를 null 로 설정하면 참조가 끊기게 됨) 

 

 

 

 

예시

public class Example {
    public static void main(String[] args) {
        Person person = new Person(); // Person 객체를 생성하고 참조
        person.setName("John");

        person = null; // 참조를 끊음, 이제 Person 객체를 가리키는 변수가 없음
    }
}

 

 

 

설명

 

  • 'person = null;' 이 코드는 'person' 변수가 더 이상 'Person' 객체를 가르키지 않겠다고 선언하는 부분임
  • 'Person' 객체를 참조하는 변수가 없기 때문에, 그 객체는 사용하지 않는 객체가 됨
  • 이때, 가비지 컬렉터는 더 이상 사용되지 않는 객체들을 메모리에서 제거하기 위해 동작함 

 

 

 

 

자바의 가비지 컬렉터(Garbage Collector)

 

 

가비지 컬렉터는 더 이상 사용되지 않는 객체들을 메모리에서 자동으로 제거해주는 역할

 

 

- 객체가 메모리에 계속 남아 있으면 메모리가 낭비되기 때문에 자바에서는 명시적으로 객체를 제거할 필요없이, 가비지 컬렉터가 그 역할을 대신해줌

 

 

 

예시

public class Example {
    public static void main(String[] args) {
        Person person1 = new Person(); // 객체 생성
        person1.setName("John");

        Person person2 = new Person(); // 또 다른 객체 생성
        person2.setName("Doe");

        person1 = person2; // person1이 이제 person2를 가리킴 (기존 객체 참조가 사라짐)
        
        // 이제 'John'을 저장하던 객체는 참조되지 않음 -> 가비지 컬렉터의 대상이 될 수 있음
    }
}

 

가비지 컬렉터가 동작하는 시점 

가비지 컬렉터가 즉시 동작하는 것은 아님
자바의 가비지 컬렉터는 필요할 때, 메모리가 부족할 때 또는 JVM  이 적절하다고 판단될 때 실행됨

=> 가비지 컬렉터의 타이밍은 정확히 예측하기 어려움 

 

 

 

 

요약 

 

  1. 참조는 객체를 가르키는 변수로, 참조가 있는 한 객체는 메모리에서 삭제되지 않는다.
  2. 참조가 사라지면 그 객체는 더 이상 사용되지 않는다고 판단되어 가비지 컬렉터가 해당 객체를 메모리에서 삭제할 수 있다.
  3. 자바의  GC는 개발자가 직접 메모리를 관리하지 않아도 자동으로 메모리를 해제해주는 기능이다. 하지만 언제 동작할지는 JVM이 판단하기 때문에 그 시점을 예측하기 어렵다. 

 

 

 

 

728x90
profile

울음참고 개발공부

@메각이

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!