switch(비교대상변수) {
case 입력값1: ...
break;
case 입력값2: ...
break;
...
default: ...
break;
}
while (조건문) {
<수행할 문장1>;
<수행할 문장2>;
<수행할 문장3>;
...
}
do {
<수행할 문장1>;
<수행할 문장2>;
<수행할 문장3>;
...
} while(boolean조건)
동치라는 개념에 대해 먼저 알아보자.
기본 자료형의 값을 비교할때는 !=,== 연산자를 사용해서 비교한다. !=,== 연산자를 기본 자료형 비교에 사용했을때는 값의 비교가 이루어 지지만, 참조자료형에 대해서는 주소값 비교가 일어난다.
❓참조 자료형에서는 왜 주소값 비교가 일어나는가?
참조변수는 객체를 가르키는 변수이므로, 참조변수에는 객체에 대한 주소(Heap 주소)값이 들어있다. 그러므로 객체에 대해 !=,== 연산 시 메모리 주소값을 비교하게 된다. 다시말해 객체마다 최상위 부모클래스 Object로 부터 상속받은 hashCode()를 리턴하게 된다.
아래 예시를 보면 참조변수 member1, member2의 객체의 필드값은 동일하지만 주소값이 다른것을 확인 할 수 있다.
public class EqualityTest {
public static void main(String[] args) {
EqualityTest equalityTest = new EqualityTest();
equalityTest.equalMethod();
}
public void equalMethod() {
MemberDTO member1 = new MemberDTO("smith");
System.out.println("member1 = " + member1);
MemberDTO member2 = new MemberDTO("smith");
System.out.println("member2 = " + member2);
if(member1 == member2) {
System.out.println("member1 and member2 is same");
} else {
System.out.println("member1 and member2 is not same");
}
}
}
member1 = MemberDTO@59a6e353
member2 = MemberDTO@7a0ac6e3
member1 and member2 is not same
❓equals도 내부적으로 ==를 사용하는데, 왜 동등성을 비교할 때 equals를 사용해야 할까?
== 연산자를 사용하는것은 인스턴스 변수에 들어있는 주소값을 비교하는 연산이므로 객체의 동치를 확인 하기 위해서는 Object로 부터 상속받은 equals(), hashCode()를 Overring해서 동등한 객체에서 같은 해시코드를 리턴하도록 해야한다. Overriding 하지 않는 경우 조상 Object의 메서드를 사용하게 된다.
a.equals(b) → a.hashCode() == b.hashCode()가 성립하지만 a.hashCode() == b.hashCode() 맞다고 해서 a.equals(b)이 성립하지 않는다.위의 예시에서 비교할 객체에 equals()와 hashCode()를 재정의 하였다.
public class MemberDTO {
private String name;
public MemberDTO(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (o == null || getClass() != o.getClass())
return false;
MemberDTO memberDTO = (MemberDTO)o;
return name.equals(memberDTO.name);
}
@Override
public int hashCode() {
return Objects.hash(name);
}
}