안녕하세요.
문제를 이해하기전에 한가지 알아둘 부분이 있습니다.
자바에서 문자열은 객체로 다루어진다는 사실입니다.
String str1 = new String("test");
String str2 = new String("test");
이렇게 2개의 똑같은 문자열을 생성하더라도 독립된 2개의 문자열 객체가 만들어집니다.
== 연산자는 두 값을 비교하는 연산자인데요,
기본타입이야 값 자체를 저장하고 있으니 그냥 비교하면 되고, 참조변수는 변수 자체에 객체를 저장하는 것이
아니라 객체가 위치한 주소값을 가지고 있다고 이해하시면 됩니다.
참조변수 == 참조변수 의 결과는 실제로 같은 객체인지 여부가 결과가 나오겠지요.
위에서 str1 == str2 는 false가 나옵니다. 서로 독립된 같은 객체이니깐요.
이부분은 이해가 되실겁니다.
equals()메소드는 어떤 객체의 같음 여부를 판단하는 기준점을 만들어 주는 것이라고 생각하면 됩니다.
int n = 100; int n2 = 200;
n과 n2를 비교한다면 우리는 당연히 100과 200이라는 값의 크기를 비교합니다.
하지만 객체의 경우 그 기준이 없습니다.
class A{
int num1;
int num2;
}
이런 클래스가 있고, A a1 = new A(); A a2 = new A2();
a1과 a2를 비교한다고 할때 어떤걸 기준으로 비교해야 할까요?
지금이야 멤버변수가 있지만 없는 경우도 있지요. 경우에 따라서는 문자열만 가지고 있을수도 있구요.
우리는 num1과 num2를 비교하면 되겠지 하고 생각을 하겠지만, 자바는 기준이 없기 때문에 스스로 판단하는 것이
아니라 해당 클래스의 equals()메소드를 호출해서 그 반환값을 가지고 판단합니다.
클래스의 모든 조상 Object에 선언된 메소드이기 때문에 모든 클래스는 모두 가지고 있습니다.
그리고 Object의 equals()메소드는 주소값으로 비교하도록 되어있습니다.
여기에 답이 있습니다.
두번째 코드에서 Student 의 두 객체를 만들고, equals()를 하면 false가 나옵니다.
equals()를 오버라이딩 하지 않았다면, 서로 주소값을 비교하도록 되어있기 때문에 false가 나오는 것이지요.
그런데 문자열은 true가 나오지요??
이는 String 클래스에는 이미 equals()가 가지고 있는 문자열로 비교하도록 오버라이딩 되어 제공되기 때문입니다.
참고하시고, 궁금한 부분 있으시면 추가질문 주세요~