우당탕탕

[Java] static(정적) 변수와 메모리에 대해 본문

언어/Java

[Java] static(정적) 변수와 메모리에 대해

모찌모찝 2022. 11. 2. 19:00
static변수와 메모리에 대해


1. static 키워드

자바를 사용하다 보면 static 키워드가 붙은 함수나 변수를 만들어 본 적이 있을 것이다. 오늘은 이 static 키워드를 메모리 관점에서 얘기해보려 한다.

일반적으로 아래와 같은 코드처럼 new를 사용하여 생성한 객체는 메모리의 Heap 영역에 생성되며, static 키워드로 만들어진 변수는 static 영역에 할당된다. static 키워드를 사용하게 되면 메모리에 처음 한번 생성되며, 프로그램이 종료될 때 사라지게 된다. ( 우리가 만드는 class들도 static영역에 한번 생성된다 ) 

public class Something {
	
    public static String some(){
    	return "";
    }

}


Something something = new Something(); // new


여기서 특징으로는 Heap 영역의 경우 GC(Garbage Collector)에 의해 지속적으로 사용하지 않는 객체들은 제거가 되지만 static 영역은 GC가 관리하지 않는다!

static 키워드가 붙은 변수나 메서드들은 [클래스명]. [메서드/변수]를 통해 사용이 가능하며, new 연산을 사용하지 않고 (객체를 생성하지 않고) 바로 사용할 수 있다.

@Slf4j
public class Constants {
    public static String TEST_ID = "Test1";

    public static String test(String x) {
        return x;
    }
    
    public String test1(String x){
        return x;
    }

}

log.info(Constants.TEST_ID);
Constants.test("HI"); // static
Constants.test1("HI"); // new 연산을 통해 생성 후 사용가능 
// ex
Constants c = new Constants();
c.test1("HI")


new 연산을 통해 여러 번 객체를 생성해서 사용하게 되면 메모리를 계속 사용하게 되어 효율이 떨어지게 된다. 이로 인해 보통 자주 사용하는 변수들은 static 키워드를 사용하여 메모리 효율을 높여 사용하게 된다.

1. static 변수
자주 사용하는 변수는 아래와 같이 Constants 파일을 만들어 자주 사용한다.

public final class Constants{

    public static final String SERVER_URL = "http://localhost:8080";
    public static final String SESSION_ID = "session";
    public static final String SOME_THING = "something";
    
}

2. static 메서드
메서드의 경우 유틸 성 함수들을 모아서 사용하게 되는데 static 변수와 사용법은 비슷하다.

public final class Utils{
    
    public static double randUtil() {
    	return Math.random();
    }

}

 

Comments