인프런 커뮤니티 질문&답변

backendman님의 프로필 이미지
backendman

작성한 질문수

김영한의 실전 자바 - 기본편

static 변수1

클래스 상수 선언

작성

·

56

·

수정됨

1

안녕하세요.

 

만약 flag 값이 1이면 데이터를 빨간색으로 표기한다 라고 가정했을때

 

private static final String RED = "1";

 

if(param.getFlag().equals(RED)){

.... 빨간색 표기 로직

}

저는 이런식으로 상수를 선언해

추후 소스를 봤을때 "1" 이라는 코드가 뭘 나타내는지 이해하기 쉽게 개발을 진행하고 있습니다.

 

근데 static 변수와 같은경우 메모리에 계속 떠있다보니

클래스에서 이런식으로 static 변수를 계속 선언하는것이 메모리 부족에 영향을 끼치지는 않을지? 걱정이 들기 시작했습니다.

 

톰캣 서버의 jvm 메모리가 1gb 라고 가정했을때

메모리 걱정을 하지않고 static 변수를 선언해도 괜찮을까요?

 

아니면 이런 경우 그냥 static 키워드를 제거하고

private final String RED = "1"; 이렇게 사용해서 gc 의 대상이 되도록 하는게 바람직할까요?

답변 2

1

안녕하세요. backendman님, 공식 서포터즈 OMG입니다.

서버 성능의 제약이 있지만, 말씀하신 상황에선 고려하지 않아도 될 것 같습니다.

static 변수가 메모리 부족에 미치는 영향은 아주 미미합니다.

JVM 메모리가 1GB여도 static 변수로 문자열 같은 작은 데이터를 선언한다고 하여 메모리에 부담이 가는 경우는 거의 없다고 봅니다.

특히, private static final String RED = "1"; 같은 상수는 클래스 로드 시 메모리에 한 번만 올라가며, 상수 풀에 저장되고 매번 새로 생성하는게 아닌 재사용되기 때문에 메모리 사용량이 매우 적을 것이라 생각합니다.

 

오히려 비효율적인 로직 처리(대량의 데이터의 이중 for문 실행 등)와 네트워크 통신에서 발생하는 메모리 관점에서의 비용 등을 고려하는 게 성능을 바라볼 때 더 필요한 관점이라 생각합니다.

 

감사합니다.

backendman님의 프로필 이미지
backendman
질문자

답변감사합니다

0

저가 지금까지 배운걸로 생각 해 보기에는.

if(param.getFlag().equals(RED)){

.... 빨간색 표기 로직

}

이 코드가 static이 붙은 method() 안에 있는가? 아니면 그냥 static이 안 붙은 method() 안에 있는 걸로 판단해서 static변수로 할지 그냥 일반 변수로 할지 정할것 같습니다.

추가1

근데 너무 사용하지 않는다면 그냥 놔둬도 상관 없을 것 같긴 하네요.

요즘 메모리가 최소 16gb(수정: 컴퓨터 메모리 였습니다. jvm은 아니었어요..) 아닌가요?

backendman님의 프로필 이미지
backendman
질문자

안녕하세요

웹서버 호스팅같은경우

저렴한 버전은 메모리가 작거든요^^ ㅎ ㅎ

그렇군요. backdendman님 알켜주셔서 감사합니다.

backendman님의 프로필 이미지
backendman

작성한 질문수

질문하기