We will find a way, we always have.

-interstellar

Programming Language/자바

[자바] static과 static final의 유무에 따른 실행시간

Redddy 2024. 11. 23. 23:56

 

 

백준 질문게시판을 구경하고 있었는데 재미있는 글이 올라왔다.
모듈러 1,000,000,007를 static으로 두었을 때와 static final로 했을 때의 수행속도가 두배이상 차이난다는 글이었다.

우선 static과 static final의 공통점은 둘 다 모든 객체가 해당 멤버 값을 공유한다. 차이점은 static final은 상수라는 점이다. 때문에 재할당이 불가하고 해당 값이 primitive type이라면 변경도 불가하다. 

개념적인 차이점은 이제 알겠다. 그렇다면 바이트코드에선 어떠한 차이점을 가져오는지 살펴보자.

 

 

예를 들어 위와 같은 코드가 있다. (m,a,b는 입력받는 값이라고 생각하자.)

 

MOD가 static final 일 때 바이트 코드이다. 

 

static final일 때 바이트 코드

 

아래는 MOD가 static 일 때 코드이다. 

static 일 때 바이트 코드

 

static final 일때에는 상수값으로 바로 코드에 박혔지만 static일 때에는 GETSTATIC이라는 함수를 통해 MOD에 있는 값을 가져오고 있었다. final을 꼬박꼬박 붙여주면 컴파일러가 뒤에서 아무도 모르게 최적화를 해주고 있었다. 

 

 


 

바이트코드 확인하는 방법은 만약 인텔리제이 사용한다면 view -> show bytecode 에서 볼 수 있다. (단축키 지정은 별도로 해둔 것이다)

 

참고로 자바 코드만 변경한다고 바이트코드가 변경되는 것이 아니라 빌드도 해줘야 변경이 된다.