자바에서 가장 많이 사용하는 문자열을 표현하는 클래스 이다.
new 연산자를 이용하지 않고 인스턴스를 만들 수 있다.
2가지의 생성방식
String str1 = "hello";
String str2 = "hello";
hello 라는 것이 생성되면 메모리중 상수들이 저장되는 영역에 저장이 된다.
hello 라는 인스턴스가 상수영역에 하나 만들어 졌고 그 hello 를 str1 이 가리킨다.
그런데 str2 도 hello 를 가리켜야 해서 상수 영역에 똑같은 hello 가 있는지 찾아본다.
만약 있으면 새로 만들지 않고 str1 의 hello 를 가리킨다.
이렇게 되면 str1 과 str2 는 같은 인스턴스를 참조하게 된다.
String str3 = new String("hello");
String str4 = new String("hello");
이번에는 new 연산자를 이용해서 인스턴스를 만들게 되면 상수영역에 있는것을 참조하지 않는다.
대신 힙 영역에 새롭게 만들게 되며 str3 이 이를 가리킨다.
str4 또한 힙 영역에 hello 문자열을 만들고 가리키게 된다.
이를 비교하는 방법은 아래와 같다.
참조변수끼리 == 로 비교하면 서로 같은 것을 참조하는 비교한다.
if (str1 == str2)
System.out.println("str1 과 str2 는 같은 레퍼런스 입니다.");
// 프린트문이 출력이 된다.
if (str1 == str3)
System.out.println("str1 과 str2 는 같은 레퍼런스 입니다.");
// 프린트문이 출력이 되지 않는다.
if (str3 == str4)
System.out.println("str1 과 str2 는 같은 레퍼런스 입니다.");
// 프린트문이 출력이 되지 않는다.
System.out.println(str1);
// 결과 : hello
System.out.println(str1.substring(3));
// 결과 : lo
// substring 은 문자열을 자른 결과를 반환하는 메소드 이다.
System.out.println(str1);
// 결과 : hello
String 은 불변 클래스 즉, String 이 인스턴스가 될 때 가지고 있던 값을 나중에 수정할 수 없다.
String 은 한번 만들어진 String 클래스의 갖고 있는 내부의 값이 변하지 않는다.
String 이 가지고 있는 메소드중 String 을 반환하는 메소드는 모두 새로운 String 을 생성해서 반환한다.