자바/자바 입문 공부일지

자바 기초 공부 일지 16. String 인스턴스

Tomitom 2022. 10. 27. 15:48
반응형

 

String 을 생성하는 방법은 두 가지 입니다.

 

String str1 = new String("Simple String");
String str2 = "The Best String";

 

둘 다 인스턴스가 생성되고 그 값이 반환됩니다.  이 두 가지의 방법에 차이점이 있는지 확인해볼게요. 

 

String word1 = new String ("보드마카");
String word2 = new String ("보드마카");
String word3 = "스피커";
String word4 = "스피커";

 

new 사용 : 문자열의 내용과 무관하게 새로운 객체를 생성합니다. 

내용이 같고 다르고를 제외하고 새로운 참조 자료가 만들어집니다.

word 1의 보드마카라는 문자열이 메모리에 올라갑니다. 

word 2의 보드마카라는 문자열 또한 새로운 메모리에 올라갑니다. 

 

new 미사용 : 같은 문자열에 한해서는 동일 대상을 참조합니다. 

word 3의 스피커라는 문자열이 메모리에 올라갑니다. 

word 4의 스피커라는 문자열은 word3 이 있는 메모리에 같이 연결이 됩니다.

리터럴 형태로 문자열을 생성하면 동일 내용에 대해서는 동일 대상으로 만들어집니다. 

 

이것을 비교해보기 위해 등가 비교 연산을 해보겠습니다. 

등가비교 연산의 특징

 

1. 기본 자료형 간의 비교는 크기 비교 입니다. 

2. 참조 자료형 간의 비교는 메모리가 같은 대상인지에 대한 비교가 됩니다.  

 

우리는 참조 자료형 간의 비교를 해봅니다. 

 

 

System.out.println(word1 == word2);
System.out.println(word3 == word4);

 

 

이렇게 입력하고 확인을 해보면 각각의 메모리에 입력된 word1과 word2는 다른 대상으로 보고

동일한 메모리에 입력된 word3과 word4는 같은 대상으로 봅니다. 

 

예제를 하나 더 살펴볼게요.

아래 예제는 윤성우의 열혈 자바 프로그래밍에 나오는 예제입니다.  

 

package day14;

public class Test04 {

    public static void main(String[] args) {
                  String str1 = "Simple String";    //str1 참조변수가 메모리에 저장
                  String str2 = "Simple String";    //str1 의 변수와 동일하므로 이미 존재하는 메모리에 저장
               
                  String str3 = new String("Simple String");    // new 로 새로운 메모리에 저장
                  String str4 = new String("Simple String");    // new 로 새로운 메모리에 저장
               
                  if(str1 == str2)  
                     System.out.println("str1과 str2는 동일 인스턴스 참조");
                  else
                     System.out.println("str1과 str2는 다른 인스턴스 참조");
               
                  if(str3 == str4)
                     System.out.println("str3과 str4는 동일 인스턴스 참조");
                  else
                     System.out.println("str3과 str4는 다른 인스턴스 참조");
               }
    }

new 로 생성되는 것은 새로운 메모리의 새 공간을 차지하는 값이고, 

일반 따옴표로 참조하는 참조변수의 경우에는 기존에 같은 값이 메모리에 존재하다면 그 메모리에 연결됩니다.

이렇듯 String 의 생성방법은 인스턴스의 동일 여부에 차이가 있습니다.  

 

문자열은 Immutable 인스턴스입니다. (파이썬으로 말하자면 문자열과 튜플은 그 멤버를 수정하거나 삭제할 수 없는 것처럼) 

그렇기 때문에 생성되는 인스턴스 수를 최소화합니다.

 

출처 : 윤성우의 열혈 자바 프로그래밍

 

 

 

반응형