티스토리 뷰

String클래스

  • 문자열을 다루기 위한 클래스
  • 데이터(char[]) + 메서드(문자열 관련)
  • 내용을 변경할 수 없는 불변(immutable) 클래스 ⭐️
  • 덧셈 연산자(+)를 이용한 문자열 결합은 성능이 떨어짐
  • 문자열의 결합이나 변경이 잦다면, 내용 변경이 가능한 StringBuffer클래스를 사용하면 된다.

 

더보기

내용을 변경할 수 없는 불변(immutable) 클래스 

내용을 변경할 수 없는 불변(immutable) 클래스

String a, b가 있을 때, a = a + b하게 되면, 문자열 "ab"가 만들어진다. 이때, 자칫 문자열 내용이 바뀌는 것처럼 보여진다. 

위 문장이 실행되는 과정을 보면, String a = "a"; 와 String b = "b"; 문장이 실행되면서 "a"와 "b"를 담는 객체가 각각 만들어진다. 그리고 a + b에 따라 "ab"가 만들어지면서, 그 결과가 a객체에 들어가는게 아니라, 새로운 String객체가 만들어진다. String클래스는 내용을 변경할 수 없는 불변(immutable) 클래스이기 때문이다.

그리고 "ab"를 담은 객체(0x300)를 a에 대입하면 객체의 주소값 0x300이 변수 a에 저장된다.

System.out.println(a);  // 결과 : 0x300

덧셈 연산자(+)를 이용한 문자열 결합은 성능이 떨어짐

문자열 결합을 할 때, "a"를 저장하던 기존의 객체가 변경되는 것이 아니라, 새로운 문자열 객체가 만들어진다. 따라서 덧셈 연산자(+)를 이용한 문자열 결합은 성능이 떨어진다. 계속 새로운 객체가 만들어지기 때문이다. 문자열(String클래스)은 내용을 변경할 수 없다.

StringBuffer

 그렇다면, 문자열을 자주 변경하려면 어떻게 해야 할까? 그럴 땐 StringBuffer클래스를 사용한다. 간단한 문자열 결합이 아니라, 반복문 안에서 문자열을 지속적으로 결합하는 경우에는 반드시 StringBuffer클래스를 사용하자.

문자열 비교

  • String str = "abc"와 String str = new String("abc");의 비교

 

더보기

문자열 생성 방법

  1. 문자열 리터럴 지정
  2. String클래스의 생성자를 사용
String str1 = "abc";   // 문자열 리터럴 "abc"의 주소가 str1에 저장됨
String str2 = "abc";   // 문자열 리터럴 "abc"의 주소가 str2에 저장됨
String str3 = new String("abc"); // 새로운 String인스턴스를 생성
String str4 = new String("abc"); // 새로운 String인스턴스를 생성

문자열 리터럴을 지정하여 문자열을 만들면, 하나의 문자열을 여러 참조변수가 공유한다. 반면, new연산자를 사용하면, 내용이 같아도 항상 새로운 문자열이 만들어진다.

 앞에서 배웠듯이, 문자열은 '내용 변경 불가'하다. 따라서 굳이 new연산자를 이용해서 새로운 문자열을 만들 필요가 없다. 그래서 문자열의 같고 다름을 비교할 땐, 대입연산자를 사용하면 안 된다.

 따라서 문자열 비교를 할 땐 반드시 equals()를 사용해야 한다. equals()는 내용 비교를 하기 때문이다.

 반면 등가비교연산자(==)는 주소 비교를 하기 때문에, 어떨 때는 true, 어떨 때는 false가 나오기 때문에 정상적인 비교가 불가능하다.

문자열 리터럴

  • 문자열 리터럴은 프로그램 실행 시 자동으로 생성된다.(constant pool에 저장)
  • 같은 내용의 문자열 리터럴은 하나만 만들어진다.

 

더보기

문자열 리터럴은 프로그램 실행 시 자동으로 생성된다.(constant pool에 저장)

class Ex9_7 {
    public static void main(String args[]) {
        String s1 = "AAA"; // constant pool에 
        String s2 = "AAA"; // new String("AAA");가 자동으로 생성
        String s3 = "AAA"; // s1, s2, s2가 String객체 공유
        String s4 = "BBB"; 
    }
}

new String("AAA");을 굳이 작성하지 않더라도, 자동으로 만들어진다. 

우리가 만든 프로그램의 모든 문자열은 자동으로 만들어진다. 원래 String도 클래스이기 때문에 객체를 사용하기 위해서는 객체 생성을 해줘야 한다. 하지만, '문자열 리터럴' "AAA"를 작성하면 자동으로 new String("AAA");가 생성된다. 이렇게 만들어 진 후 constant pool(상수 저장소)에 저장된다.

 프로그램에 있는 모든 상수는 constant pool에 저장된다.  

같은 내용의 문자열 리터럴은 하나만 만들어진다.

문자열 리터럴 "AAA"를 작성하면 자동으로 String객체가 만들어진다. 이 String객체를 s1, s2, s3 변수들이 공유하기 때문에 같은 주소값이 저장된다. String클래스는 내용 변경 불가능(immutable)하기 때문이다. 불변이기 때문에 많은 변수들이 같은 String객체를 공유해도 아무런 문제가 없다. 

빈 문자열("", empty String)

  • 내용이 없는 문자열. 길이가 0인 char형 배열을 저장하는 문자열
  • 길이가 0인 배열을 생성하는 것은 어느 타입이나 가능
  • 문자(char)와 문자열(String)의 초기화

 

더보기

내용이 없는 문자열. 길이가 0인 char형 배열을 저장하는 문자열

String str = ""; // str을 빈 문자열로 초기화

길이가 0인 배열을 생성하는 것은 어느 타입이나 가능

char[] chArr = new char[0]; // 길이가 0인 char배열
int[] iArr = {};            // 길이가 0인 int배열

문자(char)와 문자열(String)의 초기화

오른쪽 코드가 좋은 코드

문자열은 반드시 빈 문자열로 초기화하자.

 

댓글
공지사항