2013년 8월 21일 수요일

[4주차 3일] equals, toString

equals()

: Object로 부터 상속받은 메서드로 주소가 같은지를 비교한다.
그러나 String같은 클래스나 DTO(VO)같은 클래스에서는 값비교로 사용하기 위해 Overring해서 값비교 용도로 많이 사용된다.

ex>
String s1 = new String("Hello");
String s2 = new String("Hello");

if (s1.equals(s2)) {
System.out.println("s1.equals(s2)");
}

위 예제의 결과는
s1.equals(s2) 가 출력되고 String은 equals()를 Override해서 값비교 용도로 사용한다는것을 알수 있다.


ex>
class Member {
String name;
int age;

@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Member other = (Member) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}

public Class Test {
public static void Main(String[] args) {
Member m1 = new Member();
m1.name = "홍길동";
m1.age = 20;

Member m2 = new Member();
m2.name = "홍길동";
m2.age = 20;

if ( m1.equals(m2) ) {
System.out.println("m1.equals(m2)");
}
}
}

위 예제 결과는
m1.equals(m2) 출력되는 것을 확인 할 수 있을 것이다.
Member 클래스에서 equals() 를 Override하지 않았다면 m1과 m2가 다른 인스턴스이기 때문에 아무런 결과도 출력되지 않았겠지만, 위 예제에서는 Member클래스를 Override를 해줬기 때문에 값비교를 통해 m1과 m2가 같다는 결과를 출력 하수 있다.


* DTO(Value Object) 는 값들만 들어 있기 때문에 일반적으로 equals()를 재정의 해서 사용하는 경우가 많다.




toString()

: Object로 부터 상속받은 메서드로 "클래스명@인스턴스고유값"을 리턴한다.
그렇지만, 재정의 해주게 되면 원하는 값을 출력 할수도 있다.

ex>
StringBuffer buf = new StringBuffer("Hello, ");
buf.append(" World!");

System.out.println(buf);

위 예제에서는
Hello, World! 가 출력되는 것을 확인 할 수 있다.
StringBuffer 클래스는 appeand()한 값을 출력하도록 toString()을 재정의 한 경우다.

ex>
class Member {
String name;
int age;

@Override
public String toString() {
return "[" + name + "," + age + "]";
}
}

public Class Test {
public static void Main(String[] args) {
Member m1 = new Member();
m1.name = "홍길동";
m1.age = 20;

System.out.println(m1);
}
}

위 예제 결과는
[홍길동,20] 이 출력되는 것을 확인 할 수 있다.
Member 클래스에서 toString()을 재정의 하지 않았다면, "클래스명@인스턴스주소값" 이 출력 됬을것인데, 위 예제에서는 Member 클래스를 재정의 했기 때문에 재정의한 원하는 형식으로 출력이 된 것이다.



댓글 없음:

댓글 쓰기