코딩못하는사람

문자열 String 본문

자바 메모장/개념 및 문법

문자열 String

공부절대안함 2021. 1. 28. 00:43

자바의 String 객체와 String 리터럴

자바에서 String은 객체로 선언할 수도 있고 리터럴로도 선언할 수 있다.

String temp=new String("abcde");       은 new 연산자를 활용한 객체 생성 방식

String temp1="abcde";                        은 문자열 리터럴 방식으로 선언한 방식이다.

 

 

객체를 생성하는 방식은 Heap영역에, 리터럴은 Heap영역 속 String constant pool에 저장된다.

예시 그림을 보고 이해하자.

https://madplay.github.io/post/java-string-literal-vs-string-object

 

 

String str1 = "madplay";

String str2 = "madplay";

String str3 = new String("madplay");

String str4 = new String("madplay");

 

 

 

 

 

 

문자열 비교

equals메소드: String의 equals()를 사용하면 단순히 문자열들의 값을 비교한다.

==연산 : 각 객체들의 주소값을 비교한다.

따라서 new 연산자로 str3,str4는 equals 메소드로는 true지만 ==연산은 false이다.

str3.equals(str4)  >>true                str3==str4 >>   false

str1.equals(str4)  >>true                str1==str4 >>   false

str1.equals(str2)  >>true                str1==str2 >>    true

 

 

왜?

문자열 리터럴의 경우에는 String의 intern메서드를 호출해서 비교한다고 한다.

intern메서드는 해당문자열이 String constant pool에 존재하면 그 주소를 반환하고

없으면 새로 집어넣고 가져온다고 한다.

 

위의 예시를 마저 이용하면 str1==str2인 이유는 str1에서 scp에 문자열을 만들어 놓았고

str2에서는 그 주소를 받아와서 연산을 하므로 서로 같은 주소이므로 true값이다.

 

str1==str3는 당연히 false일테지만 str1==str3.intern()은 true일 것이다.

(intern은 "madplay"의 scp주소를 가져올 것이므로)

 

madplay.github.io/post/java-string-literal-vs-string-object를 보고 공부하였습니다.

Comments