[JAVA] 메소드 오버라이딩(재정의) - equals, toString

지수·2021년 8월 3일
0

플레이데이터

목록 보기
7/50
post-thumbnail

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 == s2true
  • 자바 기본 타입 변수(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]
profile
사부작 사부작

0개의 댓글