Menu

자바 문자열(String): 생성, 연결, String 메서드 사용하기

자바 문자열이 동작하는 방식: 생성하기, +로 합치기, 왜 불변(immutable)인지, equals로 비교하기, 그리고 length, substring, replace 같은 일상적인 String 메서드.

이 페이지에는 실행 가능한 에디터가 있습니다 - 편집하고 실행하면 결과를 바로 볼 수 있습니다.

문자열(String)이란

String은 문자들의 연속, 즉 이름, 문장, 또는 파일에서 읽어 온 한 줄 같은 텍스트를 담습니다. 이전 페이지에서 참조 타입 목록 가운데 String이 들어 있는 것을 보았는데, 여기서는 실제로 문자열을 다뤄 봅니다. 문자열 리터럴은 큰따옴표로 작성합니다(작은따옴표는 단일 char를 위해 예약되어 있습니다):

name.length()는 문자 수를 반환합니다. "Ada"의 경우 3입니다. 이것은 메서드 호출이므로 괄호가 필요합니다.

문자열 합치기

+ 연산자는 문자열을 서로 이어 붙입니다. +의 어느 한쪽이 문자열이면 다른 쪽은 자동으로 텍스트로 변환되므로, 별다른 작업 없이 숫자와 불리언을 섞어 쓸 수 있습니다:

한 가지 함정이 있습니다. +는 왼쪽에서 오른쪽으로 평가되므로 "" + 1 + 2"12"가 되지만(문자열 + int, 그다음 문자열 + int), 1 + 2 + """3"이 됩니다(두 정수가 먼저 더해진 뒤 텍스트가 됨). 헷갈릴 때는 연산 부분을 괄호로 감싸세요.

문자열은 불변(immutable)이다

이것이 자바 문자열에 대해 이해해야 할 가장 중요한 점입니다. String은 생성된 뒤에는 절대 바뀌지 않습니다. 문자열을 "수정"하는 것처럼 보이는 모든 메서드는 사실 완전히 새로운 문자열을 반환하고 원본은 그대로 둡니다. 따라서 반환값을 받아 두는 것을 잊으면 아무 일도 일어나지 않습니다:

첫 번째 호출은 "HELLO"를 계산한 뒤 곧바로 버립니다. 눈에 보이는 효과가 있는 것은 s에 다시 대입하는 두 번째 줄뿐입니다. 거의 모든 사람이 한 번쯤 빠지는 함정입니다.

문자열 비교하기

두 문자열의 내용을 비교하려면 .equals()를 사용하세요. ==에 손을 뻗는 것은 초보자의 전형적인 실수입니다. ==는 "같은 텍스트를 담고 있는가?"가 아니라 "메모리상 같은 객체인가?"를 묻습니다:

여기서 a == bfalse인 이유는 new String(...)이 별개의 객체를 강제로 만들기 때문입니다. 문자열 값은 항상 .equals()로(대소문자를 무시하려면 .equalsIgnoreCase()로) 비교하세요. 한쪽이 null일 수 있을 때 충돌을 피하는 유용한 요령은 리터럴 쪽에서 .equals를 호출하는 것입니다. "yes".equals(input)inputnull이라도 절대 예외를 던지지 않습니다.

일상적인 String 메서드

문자열은 불변이므로, 이 메서드들은 모두 원본을 바꾸는 대신 새 문자열(또는 값)을 반환합니다. 다음은 늘 손이 가는 메서드들입니다:

메서드 체이닝에 주목하세요. s.trim().toUpperCase()가 동작하는 이유는 trim()이 문자열을 반환하고, 그 문자열에 대해 다시 toUpperCase()를 호출하기 때문입니다. substring도 또 하나의 단골 메서드입니다. 시작 인덱스(포함)와 선택적인 끝 인덱스(제외)를 받습니다:

인덱스는 0부터 시작하므로 substring(0, 4)는 0번부터 3번까지의 문자를 가져옵니다. 끝을 넘어선 인덱스를 요청하면 StringIndexOutOfBoundsException이 발생합니다.

반복문에서 문자열 만들기

몇 조각을 합칠 때는 + 연결로 충분하지만, 큰 반복문 안에서 그렇게 하면 느립니다. +를 할 때마다 새 문자열이 만들어지고 전체가 복사되기 때문입니다. 반복문에서 텍스트를 조립할 때는 버퍼를 제자리에서 변경하고 마지막에 한 번만 최종 문자열을 만들어 내는 StringBuilder를 사용하세요:

append는 같은 빌더를 반환하므로 호출을 체이닝할 수 있습니다. 마지막에 .toString()을 호출하면 일반 String을 얻습니다. 일회성 결합에는 +를 그대로 쓰고, 여러 조각을 누적할 때는 StringBuilder가 알맞은 도구입니다.

다음: 문자열 포맷팅

정렬된 열, 고정된 소수점 자릿수, 자릿수를 채운 숫자가 필요해지는 순간 연결은 지저분해집니다. 자바의 String.formatprintf% 자리표시자가 있는 템플릿을 사용해 이 모든 것을 깔끔하게 처리합니다. 그것이 다음 페이지의 주제입니다.

자주 묻는 질문

자바에서 두 문자열을 어떻게 비교하나요?

내용을 비교하려면 .equals()를 사용하세요. a.equals(b)는 문자가 일치할 때 true를 반환합니다. 문자열 값을 비교할 때 ==를 사용하면 안 됩니다. ==는 객체 참조를 비교하므로, 같은 텍스트를 담고 있는 두 문자열에 대해서도 false를 반환할 수 있습니다. 대소문자를 구분하지 않아야 할 때는 .equalsIgnoreCase()를 사용하세요.

자바 문자열은 왜 불변(immutable)인가요?

한 번 생성된 String 객체는 절대 바뀌지 않습니다. replacetoUpperCase 같은 메서드는 원본을 수정하는 대신 새로운 문자열을 반환합니다. 불변성 덕분에 문자열을 안전하게 공유하고 캐시할 수 있지만, 그만큼 결과를 반드시 대입해야 합니다: s = s.toUpperCase();. 메서드를 호출하고 반환값을 무시하면 아무 일도 일어나지 않습니다.

자바에서 문자열의 길이는 어떻게 구하나요?

.length() 메서드를 호출하세요: "hello".length()5를 반환합니다. String에서는 괄호가 붙는 메서드라는 점에 유의하세요. 배열에서는 length가 괄호 없는 필드(arr.length)인 것과 다릅니다.

Coddy programming languages illustration

Coddy로 코딩 배우기

시작하기