이런 질문을 많이 받았습니다. String a와 String b가 있다면, a == b는 false이지 않나요? 사실 참조 타입에서 == 연산자는 가리키는 객체가 다르면 false를 리턴합니다. 그런데, 이 친구는 희안하게도, pool이 있습니다. 그리고 이상하게 생겨먹은 함수인 intern() 메서드가 있는데요. 자바에서 문자열을 선언했을 때, 어떤 식으로 동작하는지 이해하기 위해서는 저 둘에 대한 이해를 하시는 것이 중요합니다. 먼저 6번째 줄과 7번째 줄을 보면 "str" 이런 식으로 뭔가 되어 있는 것을 볼 수 있는데요. 상수인가요? 문자열 상수는 우리는 흔히 리터럴이라고 부릅니다. 디버그 포인트를 찍어 보겠습니다. 그러면 original에 "str"이라는 리터럴이 넘어오게 됩니다. arg0을 보..
string 검색 결과
java String의 startsWith 메서드는, str이 prefix로 시작하는지를 검사하는 함수입니다. 2번째 인자에 offset을 넣을 수도 있는데요. 이는 str의 offset부터 끝까지는 부분 문자열 sub로 잡았을 때, sub가 prefix로 시작하는지를 검사합니다. 그러면, endsWith도 내부적으로는 startsWith를 쓰겠네요. 쓰는 방법은 아래와 같습니다. boolean startsWith(String prefix); boolean startsWith(String prefix, int offset); 보통 위에 것을 꽤 쓰는 편입니다. 그러면 이들이 어떻게 동작하는지 내부를 간단히 보아야 겠군요. 먼저 String 인자만 하나 넘겨주면 그림에서의 1433번째 줄에 들어갑니다. 그..
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..
java에서 빈 문자열을 비교할 때에는 어떤 메서드를 써야 할까요? length? 아니면 equals? 아니면 isempty? 이 셋이 어떻게 동작하는지 비교를 해 봅시다. 만약에 퍼포먼스가 차이가 난다면 어디서 차이가 나는지도 비교 분석해 보는 것도 좋은 공부가 될 듯싶습니다. 먼저 이것을 테스트할 프로그램을 작성해 봅시다. random 객체를 생성한 다음에 무언가를 하고 있는데요. 문자열 하나를 만들 때마다, 길이도 랜덤 하게 정하고, 문자 또한 랜덤하게 정한다는 것을 알 수 있어요. 문자열을 만드는 작업은 StringBuilder 클래스를 이용하는데요. 단일 스레드 환경에서는 append 작업이 많이 일어나는 경우, String보다 성능이 좋고, StringBuffer보다 빠르기 때문입니다. Str..
최근댓글