Java에서 ==와 equals()는 둘 다 비교 연산자이지만, 서로 다른 방식으로 두 개의 값이 같은지를 판단합니다.
== 연산자는 두 개의 값이 메모리 상의 같은 위치에 있는지를 확인합니다. 즉, == 연산자는 비교하는 두 개의 값이 정확히 같은 객체인지를 확인합니다. 따라서, == 연산자는 객체의 값을 비교하지 않습니다.
반면에 equals() 메소드는 두 객체가 서로 같은 값을 가지는지를 비교합니다. equals() 메소드는 Object 클래스에서 정의된 메소드이므로, 모든 객체에서 사용할 수 있습니다. 일반적으로, equals() 메소드를 사용하여 두 객체가 가지고 있는 값을 비교하고, == 연산자는 두 객체가 정확히 같은 객체인지를 확인하기 위해 사용합니다.
예를 들어, 다음은 == 연산자와 equals() 메소드를 사용하여 String 객체를 비교하는 방법을 보여주는 예제 코드입니다.
String str1 = "Hello";
String str2 = "Hello";
String str3 = new String("Hello");
System.out.println(str1 == str2); // true
System.out.println(str1 == str3); // false
System.out.println(str1.equals(str2)); // true
System.out.println(str1.equals(str3));
Java에서 문자열 리터럴은 내부적으로 문자열 풀(String Pool)이라는 메모리 영역에 저장됩니다. 문자열 리터럴이 같으면, Java는 이들을 동일한 문자열로 처리하여 하나의 문자열 인스턴스만 생성합니다. 따라서, String str1 = "Hello"와 String str2 = "Hello"에서 str1과 str2는 같은 문자열 리터럴 "Hello"을 참조하며, 이는 하나의 문자열 인스턴스를 가리키게 됩니다. 이것을 "문자열 리터럴 풀링(String Literal Pooling)"이라고 합니다.
따라서, str1과 str2가 같은 주소에 값이 있는 것입니다. 이는 == 연산자를 사용하여 두 개의 문자열을 비교할 때도 확인할 수 있습니다. str1 == str2의 결과는 true가 됩니다.
그러나, 만약 String str3 = new String("Hello")와 같이 문자열을 생성할 때 new 키워드를 사용하여 새로운 문자열 인스턴스를 생성하면, 문자열 풀을 사용하지 않고 새로운 문자열 인스턴스를 생성합니다. 따라서, str1과 str3는 같은 문자열 리터럴을 참조하지 않으며, 서로 다른 문자열 인스턴스를 가리키게 됩니다. 따라서, str1 == str3의 결과는 false가 됩니다.
위 내용을 동등성과 동일성의 개념으로 설명 할 수 있습니다.
String str1 = "Hello"와 String str2 = "Hello"의 경우, str1과 str2는 동일성과 동등성이 모두 성립합니다. 동일성은 두 개의 객체가 정확히 같은 객체인지를 비교하는 개념입니다. 동일한 객체를 가리키는 두 개의 참조는 동일성이 성립합니다. 이때 == 연산자는 두 참조가 동일한 객체를 가리키는지를 확인하므로, str1 == str2의 결과는 true가 됩니다.
동등성은 두 객체가 서로 같은 값을 가지는지를 비교하는 개념입니다. equals() 메소드는 두 객체가 서로 같은 값을 가지는지를 비교하므로, str1.equals(str2)의 결과는 true가 됩니다.
반면에, String str3 = new String("Hello")와 같이 문자열을 생성할 때 new 키워드를 사용하여 새로운 문자열 인스턴스를 생성하면, str1과 str3는 동등성은 성립하지만, 동일성은 성립하지 않습니다. str1과 str3는 서로 다른 객체를 가리키지만, equals() 메소드를 사용하여 두 객체가 동등한지 비교할 때는, 내용이 같은 "Hello" 문자열을 가지므로 결과는 true가 됩니다.
'Programming > Java' 카테고리의 다른 글
객체 상태의 영속화 (0) | 2023.02.22 |
---|---|
객체 직렬화 (Object Serializable) (0) | 2023.02.22 |
Java 배열에서 최소값, 최대값 찾기 (0) | 2023.02.21 |
[Java] StringBuffer와 reverse 함수를 사용하여 문자열 거꾸로 출력하기 (0) | 2022.09.05 |
[Java] 배열 역순으로 출력하기 (0) | 2022.09.04 |