String 클래스는 참조 자료형이다. 객체를 한번 생성하면 변경할 수 없다.
String a = "a"; String b = "b; a = a + b;
따라서, + 연산자를 이용하여 문자열을 결합하면 인스턴스가 하나 더 생긴다.
위 그림을 보면 알 수 있듯이, String은 참조 자료형이므로, String 인스턴스의 시작주소를 값으로 갖는다.
a에 a + b를 넣으면 원래 a의 인스턴스에 값이 ab로 바뀌는 것이 아니라, ab를 담는 인스턴스가 새로 생성되고
String 객체는 그 인스턴스의 시작주소를 값으로 갖는다.
자바에서 문자열을 생성하는 방법으로 두 가지가 있는데, 문자열 리터럴을 지정하는 방법과 새로운 인스턴스를 생성하는 방법이 있다. 문자열 리터럴은 힙 내부에 String constant pool에 저장되고, value가 같으면 해당 영역을 재사용한다. 어차피 String은 변경불가능하기 때문에 한 주소를 여러 객체가 참조해도 상관없다. 생성자를 사용해서 인스턴스를 생성한 경우는 힙 영역에 인스턴스가 생성된다. 따라서, 생성자를 이용해 String 인스턴스를 계속 만들어내는 것은 좋지 않다.String str1 = "abc"; //문자열 리터럴 "abc"의 주소 저장 String str2 = "abc"; //문자열 리터럴 "abc"의 주소 저장 String str3 = new String("abc"); //String 인스턴스의 주소 저장 String str4 = new String("abc"); //String 인스턴스의 주소 저장
str1 == str2가 true인 이유는 두 객체는 문자열 리터럴을 참조하기 때문에 같은 주소를 참조하여 값이 같기 때문이다. str3 == str4가 false인 이유는 두 객체가 각각 다른 인스턴스를 생성하고 그 주소를 참조하여 값이 다르기 때문이다.
생성자를 통해 생성된 인스턴스를 참고하는 문자열의 값 비교는 equals()를 사용해야 한다.
String str3 = new String("abc"); //String 인스턴스의 주소 저장 String str4 = new String("abc"); //String 인스턴스의 주소 저장 System.out.println(str3.equals(str4)); //true 출력
- SubString
- Split
public String substring (int startIndex, int endIndex) //endIndex는 불포함
String str = "abcdef"; str.substring(2, 4); //cd
public String split (String regex)
public String split (String regex, int limit) //limit개만 구분하고 나머지는 놔둠String str = "i am a human"; String[] strArr = str.split("\\s"); //공백기준 슬라이싱 //str[0] = i / str[1] = am / str[2] = a / str[3] = human
String str = "a.b.c"; String strA = str.split("[.]")[0] //.기준으로 자른 첫번째 String
참고로, 정규식에서 어떤 문자 기준으로 자르고싶을 때는 [ ]안에 넣어야 한다.
예를 들어, abccbaa를 b를 기준으로 자르고싶으면 split("[b]")
- String to Int : Integer.parseInt()
String str = "123"; int num = Integer.parseInt(str);
- Int to String : Integer.toString()
int num = 123; String str = Integer.toString(num);
- Character to String : Character.toString()
Character c = 'a'; String str = Character.toString(c); //"a"
- String to Character : String.charAt()
String str = "abc"; Character c = str.charAt(1); //'b'
Character.isDigit(char c)
Character c = '91'; Character.isDigit(c); //true