개발

String에 대한 궁금증 4가지

동고킴 2016. 4. 21. 22:50
반응형

너무너무 너무나도 많이 사용하는 String

아래 4가지 주제를 통해 String에 대해서 아주 쬐끔(?)만 더 알아보자.

 

  • String a = "test" or String a = new String("test")?
  • == or equals?
  • String은 immutable한가?
  • String의 최대 길이는?

 

String a = "test" or String a = new String("test")?

 

String은 객체이기 때문에 new를 통해 값을 생성하는게 일반적이다.

하지만 자바에서 String은 특별히 ""을 사용하여 생성할 수 있도록 특별대우를 해주고 있다.

(보통 ""은 원시자료형(int, long, double, float, boolean, char 등)의 값을 선언할때 사용한다.)

 

즉 "", new 둘다 사용해도 된다.

그럼 ""와 new의 차이점이 무엇일까?

new를 사용할 경우에는 무조건 새로운 객체를 생성한다.

""를 사용하면 이전에 생성한 객체가 있는지 체크하고 없을 경우에만 새로운 객체를 생성한다. 참조값이 같을 경우에는 이전에 생성한 객체를 가리킨다.

 

아래와 같이 4개의 String을 선언한 후, 해쉬코드를 살펴보면 a,b만 같고 그 외에는 모두 다르다는걸 알 수 있다.

1
2
3
4
String a = "donggov";               // 272890728
String b = "donggov";               // 272890728
String c = new String("donggov");   // 1596879151
String d = new String("donggov");   // 1644754298
cs
 

 

 

== or equals?

 

== 연산자는 두개의 자료형의 객체 자체를 비교하고 equals는 객체의 값이 동일한지 비교한다.

그러므로 객체의 값을 비교하고 싶을경우에는 equals를 사용하여야 한다.

아래 코드는 매우 유명한 샘플 코드이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
String a = "donggov";
String b = "donggov";
String c = new String("donggov");
String d = new String("donggov");
 
System.out.println(a == b);       // true
System.out.println(a.equals(b));  // true
 
System.out.println(a == c);       // false
System.out.println(a.equals(c));  // true
 
System.out.println(c == d);       // false
System.out.println(c.equals(d));  // true

cs

 

설명충이라 다시 한번만 더 설명하자면

a == b가 true인 이유는 참조값이 동일하여 객체가 같기 때문이고,

a == c가 false인 이유는 c가 새로운 객체를 생성하였기 때문이며,

c == d가 false인 이유는 d도 새로운 객체를 생성하였기 때문이니라.

 

 

String은 immutable한가?

 

String이 정말 immutable한지 알아보자.

String을 선언한 후, 값을 바꿔보고, 다른 Sting을 대입시켜보고 이것저것 해보자.

이를 통해 과연 처음에 선언했던 String 객체가 그대로 남아있나 확인해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
String a = "donggov";
System.out.println(a);
System.out.println(System.identityHashCode(a));
System.out.println("--------------");
 
= "abcd";
System.out.println(a);
System.out.println(System.identityHashCode(a));
System.out.println("--------------");
 
= a.concat("ef");
System.out.println(a);
System.out.println(System.identityHashCode(a));
System.out.println("--------------");
 
String b = "bbbbb";
= b;
System.out.println(a);
System.out.println(System.identityHashCode(a));
System.out.println(System.identityHashCode(b));
cs

결과

1
2
3
4
5
6
7
8
9
10
11
12
donggov
975982302
--------------
abcd
854453928
--------------
abcdef
584020407
--------------
bbbbb
1630713659
1630713659

cs

 

결과를 보면 String의 값을 변경하였을 때는 hashcode가 바뀌는것을 볼수있다.

String의 immutable성을 보여주는 예이다.

 

 

String의 최대 길이는?

 

String의 최대 길이는 어떻게 될까?

답은 '환경에 따라 다르다'이다.

String의 길이는 메모리와 연관이 있다. String은 생성되면서 JVM의 Heap Area에 위치하게 되기 때문이다. Heap Area, 즉, 프로세스가 실행될때 OS로부터 메모리를 할당받게 되기때문에 메모리가 클수록 최대 길이가 커지게 된다. JVM의 최대 Heap 메모리가 String의 최대 길이를 결정한다. (Heap Area의 얕은 정보 보기)

 

물론 로컬에서도 테스트를 할 수 있지만 피곤해서 생략하겠다.

혹시 직접 테스트하고 싶은신 분은 이클립스 eclipse.ini 파일을 열어서 Heap 사이즈를 조절해보면서 테스트 해보면 된다.

(예를들어 -Xms128M -Xmx256M 이렇게 설정하면 초기 메모리가 128M, 최대 256M으로 하겠다는 뜻이다.)

 

 

이상 String에 대한 궁금증 4가지 끝

 

반응형