자바 String 메서드 총정리 — 바뀌지 않는 문자열을 다루는 사전

자바에서 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일치하는 것을 모두 바꿉니다. striptrim보다 넓은 공백을 인식하므로 자바 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