예전부터 한번 포스팅하고 싶었던 내용이다.
자바 코딩을 하다보면 정말 수도없이 많이쓰는 객체가 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 |