본문 바로가기
Java

[Java] String 클래스(객체) 차이 / new String() vs "" / equals() / == 연산자

by bkuk 2022. 10. 6.

String 객체에 대해서 아래에 포스팅에도 자세히 나와있습니다. 참고해 주세요.

 

[Java] String / StringBuffer / StringBuilder

 String VS StringBuffer/StringBuilder String 클래스는 불변성의 속성을 가지며, 문자열의 추가, 수정 등에 따라 객체가 생성 StringBuffer/ StringBuilder는 가변성의 속성을 가지며 문자열의 추가, 수정 등에..

starting-coding.tistory.com


 

String으로 클래스를 생성할 때,  아래처럼 ""(큰 따옴표)로 생성하는 방법을 주로 사용합니다.

String str11 = "exit";

 

이번에는, new 예약어를 통해 String 객체를 생성해보겠습니다.

String str21 = new String("exit");

 

위에서 대입한 변수를 출력해본다면 같은 문자열이 출력되어 나옵니다.

String str11 = "exit";
String str21 = new String("exit");

System.out.println( str11 );	// exit
System.out.println( str21 );	// exit

 

생성방식에 대한 차이점""(큰 따옴표)로 생성한 String 객체String pool에 존재하는 값이 있으면 그 주소 값을 리턴하고,

new 예약어를 통해 만든 String 객체Heep 메모리에서 인스턴스화 후 주소 값을 리턴합니다.

'exit'가 Heep 메모리에 있어다시 생성됨으로 메모리 낭비가 심해진다고 생각하시면 됩니다.

 

위 포스팅에서 이를 해결할 수 있는 메서드(StringBuffer, StringBuilder)에서 대해서 작성했으니 참고하시면 됩니다.

 


String 객체의 equals 와 == 의 비교

 

equals() 메서드의 원래 기능두 인스턴스의 주소 값을 비교하여 boolean값을 반환해 주는 것입니다.

JDK에서는 String 클래스와 Integer 클래스에는 equals() 메서드가 이미 재정의되어 있습니다.

재정의된 내용은 같은 문자열의 경우 true를, 그렇지 않은 경우 false를 반환하도록 재정의되어 있씁니다.

 

비교를 위해 아래와 같이 클래스를 생성 후 변수에 대입 했습니다.

String str11 = "exit";  // String constant pool
String str21 = "exit";  // String constant pool

 

== 연산자의 경우, 서로 같은 인스턴스(String pool에 위치한 'exit')를 가르키기 때문에 true가 출력되었습니다.

equals() 메서드의 경우, 같은 문자열이면 true를 반환하도록 재정의 되어있으므로 true가 출력되었습니다.

System.out.print("String pool '==' 비교 : " ); 
System.out.println( str11 == str21);        //true

System.out.print("String pool 'equals' 비교 : " ); 
System.out.println( str11.equals(str21) );  //true

 

아래와 같이 클래스를 생성 후 변수에 대입했습니다.

String str1 = new String("exit");   // Hepp 메모리에서 생성
String str2 = new String("exit");   // Heep 메모리에서 생성

 

== 연산자의 경우 서로 다른 인스턴스(Heep 메모리에 위치의 각각의 주소)를 가르키기 때문에 false,

equals() 메서드의 경우 같은 문자열이면 true를 반환하도록 재정의 되어있으므로 true가 출력되었습니다.

System.out.print("heep '==' 비교 : " ); 
System.out.println( str1 == str2 );         //false

System.out.print("heep 'equals' 비교 : " ); 
System.out.println( str1.equals(str2) );    //true

 

== 연산자의 경우 아래 객체는 각각의 문자열이 위치한 string pool과 Heep 메모리 주소를 가르키기 때문에 false,

equals() 메서드의 경우 같은 문자열이면 true를 반환하도록 재정의 되어있으므로 true가 출력되었습니다.

        String str11 = "exit";  // String constant pool
        String str1 = new String("exit");   // 힙 메모리에서 생성
        
        System.out.print("String pool vs heep '==' 비교 : " ); 
        System.out.println( str11 == str1 );        // false
        System.out.print("String pool vs heep 'equals' 비교 : " ); 
        System.out.println( str11.equals(str1) );   // true

 

댓글