2021. 3. 1. 11:40ㆍ프로그래밍 언어/Java
Java에서 값 비교를 할 때 일반적으로 == 연산자를 사용합니다.
그러나 문자열은 String 클래스이기 때문에 Primitivie Type(int, char 등)이 아닌 Reference Type이기 때문에 ==로 비교하게 되면 값 비교가 아닌 주소값 비교가 됩니다.
따라서, String에서 문자열 값을 비교하고 싶으면 equals 함수를 사용해야 합니다.
이 2가지 차이점을 알아보도록 하겠습니다.
특히, ==연산자 주소값 비교가 어떤 방식으로 하는지 보여드리겠습니다.
1. == 연산자 비교 : 주소값 비교
2. equals 함수 비교 : 문자열 값 비교
소스
str1 변수는 문자열로 값을 설정하였습니다.
str2 변수는 String 클래스로 new하였습니다.
str3 변수는 StringBuffer와 같이 다른 클래스를 사용하여 문자열을 생성하고 toString 함수로 문자열을 받았습니다.
String str1 = "abc";
String str2 = new String("abc");
String str3 = new StringBuffer().append("abc").toString();
System.out.println("str1 = " + str1);
System.out.println("str2 = " + str2);
System.out.println("str3 = " + str3);
if (str1 == str2) System.out.println("str1 == str2");
else System.out.println("str1 <> str2");
if (str1 == str3) System.out.println("str1 == str3");
else System.out.println("str1 <> str3");
if (str1.equals(str2)) System.out.println("str1, str2은 같습니다.");
else System.out.println("str1, str2은 다릅니다.");
if (str1.equals(str3)) System.out.println("str1, str3은 같습니다.");
else System.out.println("str1, str3은 다릅니다.");
출력
문자열 값을 출력해보면 육안상으로 보기엔 값이 동일해보입니다.
== 연산자로 비교하면 모두 다르다고 나옵니다.
equals 함수로 비교하면 문자열 값으로 비교하기 때문에 같다고 나옵니다.
// 문자열 값 출력
str1 = abc
str2 = abc
str3 = abc
// == 비교
str1 <> str2
str1 <> str3
// equals 함수 비교
str1, str2은 같습니다.
str1, str3은 같습니다.
== 연산자 주소 비교
== 연산자로 비교했을 때 값이 다른 이유는 디버깅을 해보면 알 수 있습니다.
우측 Variables 탭에서 str1, str2, str3의 id를 보시면 22, 29, 30으로 모두 다릅니다.
C에서 메모리 주소가 표시된다고 하면 자바에서는 id값으로 주소를 표현하고 있습니다.
저 id가 같으면 동일한 reference를 가지므로 == 연산자로 비교하면 같지만
지금과 같이 new를 하거나 다른 클래스에서 toString으로 문자열을 생성한 경우는 id가 모두 다릅니다.
'프로그래밍 언어 > Java' 카테고리의 다른 글
[Java] 자주 사용하는 날짜 포맷 (SimpleDateFormat) (0) | 2021.02.25 |
---|---|
[Java] j2ssh 로그 비활성화 (disable) 설정 (0) | 2021.02.21 |
[Java] Date - 오늘 날짜/시간 출력 (0) | 2021.02.15 |
[Java] 문자열 자르기(추출) - 정규표현식 예제 (0) | 2021.01.08 |
[Java] 문자열 자르기(추출) - 정규표현식(Pattern, Matcher) (0) | 2021.01.04 |