[Java] java.lang.Object 클래스 - (1) equals()

2022. 10. 5. 15:12Dev.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