-
Java - '==' 연산자 와 'equals()'를 이용한 문자열 비교Language/Java 2022. 9. 20. 15:25
문자열 비교
String 변수 생성 방식
String 변수를 생성할 때는 다음과 같은 두 가지 방법이 있다.
1. 리터럴을 이용한 방식
2. new 연산자를 이용한 방식
위 두 가지 방식에는 큰 차이점이 존재한다.
리터럴 방식을 사용해서 String을 생성하면 String Constant Pool이라는 영역에 존재하게 되고, new 방식을 사용하게 되면 Heap 영역에 존재하게 된다.
String을 리터럴로 선언할 경우 내부적으로 String의 intern() 메서드가 호출되고 intern() 메서드는 주어진 문자열이 String Constant Pool에 존재하는지 검색한다. 만약, 주어진 문자열이 존재하는 경우 해당 문자열의 주소 값을 반환하고, 없는 경우에는 String Constant Pool에 문자열을 생성한 후 새로운 주소 값을 반환하게 된다.
String str1 = "apple"; // 리터럴을 이용한 방식 String str2 = "apple"; // 리터럴을 이용한 방식 String str3 = new String("apple"); // new 연산자를 이용한 방식 String str4 = new String("apple"); // new 연산자를 이용한 방식
주소 값 비교(==)와 값 비교(equals)
'==' 연산자와 'equals()' 메서드의 가장 큰 차이점은 '==' 연산자는 비교하고자 하는 두 개의 대상의 주소 값을 비교하는 반면, 'equals()' 메서드는 비교하고자 하는 두 개의 대상의 값 자체를 비교한다는 점이다.
기본 타입의 int, char 등은 call by value 형태로 주소 값을 가지지 않는다.
하지만, String은 기본 타입이 아니라 클래스이다. 클래스는 기본적으로 call by reference 형태로 생성 시 주소 값이 부여되기 때문에, String 타입을 같은 값으로 선언할 경우라도 다른 주소 값을 가지게 된다.
'==' 연산자를 이용한 문자열 비교
public class Compare { public static void main(String[] args) { String str01 = "apple"; String str02 = new String("apple"); if (str01 == str02) { System.out.println("두 개의 값은 같습니다."); } else { System.out.println("두 개의 값은 같지 않습니다."); } } }
위 코드의 결과는 두 개의 값이 같지 않다고 나온다.
참조 타입의 변수들을 비교할 때 '==' 연산자를 사용하게 되면, 서로 동일한 객체를 참조하는지, 다른 객체를 참조하는지를 비교하게 된다.
따라서, 참조 타입인 String을 비교하게 되면 Heap 영역의 서로 다른 객체 주소를 가지기 때문에 다르다는 결론이 나온다. 이러한 이유 때문에, 자바에서 문자열을 비교하기 위해서는 'equals()' 메서드를 사용해야 한다.
'equals()' 메서드를 이용한 문자열 비교
public class Compare { public static void main(String[] args) { String str01 = "apple"; String str02 = "apple"; if(str01.equals(str02)) { System.out.println("두 개의 값은 같습니다."); } else { System.out.println("두 개의 값은 같지 않습니다."); } } }
위 코드의 결과는 두 개의 값이 같다고 나온다.
String 클래스에 포함된 'equals()' 메서드를 사용하면 두 비교대상의 주소 값이 아닌 데이터 값을 비교하기 때문에 정확한 비교가 가능하다.
출처
ㆍ https://coding-factory.tistory.com/536
728x90'Language > Java' 카테고리의 다른 글
Java - 추상 클래스 & 인터페이스 (0) 2022.09.21 Java - final (0) 2022.09.20 Java - Wrapper Class (0) 2022.09.20 Java - Mutex & Semaphore & Monitor (0) 2022.04.06 Java - Reflection (0) 2022.04.05