Dong이 스트링에 대한 질문을 올렸다.
static String PSY ="싸이의" + "강남" + "스타일";
위의 코드를 실행하면 호출할 때마다 연산이 일어나는지, 아니면 처음에 한 번만 일어나는지에 관한 것이었다. 추가적으로 스트링 빌더에 관한 것도 있었다. 예전에 static과 생성자 등의 컴파일 결과가 어떻게 되는지 확인했었기 때문에 static 블록 안에서 초기화가 이루어질 것이라고 생각을 했다. 그리고 추가적인 StringBuilder의 호출도 바이트 코드로 볼 수 있지 않을까하고 기대했는데, StringBuilder가 나타나지 않았다. 분명 String의 연산은 StringBuilder로 최적화 된다고 들었는데, 내가 메소드를 확인하는 방법이 틀렸나 한참 찾아보고 고민해봤다. 그러다 우연히 다른 코드의 바이트 코드를 함께 봤는데, 스트링 빌더가 들어가있었다.
일단 내가 찾은 규칙은, = 연산자로 할당 이후 본인을 포함한 추가연산을 할 때 혹은 Sysout으로 변수 없이 바로 출력을 할 때 정도로 확인을 했다. 일단 놀라웠던 것은 초기에 변수 할당에 StringBuilder가 쓰이지 않았다는 것이다. JVM의 명세를 자세히 읽어봐야 나올 것 같은데 너무 어려워서 중간에 멈췄다.
그리고 명령어를 모르는 것도 바이트 코드를 읽는데 어려움이 었는데, 대충은 파악이 된 것 같다. 어셈블리어를 알면 도움이 좀 될 것 같은데, 머릿속에서 스택구조와 매칭이 잘 되지 않아 많이 헷갈렸다. 그래도 상수 풀에서 참조가 되면 변수 배열에 그 만큼 사이즈를 차지하게 된다는 놀라운 사실을 알게됐다. 명령어도 너무 장황해서 조금 보다가 멈췄다. 쉽게 설명해주는 사람이 있었으면 좋겠는데... 일단 쉬운 자료를 한 번 찾아보고 다시 보던지 해야겠다.
Powered with by Gatsby 2.0