Back-End/Java(자바)

Object 클래스와 오버라이딩

FIF 2019. 10. 16. 15:44
반응형

Object와 오버라이딩

 

Object 클래스

Object 클래스는 모든 클래스의 최상위 클래스입니다.

아무것도 상속받지 않으면 자동으로 Object를 상속받기 때문에, Object가 가지고 있는 메소드는 모든 클래스에서 다 사용할 수 있다는 것을 의미합니다.

Object가 가지고 있는 메소드 중에서 가장 많이 사용되는 메소드는 equals, toString, hashCode가 있으며 이는 반드시 오버라이딩해서 사용해야 합니다.

 

가장 많이 사용 되는 메소드

(※사용자의 요구에 맞도록 오버라이딩을 해서 사용해야 한다.)

 

• equals : 객체가 가진 값을 비교할 때 사용

 

• toString : 객체가 가진 값을 문자열로 반환

 

• hashCode : 객체의 해시코드를 구할 때 사용

 

 

 

public class Student {
	// 학생 이름
	String name;
	// 학번
	String number;
	// 생년
	int birthYear;
    
    public static void main(String[] args) {
    	Student s1 = new Student();
		// 학생 객체에 속성 부여
		s1.name = "홍길동";
		s1.number = "1234";
		s1.birthYear = 1995;

		Student s2 = new Student();
		// 학생 객체에 속성 부여
		s2.name = "홍길동";
		s2.number = "1234";
		s2.birthYear = 1995;
        
        if (s1.equals(s2))
			System.out.println("s1 == s2");
		else
			System.out.println("s1 != s2");
            
        System.out.println(s1.hashCode());
	System.out.println(s2.hashCode());
    }
}

위 코드에서 Studnet클래스의 s1과 s2 객체들의 값이 동일하다.

하지만, 콘솔창에 출력해보면 다르다고 나옴을 알 수 있다.

해시코드 값도 다르다.(해시코드는 객체를 식별할 수 있는 정수값 정도로 생각하면 된다.)

그래서 equals 메소드와 hashCode 메소드를 우리가 사용하는 목적에 맞도록

오버라이딩해서 재정의 해야한다.

친절하게도 이클립스에는 Object클래스의 자주 사용하는 메소드들에 대해 오버라이딩을 쉽게 할 수 있도록 지원한다.

 

1) 상단의 'Source - Generate hashCode() and equals()...' 를 클릭한다.

    Alt + Shift +  S 단축키로도 가능하다.

2) 사용하고자 하는 필드를 선택한다.(여기선 학생의 번호만 알면 그 학생을 알 수 있으므로, number에만 체크함) 그럼, 코드가 저절로 생성된다.

public class Student {
	// 학생 이름
	String name;
	// 학번
	String number;
	// 생년
	int birthYear;

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((number == null) ? 0 : number.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		//참조가 같음을 의미한다.
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		//클래스에 대한 정보를 가지고 있다.
		if (getClass() != obj.getClass())
			return false;
		Student other = (Student) obj;
		if (number == null) {
			if (other.number != null)
				return false;
		} else if (!number.equals(other.number))
			return false;
		return true;
	}

	public static void main(String[] args) {
		Student s1 = new Student();
		// 학생 객체에 속성 부여
		s1.name = "홍길동";
		s1.number = "1234";
		s1.birthYear = 1995;

		Student s2 = new Student();
		// 학생 객체에 속성 부여
		s2.name = "홍길동";
		s2.number = "1234";
		s2.birthYear = 1995;

		if (s1.equals(s2))
			System.out.println("s1 == s2");
		else
			System.out.println("s1 != s2");

		System.out.println(s1.hashCode());
		System.out.println(s2.hashCode());

		//Student 객체의 인스턴스 s1을 알고 싶다
		System.out.println(s1);
		System.out.println(s1.toString());

	}

	@Override
	public String toString() {
		return "Student [name=" + name + ", number=" + number + ", birthYear=" + birthYear + "]";
	}
}

 

오버라이딩 하여 재정의 하니까 같다고 나온다.

 

toString 메소드는 개체의 값을 String 형태로 변환해서 보여준다.

 

 

Object와 오버라이딩 – 실습

문제 설명

Car클래스는 name과 number라는 필드를 가집니다. Car클래스를 문자열로 바꾸면 다음과 같은 형식이 되도록 toString메소드를 오버라이드 해 보세요.

name: [이름], number: [번호]

 

예를들어 name의 값이 Car이고, number가 1234이라면, 해당 오브젝트의 문자열 값은 "name: Car, number: 1234"와 같이 되어야 합니다.

 

 

public class Car {
	String name = "Car";
	int number = 1234;

	@Override
	public String toString() {
		return "name: " + name + ", number=" + number + "";
	}
}

 

public class CarExam {
	public static void main(String[] args) {
		Car ex = new Car();
		System.out.println(ex);
	}
}

 

반응형