[JAVA] 메소드 오버라이딩(재정의) - equals, toString
1. 메소드 오버라이딩이란?
객체 지향 프로그래밍에서 자식 클래스가 자신의 부모 클래스에 정의된 메소드를 특정한 형태로 재정의하여 구현하는 것
- 자식 클래스에서 재정의한 메소드는 자식 객체에서만 접근 가능
- 메소드 오버라이딩 후에는 부모 객체에서 호출했을 때와 자식 객체에서 호출했을 때 메소드가 각각 다름
- 아래의
equals
,toString
을 재정의하는 경우가 많음
(이클립스 상단 툴바 Source - Generate toString / Generate hashCode() and equals() 사용 가능)
2. equals 재정의
⏺ equals 메소드란?
java.lang.Object
=> java.lang.String
=> equals()
문자열 객체의 값이 동일한지 비교하여 같으면 true, 다르면 false 반환
⏺ 'equals' vs '=='(동등비교 연산자)
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
- String의 경우 new 생성자를 명시하지 않고 객체를 생성할 경우, 값이 같으면 이미 생성된 객체의 주소값을 공유하기 때문에
s1 == s2
가true
- 자바 기본 타입 변수(8개)는 메소드를 불러올 수 없어서 equals 사용 불가
- String을 비롯한 사용자 정의 객체의 경우 equals를 사용할 수 있음
⏺ equals 메소드 재정의
- String 변수 두 개의 값을 비교할 때는 equals를 그대로 써도, 논리적 동치 여부를 비교하여 출력
- 그 외 클래스의 인스턴스를 만들어 두 인스턴스의 멤버 변수 값이 동일한지(논리적 동치) 확인하기 위해서는 equals 메소드 재정의 필요
(@Override
로 재정의 하지 않으면 그 클래스의 인스턴스는 오직 자기 자신과만 같고, equals 메소드는 두 인스턴스의 주소값을 비교하여 같은 객체인지 여부를 확인하여 반환함) - 객체 동일 여부가 중요한 것이 아니라 객체가 달라도 보유하고 있는 문자열 데이터가 같은지 다른지를 확인하기 위해 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의 주소 비교
// 재정의 이후 값(내용) 비교
}
3. toString 재정의
⏺ toString 메소드란?
java.lang.Object
=> toString()
- toString 메소드를 재정의 하지 않고 사용하면 클래스 이름과 해시 코드를 이어붙여 출력함
- toString 메소드의 일반 규약에 따라, 객체 내 중요 정보(멤버 변수)를 전부 담아 문자열로 반환할 수 있도록 재정의 필요
⏺ 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]
Author And Source
이 문제에 관하여([JAVA] 메소드 오버라이딩(재정의) - equals, toString), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@geesuee/JAVA-메소드-오버라이딩equals-toString저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)