자바 String
IT 위키
더 많은 작업
자바 String은 자바에서 문자열을 나타내는 클래스(java.lang.String)로, 한 번 만든 값을 바꿀 수 없는 불변(immutable) 객체이다.
문자열은 두 가지 방법으로 만든다. 결과 값은 같아도 객체가 놓이는 곳이 다르다.
String a = "A"; // 문자열 리터럴
String b = "A"; // 같은 리터럴
String c = new String("A"); // new 로 생성
- 리터럴 : 힙의 문자열 상수 풀(String Constant Pool)에 저장된다. 같은 내용의 리터럴은 풀에 하나만 두고 공유하므로,
a와b는 같은 객체를 가리킨다. - new String() : 풀과 별개로 힙에 새 객체를 만든다. 내용이 같아도
a와c는 서로 다른 객체다.
| 비교 | 무엇을 비교하나 | a 와 b |
a 와 c
|
|---|---|---|---|
== |
두 참조가 같은 객체(주소)를 가리키는지 | true | false |
equals() |
두 문자열의 내용이 같은지 | true | true |
==는 기본 자료형(int, char 등)에서는 값을 비교하지만, String 같은 참조형에서는 주소를 비교한다.equals()는 객체의 메서드라서 기본 자료형 변수에는 쓸 수 없다. String 은 이 메서드를 재정의해 내용을 비교하도록 해 두었다.- 대소문자를 무시하고 비교하려면
equalsIgnoreCase()를 쓴다.
public class Main {
static void func(String[] m, int n) {
for (int i = 1; i < n; i++) {
if (m[i-1].equals(m[i])) System.out.print("O");
else System.out.print("N");
}
for (String mo : m) System.out.print(mo);
}
public static void main(String[] args) {
String[] m = new String[3];
m[0] = "A";
m[1] = "A";
m[2] = new String("A");
func(m, 3);
}
}
equals() 로 내용을 비교하므로 m[0]·m[1], m[1]·m[2] 모두 같다 → OO. 이어서 세 원소를 출력하면 AAA. 결과는 OOAAA 다. 비교를 == 로 바꾸면 m[2] 가 별도 객체라서 ONAAA 가 된다.
concat(), replace(), toUpperCase() 같은 메서드는 원래 문자열을 고치지 않고 새 String 객체를 돌려준다. 반복해서 문자열을 이어 붙이면 객체가 계속 생기므로, 그럴 때는 변경 가능한 StringBuilder(단일 스레드) 나 StringBuffer(동기화 지원)를 쓴다.
| 메서드 | 하는 일 |
|---|---|
length() |
문자 수 |
charAt(i) |
i 번째 문자 |
substring(a, b) |
a 이상 b 미만 구간 |
indexOf(s) |
s 가 처음 나오는 위치, 없으면 -1 |
equals(s) / compareTo(s) |
내용 비교 / 사전순 비교(같으면 0) |
split(regex) |
구분자로 나눠 배열로 |
trim() |
앞뒤 공백 제거 |