객체 지향 프로그래밍에서 자식 클래스가 자신의 부모 클래스에 정의된 메소드를 특정한 형태로 재정의하여 구현하는 것
equals
, toString
을 재정의하는 경우가 많음java.lang.Object
=> java.lang.String
=> equals()
문자열 객체의 값이 동일한지 비교하여 같으면 true, 다르면 false 반환
equals
는 문자열 객체의 "값(논리적 동치)"이 동일한지 비교==
는 객체들의 "주소값(물리적 동치)" 비교String s1 = "playdata"; //생성
String s2 = "playdata"; //이미 생성된 객체의 주소값을 공유, 즉 s1과 동일한 객체 참조
String s3 = new String("playdata"); //생성
String s4 = new String("playdata"); //생성
// 주소값 비교
System.out.println(s1 == s2); //true
System.out.println(s1 == s3); //false
System.out.println(s1 == s4); //false
s1 == s2
가 true
@Override
로 재정의 하지 않으면 그 클래스의 인스턴스는 오직 자기 자신과만 같고, equals 메소드는 두 인스턴스의 주소값을 비교하여 같은 객체인지 여부를 확인하여 반환함)// Person 클래스
class Person{
int age;
String name;
Person(int age, String name) {
super();
this.age = age;
this.name = name;
}
// equals 메소드 재정의
@Override
public boolean equals(Object o) {
if(o instanceof Person) { // 비교 당시에도 Object 변수이면 name, age 호출 불가
Person p = (Person) o; // name, age 호출할 수 있도록 형변환
return this.name.equals(p.name) && this.age == p.age;
}
// equals 메소드 재정의 후 확인
public static void main(String[] args) {
Person p1 = new Person(40, "재석"); // 생성
Person p2 = new Person(40, "재석"); // 생성
System.out.println(p1 == p2); // 주소값 비교라 false
System.out.println(p1.equals(p2)); // 재정의 이전 false, 재정의 이후 true로 만들기
// 재정의 이전에는 참조변수 p1, p2의 주소 비교
// 재정의 이후 값(내용) 비교
}
java.lang.Object
=> toString()
// Book 클래스
public class Book {
private String isbn; //PK
private String title;
private String authoer;
private int price;
public Book(String isbn, String title, String authoer, int price) {
this.isbn = isbn;
this.title = title;
this.authoer = authoer;
this.price = price;
}
// toString 메소드 재정의
@Override
public String toString() {
return "Book [isbn=" + isbn + ", title=" + title + ", authoer=" + authoer + ", price=" + price + "]";
}
// toString 메소드 재정의 후 확인
public static void main(String[] args) {
Book book = new Book("01a","자바의 신","자바신",15000);
System.out.println(book);
재정의 전>> model.dto.Book@7637f22
재정의 후>> Book [isbn=01a, title=자바의 신, authoer=자바신, price=15000]