[Java] 메모리, 성능 관점에서 템플릿 리터럴을 사용해야 하는 이유

Hyo Kyun Lee·5일 전
0

Java

목록 보기
64/66

1. 개요

어느날 개발 표준 관련 공지사항 중에 템플릿 리터럴, 동적 변수 관련 내용이 있었다.

내용의 요지는 템플릿 리터럴을 사용하고, 문자열을 붙이는(+) 형식의 로그 혹은 메시지 처리는 사용하지 말라는 것이었다.

이 부분에 대해 질문을 드렸는데, 메모리 관련한 이유라고 말씀하셨고 더 자세한 이유가 궁금해서 계속 찾아보았다.

찾은 내용을 정리하였고, 성능개선에 영향을 미치는 부분이 있다고 생각하여 기록한다.

2. 템플릿 리터럴을 사용해야 하는 메모리 관점의 사유

일단, 로직으로 나타낸다면

int test = 0; 이라는 변수가 있을때

"안녕하세요 test 변수는 " + test + " 입니다.";

의 문자열 형식이 아닌

"안녕하세요 test 변수는 '{0}' 입니다", test

의 형식으로 템플릿 리터럴 형식으로 전달해야 한다.

일단 메모리 관점에서 첫번째나 두번째나 변수나 변수 전달과정에서의 유효한 차이점은 없다.

즉 어차피 변수는 Stack 공간에 할당되고, 객체는 이를 참조하고...이러한 과정은 동일하다는 의미이다.

중요한 점은 문자열의 구성 방식이었는데, 이게 무시할 수 없을 정도로 차이가 크다.

첫번째 형태의 경우 ""로 이루어진 각기 다른 String 객체들이 만들어지면서(저 한줄에도 문자열을 붙이는 과정이 두번이나 존재), 만들어질때마다 발생하는 gc나 새로운 객체 생성 등의 과정 등으로 인해 메모리 관점이나 성능 관점이나 매우 안좋은 형태이다.

두번째 형태의 경우 일단 가독성도 좋아졌고, 하나의 문자열 객체안에 동적 변수를 할당한 형태로 첫번째 형태보다 메모리, 성능 관점에서 모두 유리한 형태이다.

사실 두번째 형태도 StringBuilder 등을 통해 더 세세한 성능 개선이 가능하다.

String 객체와 달리, StringBuilder는 새로운 객체를 생성하지 않으며 내장 메소드를 제공하므로 여러모로 사용하기 수월하다.

계속 찾다보니까 드디어 왜 저 형태를 사용하면 안되는지 알 수 있었다.

3. 참고자료

리터럴과 메모리 관계 - https://www.codelatte.io/courses/java_programming_basic/U4QLQ40D1OO82S93
java에서 String 객체를 조심해야 하는 이유 - https://ssdragon.tistory.com/124
java에서 동적변수 전달 방법 - https://warpgate3.tistory.com/entry/Message-Format#google_vignette

0개의 댓글