본문 바로가기
JAVA BASE/lang & util

02. [자바] String클래스

by staticClass 2020. 12. 24.

String 클래스의 메서드, 생성자에 대한 내용이 궁금하다면 하단 링크를 클릭 하자.

 

03. [자바] String생성자, 메서드(표)

메서드 / 설명 예 제 결 과 String(String s) String s = new String("Hello"); s = "Hello" 주어진 문자열(s)를 갖는 String인스턴스를 생성한다. String(char[] value) char[] c = {'H', 'e', 'l', 'l', 'o'}; S..

staticclass.tistory.com


String클래스?

자바는 문자열을 위한 클래스를 제공한다. 그 것이 바로 String클래스인데 String클래스는 문자열을 저장하고
이를 다루는데 필요한 메서드를 함께 제공한다.
지금까지는 String클래스의 기본적인 몇 가지 기능만 사용해 왔지만 String클래스는 아주 중요하니 자세히 공부하자.

변경 불가능한(immutable) 클래스

String클래스에는 문자열을 저장하기 위해 문자형 배열 char[]를 인스턴스 변수로 정의해놓고 있다.
인스턴스 생성 시 생성자의 매개변수로 입력받는 문자열은 이 인스턴스변수에 문자형 배열로 저장된다.

String str = "안녕하세요?";
char[] cArr = {'안', '녕', '하', '세', '요', '?'};

이런식으로 저장이 된다.

한번 생성된 String은 읽어 올 수만 있고, 변경할 수는 없다.
예를 들어 +연산자를 이용하여 문자열을 결합하면 인스턴스 내의 문자열이 바뀌는게 아니라
새로운 문자열 ("ab")이 담긴 String인스턴스가 생성되는 것이다.

String a = "a";
String b = "b";
String a = a + b;

덧셈연산자 +를 사용해 문자열을 결합하면 연산 시 마다 새로운 String인스턴스가 생성되어

메모리공간을 차지하게 되므로 가능한 결합횟수를 줄이는 것이 좋다.
문자열간의 결합이나 추출 등 문자열을 다루는 작업이 많이 필요한 경우 String 대신
StringBuffer클래스를 사용하자.
StringBuffer저장된 문자열의 변경이 가능하기 때문에 하나의 StringBuffer로도 문자열을
다루는 것이 가능하다.

문자열의 비교

문자열을 만들 때는 두가지 방법이 있다.

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

String클래스의 생성자를 이용한 경우에는 new연산자에 의해서 메모리 할당이 이루어지기 때문에
항상 새로운 String인스턴스가 생성된다. 그러나 문자열 리터럴은 이미 존재하는 것을 재사용 한다.

equals()로 비교했을 때는 두 문자열의 내용("abc")을 비교하기 때문에 두 경우 모두 true를 결과로 받지만
각 String인스턴스의 주소를 등가비교연산자'=='로 비교했을 때는 결과가 다르다.

public class StringTest {
    public static void main(String[] args) {
        String str1 = "abc";
        String str2 = "abc";
        System.out.println("str1 == str2 ? " + (str1 == str2));
        System.out.println("str1.equals(str2) ? " + str1.equals(str2));

        System.out.println();

        String str3 = new String("\"abc\"");
        String str4 = new String("\"abc\"");
        System.out.println("str3 == str4 ? " + (str3 == str4));
        System.out.println("str3.equals(str4) ? " + str3.equals(str4));
    }
}
// 결과
// str1 == str2 ? true
// str1.equals(str2) ? true

// str3 == str4 ? false
// str3.equals(str4) ? true

빈 문자열(empty string)

길이가 0인 배열이 있듯이

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

String도 빈 문자열을 가질수 있다.
String s = "";과 같은 문장이 있을 때, 참조변수 s가 참조하고 있는 String인스턴스는
내부에 new char[0]과 같이 길이가 0인 char형 배열을 저장하고 있다.

String s = null;    // String s = "";  (빈 문자열로 초기화)
char c = 000;        // char c = ' ';   (공백으로 초기화)

일반적으로 변수를 선언할 때, 각 타입의 기본값으로 초기화 하지만
String은 참조형 타입의 기본값인 null보다는 빈 문자열 String s = "";로 초기화 하고
char형은 기본값인 '\u000' 대신 char c = ' '; 공백으로 초기화 하는것이 보통이다.
'\u000'유니코드의 첫 번재 문자로 아무런 문자도 지정되지 않은 빈 문자이다.

댓글