Java의 String은 불변 객체입니다. String a와 String b가 있을 때, a = a+b; 이 문장은 어떻게 동작할까요? 결론부터 말하자면, 비효율적으로 동작합니다. 어디서 오버헤드가 많이 발생하는지 천천히 분석해 보도록 합시다. 디버깅을 해 볼 프로그램은 아래와 같습니다. String 객체 str에다가 "05"라는 String을 계속 +하고 있습니다. String a와 b가 있을 때, a+b의 결과값은, String a 뒤에 b를 이어 붙인 String 객체입니다. 예를 들어서, a가 "chogahui"이고 b가 "05"라면, a+b는 "chogahui05"입니다. 9번째 줄에 break point를 걸어두고 어떻게 함수를 호출하는지 간략하게 보도록 하겠습니다. 일단, 뜬금없이 Strin..
레퍼런스 검색 결과
c++이나 java에는 부분 문자열을 가지고 오는 함수가 있습니다. 각각 substr과, substring이에요. 예를 들어, 어떠한 문자열 str = "chogahui"가 있고, 1번째부터 3번째까지 가지고 온 부분 문자열 sub = "hog"일 거에요. 이걸 가지고 오는 함수를 string.h에서는 찾기가 힘듭니다. 그러면 이것을 어떻게 구현해야 할지, 생각해 봅시다. 사실 핵심적인 것은 간단합니다. 어떠한 시작 위치에서부터 t개 만큼을 어딘가로 복사한다. 만약에 문자열 str에서 [s,e)까지의 부분 문자열을 복사한다면 e-s개를 어딘가로 복사를 하는 것입니다. 그러면, 문자열을 복사를 하는데, 시작 위치로부터 t개만큼 copy 하는 함수를 찾으면 되는데요. 그것이 strncpy 함수입니다. cha..
문자열 안에서 pat 이라는 문자열이 있는지 찾는 함수는 strstr이였습니다. wandbox에서는 생각보다 빠르게 그 함수가 동작하는데, 그 이유는 언젠가 한 번 문자열 알고리즘을 하면서 뜯어 본다고 했었어요. 사실 벌써부터 쉽지 않을 거 같은 예감이 드네요. 오늘은 문자열 안에 어떠한 문자가 있는지를 판단하는 함수를 배워볼 건데요. 그 함수는 strchr입니다. 원형을 봅시다. char *strchr(const char *str,int ch); char형 포인터를 리턴합니다. str이라는 문자 열에서, ch가 나타나는 최초의 위치를 리턴합니다. 만약에 나타나지 않는다면 NULL 값을 리턴해요. 어렵지 않아요. 예를 들어 문자열 str이 "chogahui05"가 있었다고 해 봅시다. 그러면 여기서, '..
strstr의 세부 구현은, 문자열 알고리즘을 하면서 차차 알아가도록 합시다. C언어에서, 어떤 문자열에서 특정한 문자열이 있는지 (패턴), 간단하게 찾기 위해서 strstr를 이용하면 좋습니다. 이 친구는 다음과 같이 씁니다. char *strstr(const char *str,const char *pat); str 안에 pat이 있는지 찾습니다. 만약에 있다면, 찾은 최초의 위치를 리턴합니다. 그렇지 않다면 NULL을 리턴합니다. 예를 들어서 설명해 보겠습니다. 저는 "chogahuigatrainlike"에서 "ga"를 찾으려고 합니다. 그러면 strstr은 어떤 것을 리턴할까요? char형 포인터를 리턴하니까, char형이 저장되어 있는 공간을 가리키는, 주솟값을 리턴할 건데요. str이 이런 식으..
Java에는 StringBuilder와 StringBuffer가 있습니다. 이들은 어떻게 구현이 되어 있길래 append 연산을 하는데, String보다 압도적으로 빠를까요? 사실, 이 두 클래스에는 메서드 2개가 공통적으로 있다는 것을 보실 수 있습니다. 그 중에서, capacity는 눈에 띄는 함수입니다. 이것은 실제로 StringBuilder와 StringBuffer가 얼마만큼의 문자를 넣을 수 있는지 리턴해 주는 메서드인데요. 동적 배열로 따지면, 실제 배열에 할당된 크기를 의미합니다. 그러면 size와 String의 무엇과 대응이 될까요? 당연하게도 length일 거에요. 실제로 저거랑 size가 쌍으로 붙어 있다면 십중 팔구 동적 배열이다. 라고 생각하셔도 무난합니다. 저는 이 두 메서드를 가..
최근댓글