본문 바로가기

JAVA/복습

Object와 overriding

Object 클래스, 

모든 클래스의 최상위 클래스

아무것도 상속받지 않으면 자동으로 Object를 상속받기 때문

이 말은 Object가 가지고 있는 메소드는 모든 클래스에서 사용할 수 있다는 것을 의미

 

Object 가 가지고 있는 메소드 중에서 가장 많이 사용되는 메소드

 

1.  equals()

: 객체가 가지고 있는 값을 비교할 때 사용, 같은 값인 지 아닌지를 비교할 때 사용

  객체 간의 같다 다르다를 비교하려면 기준이 필요하다.( 예시: 학번 또는 이름만 같으면 같다할 것인지 등)

  즉, Object는 같은 값인지 다른 값인지에 대해서 비교할 수 있는 메소드는 제공하고 있지만

  그 메소드를 오버라이딩해서 기준을 정해주는 것은 프로그래머가 해야하는 일이다.

 

  String 클래스의 equal()는 Object 가 가지고 있는 메소드를 오버라이딩한 것이다.

  그래서 String클래스가 가지고 있는 equlas를 사용했을 때, 안에 가진 문자열들이 모두 같으면 같아요라고 리턴하는 것이다.

 

2. toString()

: 객체가 가지고 있는 값을 문자열로 바꾸어서 리턴하는 메소드, 객체가 가진 값을 문자열로 반환

               

3. hashCode()

: 객체에 해시코드를 구하는 메소드, 객체의 해시코드 값 반환

   해시코드의 값은 되도록 객체 별로 서로 다른 값을 가지게하는 것이 좋다.

   해시코드는 프로그래밍하다보면 자주 사용된다(주: 자료구조)

 

이 메서드들을 사용할 때 반드시 오버라이딩해서 사용해야 한다.

 


package java03.day01;

import java.util.Objects;

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


    // 단축키 - Alt + insert
    // Generate Equals and Hashcode()
    @Override
    public boolean equals(Object o) { //메소드의 파라미터로 들어온 오브젝트와 자신과 비교한다
        // this와 obj가 같다면, 참조가 같은 것을 의미하므로 무조건 같다.
        if (this == o) return true;

        // 또한 인자로 들어온 obj가 null이라면 비교할 필요도 없이 false라는 것을 알 수 있다.
        if (o == null || getClass() != o.getClass()) return false;

        // obj를 Student로 형변환한 후에 자신의 number와
        Student student = (Student) o;
        // obj의 number를 비교해서 같으면 true를 반환
        // 같지 않다면 false 를 반환
        return birthYear == student.birthYear && name.equals(student.name) && number.equals(student.number);
    }

    @Override
    public int hashCode() {
        /*
            해시코드를 구하는 것은 일종의 수학식이다.
            되도록 유일하지 않은 값을 반환하도록 한다.
            소수중의 하나인 31값과 특정수를 몇개 곱하여 만든다.
            해시코드를 구하는 방법은 자동으로 만들어진 코드 말고도
            알고리즘 공부를 통해 가능하다.
        */
        return Objects.hash(name, number, birthYear);
    }

    // toString() 활용  - 단축키 Alt + insert
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", number='" + number + '\'' +
                ", birthYear=" + 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());


        //toString()
        System.out.println(s1); // toString()이 아닐경우 주소 값이 출력된다. ==> toString()을 활용하면 Json형태로 출력
        System.out.println(s1.toString()); // 이 방법으로도 toString()


    }

}

'JAVA > 복습' 카테고리의 다른 글

Generic  (0) 2021.10.20
java.lang 패키지/ 오토박싱  (0) 2021.10.20
사용자 정의 Exception  (0) 2021.10.16
Exception 발생시키기  (0) 2021.10.16
throws  (0) 2021.10.16