네로개발일기

개발자 네로의 개발 일기, 자바를 좋아합니다 !

'programming language/Java'에 해당되는 글 16건


반응형

String

* String을 이용하는 방법에는 두 가지 방식이 있다.

1. new 연산자를 이용한 방식 ( String str = new String(""); )

 - new 연산자를 쓰면 Heap 영역에 할당된다. 그래서 같은 문자열이라도 다른 객체라서 선언한 만큼의 새로운 객체가 메모리에 올라간다.

 

2. 리터럴을 이용한 방식 ( String str = ""; )

  - String constant pool (상수 영역)이라는 영역에 할당된다.

  - String을 리터럴로 선언하면 내부적으로 String의 intern() 메소드가 호출된다. intern() 메소드는 주어진 문자열이 string constant pool에 존재하는지 검색한다. 있다면 그 주소값을 반환하고 없다면 string constant pool에 넣고 새로운 주소값을 반환한다. 그래서 메모리에는 하나만 올라가게 된다. 그래서 메모리에는 하나만 올라가게 된다.

 

Java6까지 string constant pool의 위치가 perm이었지만 java7 이후 Heap으로 변경되었다. perm은 고정사이즈고 runtime에 사이즈가 확장되지 않아서 변경됐다고 한다.

 

cf) 리터럴(literal) : 변수 및 상수에 저장되는 값 자체. 즉, 공간이 아니라 그 값. 정수 리터럴, 문자열 리터럴, 배열 리터럴 등등이 있다.

 

* String 객체의 hashCode() 메소드

Java에서 참조형 변수의 메모리 주소를 파악하는 방법 => Object 객체의 hashCode()

=> hashCode()의 값은 실제 메모리 주소가 아닌 메모리 주소 값을 해싱된 값이다.

 

하지만, String 객체는 hashCode() 메소드가 immutable 오버라이딩 되어있어, 주소가 아닌 문자열을 해싱한 값을 가지고 있다.

String str1 = new String("hello");.
System.out.println(str1.hashCode());            // 99162322

String str2 = new String("hello");
System.out.println(str2.hashCode());            // 99162322

 

위의 두 String 객체 s1, s2는 다른 객체이기 때문에 주소값은 다를 것입니다.

일반적인 객체였다면 hashcode() 결과값이 달라야 하지만, String 객체이므로 hashCode()의 결과 값이 같다는 것을 확인할 수 있습니다.

 

 참고 

- 이펙티브자바 아이템 6. 불필요한 객체 생성을 피하라
다음 코드는 하지 말아야 할 극단적인 예이니 유심히 한번 살펴보자.
String s =. new String("bikini");
이 문장은 실행될 때마다 String 인스턴스를 새로 만든다. 완전 쓸데없는 행위다. 생성자에 넘겨진 "bikini" 자체가 이 생성자로 만들어내려는 String과 기능적으로 오나전히 똑같다. 이 문장이 반복문이나 빈번히 호출되는 메서드 안에 있다면 쓸데없는 String 인스턴스가 수백만 개 만들어질 수도 있다.
String s = "bikini";
이 코드는 새로운 인스턴스를 매번 반드는 대신 하나의 String 인스턴스를 사용한다. 나아가 이 방식을 사용한다면 같은 가상 머신 안에서 이와 똑같은 문자열 리터럴을 사용하는 모든 코드가 같은 객체를 재사용함이 보장된다.

https://qssdev.tistory.com/38

https://victorydntmd.tistory.com/133

728x90
반응형
blog image

Written by ner.o

개발자 네로의 개발 일기, 자바를 좋아합니다 !