우당탕탕 좌충우돌 개발일기

Object와 오버라이딩(Overriding) 본문

Programming/JAVA

Object와 오버라이딩(Overriding)

성동구불주먹 2024. 10. 10. 15:35

Object 클래스

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

아무것도 상속받지 않으면 자동으로 Object를 상속받게 됨.

즉, Object가 가지고 있는 메서드는 모든 클래스에서 다 사용할 수 있다는 의미이다.

 

 

🍅 가장 많이 사용되는 메서드 - 반드시 오버라이드(Override)해서 사용해야 함

  • - equals
    : 객체가 가진 값을 비교할 때 사용
  • - toString
    : 객체가 가진 값을 문자열로 반환
  • - hashCode
    : 객체의 해시코드 값을 반환

 

위 3가지의 메서드는 자주 쓰이는 대표적인 메서드로, 개발자도구에서도 바로 사용할 수 있다.

 

 


 

 

💻 실습

 

[오버라이드 안 한 ver]

1. Student 클래스를 생성한다.

2. Student 클래스 안에 name, number, birthYear 필드를 선언한다.

3. main 메서드를 선언 한 다음 Student 기반의 s1, s2 객체를 생성한다.

4. 각 객체의 속성값을 동일하게 부여한다.

5. equals 메서드를 이용해 s1, s2를 비교한 값을 출력한다.

6. hashCode 메서드를 이용해 s1, s2의 해시코드 값을 반환한다.

package org.example;

import java.util.Objects;

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());
    }
}

 

[출력 결과값]

s1 != s2
1163157884
1956725890

 

???????????????????????????

객체에 속성값을 동일하게 설정했는데 왜 출력값이 다르다고 나오는가.. 또 해시코드값은 왜 다른 것인가..

그거슨 바로 오버라이드를 하지 않았기 때문

그럼 다시 오버라이드 해서 실습해본다.

 


 

[오버라이드 한 ver]

1. main 메서드 위에 Alt + Insert (인텔리제이 기준)을 누른 다음에, equals() and hashCode() 선택

2. equals와 hashCode에 포함될 필드를 선택한 후 next -> next -> create 버튼 클릭

3. @Override 어노테이션이 붙여진 메서드가 생성돼있는 걸 확인

4. 값을 출력해 보자.

package org.example;

import java.util.Objects;

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

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return birthYear == student.birthYear && Objects.equals(name, student.name) && Objects.equals(number, student.number);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, number, 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());
    }
}

 

[출력 결과값]

s1 == s2
545426518
545426518

 

🙌 바로 이거지.

오버라이드를 하니까 s1과 s2의 결과값이 같고, 해시코드 값도 동일하게 잘~ 출력된다.

 


 

그럼 이번엔 toString()도 사용해 보자.

main 메서드 안에 아래 코드만 한 줄 추가해 보았다.

System.out.println(s1.toString());

 

[출력 결과값]

org.example.Student@20828c56

 

누구세요.

무서워요.

 

다시, 오버라이드 해서 해본다.

아까처럼 동일하게 Alt+Insert ->  toString() 선택

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

 

[출력 결과값]

Student{name='홍길동', number='1234', birthYear=1995}

 

🙌 오예

만약 출력형식을 변경하고 싶다면 Override 된 toString() 형식 return값을 수정해 주면 된다.

반응형