[Java] java.lang.Object 클래스 - (1) equals()
2022. 10. 5. 15:12ㆍDev.Program/Java & Spring
728x90
p408 java.lang 패키지 ⇒ equals() / toString()
======== Ex4.java
< java.lang.Object 클래스 >
- 모든 클래스들의 최상위 클래스
- ⇒ Object 클래스의 모든 멤버는 다른 모든 클래스에서 사용 가능
1. getClass(); 대상 객체의 클래스 타입 리턴
- 출력창
- 대상 객체의 클래스 타입 리턴
- 클래스 라는 객체 타입
- 출력창
- String 객체 타입
2. hashCode(); 대상 객체의 해쉬코드 값을 정수로 리턴
- 객체가 생성되어 있는 메모리 공간(Heap)의 주소값
- 출력창 (이 값은 선생님이랑 다를 수도 있다!) ⇒ 10진수
- 대상 객체의 해쉬코드 값을 정수로 리턴
3. toString(); 대상 객체의 정보를 문자열로 변환하여 리턴
- 일반 객체의 toString() 메서드 실행 결과는 클래스명 + "@" + hashCode()의 16진수 변환결과, 실행결과와 같다.
- 출력창(이 값은 선생님이랑 다를 수도 있다!) ⇒ 16진수
- 대신 여기는 같음!
- 메서드 이름이 to*** 이면 x 를 *** 타입으로 변환하는 메서드
- toString() 이니까 x를 문자열(String) 타입으로 변환
- 윈도우에서 계산기 찾아 들어가기
- 메뉴에서 프로그래머 선택
- 출력창에 나온 10진수 값 계산기에 넣어보기
- 캡쳐 화면을 보면 값이 같은 것을 볼 수 있다!! (10진수 → 16진수 변환한 것)
- getClass().getName() + "@" + Integer.toHexString() 실행결과와 같다!
- 그냥 p를 찍어도
- 출력창 (toString 결과와 같음)
- 출력문에서 toString() 메서드 생략하고, 객체만 출력해도 toString() 결과와 동일
- ⇒ 즉, 출력문에서 toString() 메서드는 생략 가능하다! (단, 출력문에서만 가능)
- 객체를 문자열 변수에 저장 불가
- p.toString() 으로는 가능하다 (String 타입이기 때문)
4. equals(); 대상 객체와 현재 객체가 같은지를 비교
- 기본적으로 객체의 주소값을 비교
- p와 p2 가 같은지 비교
- 출력창
- 이유는 나중에 설명!!
======== Ex5.java ⇒ equals() 메서드를 좀 더 자세하게 알아보자
< Object 클래스의 equals() 메서드 특징 >
- 두 객체에 대한 동등비교 수행
- 기본적으로 두 객체의 주소값을 비교하므로 동등비교연산자(==) 사용 결과 동일
- 일반적으로 '두 객체가 같다' 라는 의미는, 두 객체의 데이터(멤버변수 값)가 동일하다는 의미로 사용되는 것이 대부분이다.
- ⇒ 따라서, 클래스 정의 시 equals() 메서드를 오버라이딩하여 해당 객체 내의 모든 멤버변수 비교를 통해 동등여부를 리턴하도록 해야함(단축키 Alt + Shift + S → H)
- 자바에서 제공하는 대부분의 API 는 equals() 메서드가 오버라이딩되어 있으므로 객체간의 실제 데이터 비교를 쉽게 할 수 있다.
(ex. String, ArrayList 등)
- 출력창
- new 할 때마다 주소값은 달라진다!
- 출력창
- Person p2 = p1; → p1 인스턴스의 주소값을 p2 에 저장(복사)
- 출력창
- 이렇게 해도 위와 결과값은 동일
- Person5 클래스 만들기
- Object class 의 equals() 메서드를 오버라이딩하여 모든 멤버변수(name, age)가 같은지 비교한 후 같으면 true, 아니면 false 리턴
- 오버라이딩 단축키 Alt + Shift + R → V
- equals 체크
- Person5 생성자도 만들어주기
<Ex5.java → main()>
- 출력창
- p3와 p4 구분 잘하기!!! ⇒ 나중에 이 부분 혼동하기 쉽습니다!!
- equals() 는 누구꺼? p3 꺼, equals 에서 받아오는 파라미터값은? p4
- p3 의 equals() 에서 p4를 obj 로 넣어줌
- Person5 → Object 타입으로 업캐스팅 일어남(obj 는 Object 타입이기 때문)
- ⇒ Object는 최상위 클래스이기 때문에 어떤 클래스든 Object 로 변환하면 업캐스팅이라고 할 수 있다.
- obj.name 이 없다! 왜? obj는 name을 모르기때문!
ex) 우리 업캐스팅 할 때 배운거 → 엄마한테 스마트폰을 줘도(업캐스팅) 스마트폰에 있는 카카오톡 기능을 몰라서 사용하지 못한다! )
- 그럼 어떻게 해야할까?
⇒ 다시 다운캐스팅 (Object 타입을 Person5 타입으로) 한 뒤 불러주면 가능하다.
( 앞에서 업캐스팅 / 다운캐스팅 배웠을 때랑 똑같음! → 모르면 앞부분 다시 공부하기 )
- Obj 를 p로 다운캐스팅 후 p. 하면 name이 보임!
- String 타입이므로 equals 로 비교
- age 는 int 타입이므로 동등비교연산자(==)를 사용하면 됨
<Ex5.java → class Person5 {} 내부>
@Override
public boolean equals(Object obj) {
boolean result = false;
// Person5 타입 인스턴스가 파라미터로 전달될 때
// Object 타입으로 업캐스팅 일어남
⇒ Person5 타입 멤버에 접근하려면 다시 다운캐스팅 필수!
// instanceof 연산자를 사용하여
// Person5 타입으로 다운캐스팅 가능 여부 판별
if(obj instanceof Person5) {
// obj 를 Person5 타입으로 다운캐스팅 수행
Person5 p = (Person5)obj;
if(name.equals(p.name) && age == p.age) {
// 멤버변수 name 비교 && age 비교
result = true;
}
}
return result;
}
- 최종 코드
- 지금은 원리를 이해하기 위해서 하나하나 코드를 쳐봤지만, 나중엔 이렇게 따로 안만들어줘도 단축키로 자동생성 가능!
<Ex5.java → main()>
if(p3.equals(p4)) { // equals를 호출한 객체는p3 파라미터값은p4
System.out.println("p3, p4 실제값(데이터)이 같다!");
} else {
System.out.println("p3, p4 실제값(데이터)이 다르다!");
}
- 출력창
- 아깐 다르다로 나왔는데 지금은 같다로 나온다! (두번째 줄 확인)
- equals() 단축키 : Alt + Shift + S → H
- 그냥 만들어보기(아무것도 체크 안한 상태)
- 위에 만들었던 코드 자동으로 만들어 줌.
- 이 부분 체크 추가하고 다시 만들어보기
- instanceof 도 자동으로 만들어 줌.
#tip. 실무에서는 이렇게 자동완성기능 쓰기
728x90
'Dev.Program > Java & Spring' 카테고리의 다른 글
[Java] java.lang.String 클래스 (0) | 2022.10.05 |
---|---|
[Java] java.lang.Object 클래스 - (2) toString() (0) | 2022.10.05 |
[Java] 향상된for문 / 어노테이션 (1) | 2022.10.05 |
[Java] enum (1) | 2022.10.05 |
[Java] 인터페이스(interface) (1) | 2022.10.05 |