자바에서 String은 한 번 만들어지면 내용을 고칠 수 없습니다. 이 성질을 모르면 메서드를 호출해 놓고 “왜 안 바뀌지”라며 헤매게 됩니다. 자주 쓰는 String 메서드를 표와 예제로 정리한 사전입니다.
| 메서드 | 하는 일 | 반환값 / 원본 |
|---|---|---|
length() |
글자 수를 셉니다 | int |
charAt(i) |
i번째 글자 하나 | char |
indexOf(s) |
s의 첫 위치 | int, 없으면 -1 |
contains(s) |
s가 있는지 확인 | boolean |
substring(a, b) |
a부터 b 앞까지 | 새 String / 유지 |
equals(s) |
내용이 같은지 비교 | boolean |
equalsIgnoreCase(s) |
대소문자 무시 | boolean |
compareTo(s) |
사전 순 앞뒤 | int (음수·0·양수) |
replace(a, b) |
a를 모두 b로 | 새 String / 유지 |
split(s) |
s 기준 쪼개기 | String[] |
trim() |
앞뒤 공백 제거 | 새 String / 유지 |
strip() |
유니코드 공백 제거 | 새 String / 유지 |
toUpperCase() |
모두 대문자로 | 새 String / 유지 |
String.format(f, …) |
서식에 값 끼우기 | 새 String |
“유지”가 반복되는 것이 핵심입니다. 불변성이란 어떤 메서드를 불러도 원래 문자열은 손대지 않는다는 뜻입니다. 자료형이 낯설다면 자바 변수와 자료형 편을 보십시오.
길이와 문자 찾기 — length, charAt, indexOf, contains
자바스크립트와 달리 length에 괄호를 붙입니다.
String noteTitle = "카드뉴스 자바 강좌";
System.out.println(noteTitle.length()); // 10
System.out.println(noteTitle.charAt(0)); // 카
System.out.println(noteTitle.indexOf("자바")); // 5 (없으면 -1)
System.out.println(noteTitle.contains("강좌")); // true
charAt은 String이 아니라 글자 한 개인 char를 돌려줍니다. 그래서 charAt(0).length()처럼 이어 쓰면 컴파일 오류가 납니다.
잘라내기 — substring
자바에는 slice가 없습니다. substring 하나로 처리하며 끝 위치는 포함되지 않습니다.
String slug = "java-string-methods";
System.out.println(slug.substring(0, 4)); // java
System.out.println(slug.substring(slug.length() - 7)); // methods
System.out.println(slug); // java-string-methods 원본 그대로
범위를 벗어나면 StringIndexOutOfBoundsException으로 멈춥니다. 음수도 쓸 수 없어 뒤에서 자를 때는 length() - n으로 계산합니다.
비교하기 — equals, equalsIgnoreCase, compareTo
가장 많이 틀리는 지점입니다. 문자열 비교에 ==를 쓰면 안 됩니다.
String a = "코딩";
String b = "코딩";
String c = new String("코딩");
System.out.println(a == b); // true 우연입니다
System.out.println(a == c); // false 내용은 같지만 다른 객체
System.out.println(a.equals(c)); // true 내용 비교는 equals
System.out.println("Java".equalsIgnoreCase("java")); // true
System.out.println("apple".compareTo("banana")); // -1 앞에 옵니다 (같으면 0)
==는 같은 객체를 가리키는지를 봅니다. 짧은 문자열은 자바가 재사용해 true가 나오기도 하는데, 테스트만 통과하고 실제 입력값에서 실패하므로 더 위험합니다.
바꾸고 나누고 다듬기 — replace, split, trim, strip
입력값을 정리하거나 조각으로 나눌 때 쓰는 묶음입니다.
String notice = "자바 강좌와 자바 예제";
System.out.println(notice.replace("자바", "JAVA")); // JAVA 강좌와 JAVA 예제
System.out.println(notice); // 원본은 그대로
String raw = " 코딩 입문 ";
System.out.println("[" + raw.trim() + "]"); // [코딩 입문] strip()도 같습니다
String[] tags = "html,css,java".split(",");
System.out.println(tags.length); // 3 배열은 괄호가 없습니다
System.out.println(tags[2].toUpperCase()); // JAVA
자바의 replace는 일치하는 것을 모두 바꿉니다. strip은 trim보다 넓은 공백을 인식하므로 자바 11 이상이라면 더 안전합니다.
서식 만들기 — String.format
+로 이어 붙이면 읽기 어렵습니다. String.format은 자리 표시자에 값을 끼워 넣습니다.
System.out.println(String.format("%s님, 글 %d개 (달성률 %.1f%%)", "김코딩", 7, 85.67));
// 김코딩님, 글 7개 (달성률 85.7%)
System.out.println(String.format("%03d", 7)); // 007
%s는 문자열, %d는 정수, %.1f는 소수 한 자리이며 퍼센트 기호는 %%로 적습니다. 반복문에서 계속 이어 붙인다면 StringBuilder가 빠릅니다. 숫자 계산은 자바 Math 클래스 편으로 이어집니다.
핵심 정리
- 불변성 — 원본을 안 바꾸니 결과를 다시 담습니다.
- 비교 — 내용은
equals,==는 객체 비교입니다. - 자르기 —
substring은 음수를 못 쓰고 범위를 넘기면 오류 - 바꾸기 —
replace는 모두 바꿉니다. - 괄호 — 문자열
length(), 배열length