String클래스에는 문자열을 저장하기 위해서 문자형 배열 변수 (char[]) value를 인스턴스변수로 정의해놓고 있다. 인스턴스 생성 시 생성자의 매개변수로 입력받는 문자열은 이 인스턴스변수(value)에 문자형 배열(char [])로 저장되는 것이다.
한번 생성된 String인스턴스가 갖고 있는 문자열은 읽어 올 수만 있고, 변경할 수는 없다.
예를 들어 "a" + "b"와 같이 +연산자를 이용해서 문자열을 결합하는 경우 인스턴스 내의 문자열이 바뀌는 것이 아니라 새로운 문자열("ab")이 담긴 String인스턴스가 생성되는 것이다.
---------------------------------------중요-----------------------------------------------
문자열을 만들 때는 두 가지 방법, 문자열 리터럴을 지정하는 방법과 String클래스의 생성자를 사용해서 만드는 방법이 있다.
문자열 리터럴을 지정하는 방법 ㅡ> String str1 = "abc" ; String str2 = "abc";
String클래스의 생성자를 사용해서 만드는 방법 ㅡ>String str3 = new String("abc");
String str4 = new String("abc");
equals(String s)를 사용했을 때는 두 문자열의 내용("abc")을 비교하기 때문에 두 경우
str1.equals(str2)과 str3.equals(str4)는 모두 true를 갖는다.
하지만 ,각 String인스턴스의 주소값을 등가비교연산자(==)로 비교했을 때는 결과가 다르다.
리터럴로 문자열을 생성했을 경우, 같은 내용의 문자열들은 모두 하나의 String인스턴스를 참조하도록 되어 있다. 어차피 String인스턴스가 저장하고 있는 문자열은 변경할 수 없기 때문에 아무런 문제가 없다.
그러나 String 클래스의 생성사를 이용한 String인스턴스의 경우에는 new연산자에 의해서 메모리할당이 이루어지기 때문에 항상 새로운 String인스턴스가 생성된다.
이런식으로 문자열 리터럴을 지정한 방법에서 str1 과 str2 변수는 같은 주소 0x100(abc주소)를 가리키고 있기 때문에 str1==str2 경우에도 true가 나오는것이다.
반면 str3과 str4는 각각 new 연산자로 인해 새로운 메모리가 각각 할당되게 되는것이다.
'JAVA > JAVA 공부' 카테고리의 다른 글
StringBuffer클래스 (0) | 2012.07.20 |
---|---|
java.lang 패키지 (0) | 2012.07.20 |
참조변수의 대한 설명 (0) | 2012.06.29 |
수치형 범위 (0) | 2012.06.26 |
JVM의 메모리 구조 (0) | 2012.06.21 |