posted by changhozz 2012. 7. 20. 13:59

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