Java 를 쓰다보면, StringBuffer 와 StringBuilder 등을 만나게 된다.
다른 OOP 언어를 써도 이런 경우가 발생할 수가 있다. StringBuffer 가 나은지, StringBuilder 가 나은지 를 떠나서.
왜 이런 경우가 발생하는지에 대해서 이야기를 해보고자 한다.
여기서 하는 말은 모두 추상적인 상상으로 기술하는 내용이다. 우리가 깊숙히 들어갈 필요는 없이 상상 만으로 짐작해 볼 수가 있다.
문자열 a = "가나다라마바사아자차카타파하"
라는 구문이 있다고 하자. 이 문자열은 길이가 명확하다. 14글자 이고, 이것은 byte 로 치환하면 일정한 바이트가 나올 것이다. 이것은 메모리에 넣어두기가 매우 유용하다.
짐작적으로 볼 때에, 이러한 고정된 문자열은
1) 클래스안에 같이 있으면서 컴파일이 되어버리거나,
2) 메모리 안에 다른 영역 안에 문자열만 차곡차곡 존재한다거나,
3) static 처럼 관리가 된다거나.
4) 기타 등등
으로 메모리 관리가 될 것을 추측해 볼 수가 있다. 일단은 immutable (불변) 한 상태이고. 이것을 어렵게 생각할 거 없이 아무데나 쳐 넣어도 상관은 없는 문제이기 때문이다.
이제 문제가 되는 것은 무엇이냐면.
1) 사용자로부터 문자열을 받는다.
2) for 문이나 while 문을 통해서 문자열이 계속 추가가 된다. (임시적인 문자열 찌꺼기가 매우매우 많이 발생한다)
이런 경우를 떠올려 볼 수가 있다.
for(10번 정도 반복)
문자열 a = 문자열 a + "가나다라마바사아자차카타파하";
이제 문자열의 길이는 가변적이 되었다. 물론 결과를 예상해볼 수는 있지만, 돌려보기 전에는 알 수는 없다. (우리의 Exception 이 있기 때문이다. 복잡한 경우 Exception 이 발생한다면? 문자열의 길이는 어디서 멈춰있을까...)
문자열의 길이가 14, 28, 42 ....
이런식으로 늘어나게 된다. 그나마 위의 경우는 단순하니까 "가나다~파하" 를 어딘가에 저장해두고, 한번씩 추가 될때마다 "가나다라~~파하가나다라~파하"(2번 왕복 때), (3번 왕복 때) ... 이런식으로 저장해둘 수도 있을 것이다.
문자열이 아닌 경우에는 일반적인 데이터타입등을 대부분 크기를 갖고 있다. 문자열의 경우와 다른 몇몇 경우에만 발생하는 경우이다.
좀 더 깊게 들어간다면, 스크립트형의 언어에서는 구문을 좍 돌리고 끝. 이기 때문에 이 부분이 실은 크게 문제는 되지 않는다.
1) 자바나 C# 처럼, 메모리상에 둥둥 떠 있는 언어라거나
2) 디비처럼 하루종일 일년내내 돌려야 하는 경우라거나.
등등
이런 경우에는 메모리관리가 문제가 되는데. 길어졌다 짧아졌다 하는 친구는...메모리에 구멍을 만들어놓기 쉬울 것이라는 것을 짐작해볼 수가 있다.
그래서 결론적으로는 Buffer(버퍼) 같은 개념을 사용하게 되는 것이다. 임시 공간을 만들어놓고, 거기서 문자열을 넣고 빼고 조립한 후에 완성된 것만 문자열로 메모리에 넣어놓는다. 그리고 버퍼는 휴지통에 비워버린다.
작업실을 생각해보면 쉬운데, 우리가 의자를 만드는 과정에서. 이런저런 찌꺼기와 등등이 나오는데. 작업실에서 의자를 완성한 후에, 의자만 고객에게 넘겨주는 것이다. 그리고 작업실은 싹 청소 하는 개념이라고 생각하면 쉽다.
위의 글은 정확한 개념의 글은 아니고, 대충 짐작해볼 수 있는 수준으로 작성해보았다. 깊게 들어가보면 훨씬 재밌다. 메모리가 어디에 있다가 어디로 가고... 그런데 깊게 들어가다보면 끝이 없기 때문에. 간단하게만 적어보았다. 그리고 깊게 들어가서 메모리 관리와 문자열 처리에 관한 부분은, 언어마다 다르고 시대에 따라서 처리 방법도 나아지기 때문에 기술하지는 않았다.
참고로 이런 이유로 인해서, 데이터베이스 에서는 CLob 과 같은 타입을 쓰기도 하는 것이다. Clob (또는 어떠한 디비에서는 BLOB 이나 TEXT 타입 등등) 타입은 별도의 공간에 모아서 저장해둔다. 이유는 변동적이기 때문이다. 데이터베이스는 효율적인 것을 좋아하기 때문에, 공간의 개념이 mutable 인지 immutable 인지에 따라서 분리해서 저장하려는 성향이 있기 때문이다.
'개발 > 자바 Java' 카테고리의 다른 글
[JAVA] Double Float 형의 오차 (0) | 2016.06.11 |
---|---|
[Java] (error) error : java.lang.UnsupportedClassVersionError (0) | 2016.06.07 |
[Java] webservlet annotation (0) | 2016.06.07 |
[자바 Java] XML 값가져오기 (0) | 2016.05.01 |
자바 와 서블릿 (0) | 2011.07.29 |
rs.getDate 와 rs.getTimestamp() 의 차이 (0) | 2011.02.17 |
JAVA_변수 형 변환 (0) | 2011.01.31 |
[JSP] 한글 파라미터 처리 (0) | 2011.01.04 |