개발자허허의 오늘은 뭐 먹지?

[JAVA] String 특징과 Flyweight 패턴 본문

Dev/자세히 알아보기

[JAVA] String 특징과 Flyweight 패턴

duck67 2021. 4. 22. 22:39
반응형

이번 포스트는 JAVA의 String과 Flyweight 디자인 패턴에 대해서 알아보려고한다.

 

JAVA에서 String은 immutable하다고 한다.

이 의미는 무엇일까..?!

String a = "test";
String b = "test";

위와 같은 선언이 있었다고 하자.

Stack영역에는 변수 a, b의 value의 주소가, 

Heap영역에는 변수 a, b의 value가 저장된다.

그리고 그 value는 Heap영역 안에 있는 String Constant Pool 영역에 저장된다.

위 예제에서 a,b 변수값은 "test"로 동일하므로 두 변수의 값은 같은 String Constant Pool의 주소를 가르키게 되는 것이다.

 

만약 a의 값이 "test2"로 바뀌었다고 했을 때,

String Constant Pool의 값을 바로 바꿔버리게 되면 변수 b의 값도 변경이 되게 된다.

그런일이 있다면 아니되오...

 

그래서 JAVA는 String value를 할당할 일이 있을때, String Constant Pool안에 동일한게 있으면 쓰고, 그렇지 않다면 새로 등록하게 된다.

즉, 한번 저장된 String의 value는 변경하면 안되므로 "immutable 하다" 라고 하는 것이다.

 

그럼 이것은 어떤 장점이 있을까?

  • JAVA Runtime시 Heap영역을 절약할 수 있다.
  • 보안상 안전하다. String은 immutable하기 때문에 (메모리 상에서) 마음대로 String을 변경할 수 없기 때문임.
  • thread-safe하다.. 값을 변경할 수 없기 때문임.
  • 마지막으로 String의 hashcode를 생성단계에서 캐싱한다고 한다. 그렇기 때문에 해당 String의 hashcode는 계산하지 않아도 된다. 그럼 .. 이게 대체 무슨뜻이냐... HashMap의 저장 구조와 관련이 있다. (Map에 value를 put할 때, collision이 나면 Map 내부적으로 LinkedList 또는 TreeMap을 쓰게 되는데, 이 때 hashcode와 내부적으로 재정의한 equals()를 사용하게 된다.) 간단하게 말해서.. HashMap을 좀 빠르게 쓸 수 있다.

그리고 바로 이것이 Flyweight Pattern이다.

- 요약 : 동일하거나 유사한 객체들 사이에 가능한 많은 데이터를 공유해서 메모리 사용을 최소화하는 패턴!

Flyweight Pattern은 JAVA의 Wrapper Class의 valueOf() 에서도 사용하고 있다.

즉, Wrapper Class를 생성할 때는 new 키워드를 사용하기 보다 valueOf()로 생성하는 것이 더 좋다.

ko.wikipedia.org/wiki/%ED%94%8C%EB%9D%BC%EC%9D%B4%EC%9B%A8%EC%9D%B4%ED%8A%B8_%ED%8C%A8%ED%84%B4

 

 

플라이웨이트 패턴 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 플라이웨이트 패턴(Flyweight pattern)는 동일하거나 유사한 객체들 사이에 가능한 많은 데이터를 서로 공유하여 사용하도록 하여 메모리 사용량을 최소화하는 소

ko.wikipedia.org

만약에 아래와 같은 코드가 있다면.. 이 것도 String Constant Poll을 사용할까?

String c = new String("test");

답은 No... 

이 경우에 c라는 변수는 Stack에 실제 value의 주소가 저장되고, Heap영역에 c의 value가 저장되기는 하지만, 

해당 영역은 String Constant Pool 밖이다.

반응형
Comments