이번에는 우리가 기록을 남길 때 사용하는 문자, 그리고 문자열에 대해서 알아보도록 하겠습니다.
우선 우리는 여기서 한 가지 알아야 할 사실이 있습니다. 0과 1밖에 모르는 컴퓨터가 어떻게 문자를 아는가에 대한 내용 말입니다.
이미 다른 글에서 이에 대한 내용을 언급한 바가 있습니다.
만약 읽어보셨다면 짐작이 가실 겁니다.
바로 2진수를 이용해 10진수를 만들어 번호에 해당하는 문자를 인식하는 것입니다.
즉 65라는 숫자가 들어온다면 A라고 인식하는 것이죠.
그럼 이 표는 누군가가 정하는 걸까요?
바로 국제 표준으로 자리 잡고 있습니다. 아스키코드(ASCII CODE)라는 이름으로 말이죠.
이렇게 생성된 한 글자를 우리는 문자(character)라고 부릅니다. 그리고 이 문자를 담는 변수의 데이터타입을 char라고 표기하죠.
원래 프로그래밍 언어에서는 이 문자 하나만을 다뤘었습니다.
그 이유는 그때까지만 해도 프로그램이라는 것이 기계에게 명령을 내리는 나와 기계와의 대화였기 때문이죠.
하지만 시대가 바뀌고 사용자가 사용하는 프로그램으로 변모하면서, 이제는 사용자에게 많은 정보와 구체적인 설명을 해야 하는 시대가 왔습니다. 그래서 문자만 가지고는 사용자에게 많은 정보를 줄 수 없기에 여러 문자를 전달하기 위해 노력하게 됩니다.
문자를 여러 개 담기 위해서는? 문자를 담는 배열이 필요했습니다. 그래서 문자 배열, 즉 문자열이 필요했던 것입니다.
그런데 이 문자 배열을 좀 더 편리하게 사용하기 위해서 여러 메서드들을 추가하여 클래스를 하나 만들게 됩니다. 바로 String이라는 클래스입니다.
그러고 보면 기본 데이터 타입 중에 문자열만 앞에 대문자 였습니다.
여기서 이미 클래스라는 표시를 하고 있었던 것이죠.
그리고 싱글쿼터(작은따옴표)가 아닌 더블쿼터(큰 따옴표)로 값의 영역을 지정합니다.
그리고 당연하게도 문자열을 선언한다는 것은 해당 클래스를 사용하는 것이기 때문에 객체화 가 내부적으로 진행됩니다.
그래서 문자를 이렇게 누적으로 더할 때마다 객체가 계속 생겨나게 됩니다.
단순히 많다고 안 좋은 것은 아닙니다.
우선 과거 내용을 복습해 보겠습니다.
클래스를 사용하기 위해 객체화(복사)를 하면 Heap이라는 메모리 영역에 저장된다고 하였습니다.
이 객체들 중에서는 사용하는 것(빨강)과 더 이상 사용하지 않는 것(검정)들이 있습니다.
더 이상 사용하지 않는 객체는 JAVA의 청소부인 가비지컬렉터(Garbage Collector)가 청소를 해 줍니다.
그런데 이 친구가 한 번에 사용하지 않는 모든 객체를 잘 청소해 주는 것은 아닙니다.
우리도 책상 정리를 하다 보면 자잘하게 많은 쓰레기는 한 번에 치우기 힘든 것처럼요.
그러다 보면 사용하지 않지만 메모리 속에 오래 남아있는 객체가 생기기 마련이고, 이것들이 쌓이다 보면 메모리 부족으로 이어질 수도 있습니다.
그래서 이 경우는 차라리 자잘한 객체 여러 개보다는 커다란 객체 하나를 사용하는 것이 더 유리합니다.
이런 점을 착안하여 JAVA에서는 또 다른 클래스를 만들었습니다.
바로 StringBuffer와 StringBuilder라는 녀석인데요.
이 녀석들은 글자를 추가할수록 여러 객체를 만드는 것이 아닌 한 객체의 크기를 늘려나가는 방식을 사용합니다. 많은 글자를 합하여 사용할 때는 이 클래스들이 더 유용하겠죠?
이 두 클래스는 하는 일과 사용법이 모두 동일합니다.
그럼 어떤 차이가 있느냐고요?
바로 동기화 사용 여부(synchronized)의 차이입니다.
이게 무엇인지는 나중에 스레드(thread)라는 것을 배우면서 언급하고 이 그림을 다시 보여드릴 예정입니다. 이렇게 컴퓨터가 문자를 이해하는 방법과, 문자 배열인 문자열, 그리고 이 문자열의 단점을 보완한 StringBuffer와 StringBuilder 클래스까지 알아보았습니다.