본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.

자바 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 는 서로 다른 객체다.

비교 연산자와 equals()

편집 원본 편집
비교 무엇을 비교하나 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() 앞뒤 공백 제거