ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] Static이란? / Garbage Collector
    Language/Java 2019. 10. 6. 15:53

     

     

    public static void main(String[] args) {
    		
    }

     

    자바 프로젝트가 실행될 때, 코드의 시작이 되는 부분이 바로 main메소드라는 것은 다들 아실 텐데요.

    'public'은 접근 제한자, 'void'는 리턴 타입, 'main'은 메소드 이름인데 'static'은 뭐지? 하는 생각을 해보셨을 수도 있습니다.

     

    오늘은 static이 무엇인지, 어떤 역할을 하는지에 대해 알아보겠습니다.

     

    우선, static키워드를 사용하면 해당 데이터는 프로젝트가 실행될 때 메모리 Heap이 아닌 별도의 공간에 자동으로 올라가고 프로그램이 종료될 때까지 남아있게 됩니다.

     

    Garbage Collector

    여기서 알아야 할 개념 중 하나가 Garbage collector인데요. JVM이 수행하는 여러 가지 역할 중에 하나인 가비지 콜렉터는 더 이상 사용하지 않는 즉, 유효하지 않게 된 메모리를 알아서 정리해주는 기능입니다.

    지난 포스팅에서 사용했던 Test클래스로 예를 들어보겠습니다.

     

    public class Test{
    
    	  public static void main(String [] args){
    	    
    	    Car benz = new Car();
    	    System.out.println("--------------벤츠--------------");
    	    benz.setPrice(300);
    	    benz.setColor("blue");
    	    benz.drive(80);
    	    System.out.println("price : "+benz.getPrice());
    	    System.out.println("color : "+benz.getColor());
    	    System.out.println("benz : "+benz);
    
    	    benz = new Car();
    	    System.out.println("benz : "+benz);
            
            ...
            
          }
      }

     

    benz라는 변수에 Car 객체를 생성해서 데이터를 할당한 후, benz변수에 또다시 새로운 Car 객체를 생성했습니다.

    처음에 생성한 객체와 다음에 생성한 객체는 분명히 다른 객체입니다. (같은 붕어빵 틀에서 찍어낸 다른 붕어빵!)

     

    위 코드를 실행해보면 다음과 같은 결과가 출력됩니다. 

     

    Object에는 주소 값이 할당된다는 것을 지난 포스팅에서 언급한 바 있습니다. 이에 첫 번째 할당 후 benz와 두 번째 할당 후 benz값을 출력해보았더니 서로 다른 주소 값을 가지는 것을 확인할 수 있습니다.

     

    요 내용을 그림으로 표현해 보았습니다.

    처음에 benz변수에는 '주소 값 A'가 저장되어있었을 것입니다. 하지만 새로 Car객체를 생성하여 benz변수에 할당하는 순간 그림에서처럼 메모리 Heap에는 기존의 Car객체와는 별개의 객체가 생성되고 이 객체를 가리키는 '주소 값 B'가 benz변수에 저장됩니다.

     

    그럼 주소 값 A는 어떻게 되는 걸까요? 더 이상 주소 값 A에 위치한 Car객체는 사용할 수 없습니다. 하지만 메모리 Heap에는 여전히 남아있습니다. 이러한 경우에 가비지 콜렉터가 필요한 것입니다.

     

    유효하지 않은 데이터가 메모리 공간을 차지하는 경우 이를 자동으로 정리해주는 것을 가비지 콜렉터라고 합니다.

     

    이 가비지 콜렉터는 Heap에서의 메모리를 정리해주는 역할을 하는데요, 위에서 static키워드를 사용하면 Heap이 아닌 별도의 공간에 저장된다고 말씀드렸습니다. 즉, static키워드를 사용하면 가비지 콜렉터의 영향을 받지 않는다는 이야기입니다.

     

    따라서, static 키워드를 사용하여 선언된 변수, 메소드, 생성자 등은 사용 여부, 객체 생성 여부에 관계없이 실행과 동시에 메모리에 올라가고 가비지 콜렉터의 영향을 받지 않고 프로그램이 종료될 때까지 존재합니다.

     

     

Designed by Tistory.