'string'에 해당되는 글 2건

  1. 2020.11.11 JAVA String 비교 equals
Java2020. 11. 11. 15:03

 

 

 

예전부터 한번 포스팅하고 싶었던 내용이다.

자바 코딩을 하다보면 정말 수도없이 많이쓰는 객체가 String인데, Equals 등 비교 문에 대해서 써보려고 한다.

일단 처음 선언은 두가지 방법으로 가능하다.

 

String a = "deer"; //literal. 기본자료형으로 저장(실제 값을 저장)
String b = new String("deer"); //참조형으로 저장. call by reference

 


한 가지는 String literal을 사용해서 선언가능하고 다른 한 가지는 new 키워드를 사용해서 생성할 수 있다.

차이점이 뭔지 의외로 모르는 분들이 많다.

큰 차이점은, 메모리 구조가 다르다는것!

둘 다 메모리의 힙 영역에 저장되지만 literal의 경우에는 힙영역안의 string pool이라는 영역에 자리잡게 된다.

 

String a = new String("deer");
String b = "String";
System.out.println("같은가 -> " + (a == b) );

 

 

위와같은 코드에서 결과는? 당연히 false가 나온다.

== 연산자를 이용해서 비교할때는 레퍼런스를 비교하기때문에

new로 선언한 String은 equals를 사용해 값을 비교해야 한다.

 

 

//그러나 이 경우에는 true가 나온다.
String a = "deer";
String b = "deer";
System.out.println("같은가-> " + (a == b) );

 

 

왜 이경우에는 true가 나올까? 정답은 두 개의 변수는 정확히 동일한 레퍼런스를 가리키고 있다.

자바 컴파일러에서 최적화를 위해 동일한 String 문자열이 있으면 동일하면 재사용하는것!

결국 "deer"이라는 문자를 가리키는 레퍼런스가 string pool에 1개만 있다는 뜻~

 

//equals 비교를 쓰자.
String a = "deer";
String b = new String("deer");
System.out.println("같은가-> " +  (a.equals(b));

 

 

equals로 비교한 저 경우에는 기본형과 참조형을 비교해도 true가 나올것이다.

String은 equals를 이용하여 비교할때 내용 자체를 비교하게 되어있기때문에 그렇다.

결론은 String을 객체형으로 쓸 때 equals()는 메소드, 객체끼리 내용을 비교할 수 있도록 하는것이고

==은 비교를 위한 연산자 라는것!

결국..String은 equals만 써서 비교하면된다.



그리고 객체형 String은 웬만하면 사용하지 않는것이 좋다고 한다.

생각해봐도, 실무에서도 String은 literal로 선언하기만 하면 되는것 같다.  

지금까지는 절대 new String을 쓸 일이 없었음..

정리하다보니 String 하나만 잡고 알아봐도 객체 개념, call by value, call by reference, 연산자, Equals 함수,

메모리 영역까지..재미있는(?) 정보를 많이 알 수 있는것 같다.

역시 가장 중요한건, 항상 이유를 알고 코딩하는것이라고 생각이 든다.

'Java' 카테고리의 다른 글

JAVA List를 배열로, 배열을 List로  (0) 2020.11.11
String 문자열 내의 문자열 개수 찾기  (0) 2020.11.11
Java 오늘 날짜 구하기  (0) 2020.11.11
byte 배열을 short으로  (0) 2020.11.11
int를 byte배열로 반환  (0) 2020.11.11
Posted by 사슴영혼'-'