우당탕탕 좌충우돌 개발일기
Object와 오버라이딩(Overriding) 본문
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값을 수정해 주면 된다.
'Programming > JAVA' 카테고리의 다른 글
StringBuffer(스트링버퍼) (0) | 2024.10.15 |
---|---|
java.lang 패키지/오토박싱(Autoboxing) (0) | 2024.10.14 |
InputStream / OutputStream(byte단위) (1) | 2024.06.11 |
스프링 빈과 의존관계(Dependency Injection) (0) | 2024.01.12 |
테스트 케이스 - assertThrows (0) | 2024.01.09 |