Object 클래스 & equals()

0

Object class?

  • 모든 클래스의 최고 조상. 오직 11개의 메소드만을 가지고 있다.
  • notify(), wait()등은 쓰레드와 관련된 메소드다.
  • protected 들은 자손, 같은 패키지밖에 못쓰기 때문에 다른데서 쓰기위해선 오버라이딩을 통해 public으로 변경해줘야 함.
  • public Class getClass() : 클래스 정보를 담기위한 클래스.
    ↳ 자바소스.java 컴파일 → .class 파일생성, 메모리에 올라갈때 → class객체가 자동으로생성됨
    ↳ class 객체에는 클래스의 정보가 다 담겨있음(설계도 객체)
    ↳ 어떤 객체에 대해서 getClass()를 호출하면 '설계도 객체'를 반환해줌 (.class의 정보를 사용하기 쉽게 정보를 저장해놓은 것으로 보면 됨)
    ↳ 설계도 객체를 통해서 1) 객체 생성 2) 객체정보를 얻을 수 있음 ⇒ ReflectionAPI(자바의 기본 API) 라고 함.

equals(Object obj)

: 객체 자신(this)과 주어진 객체(obj)를 비교한다. 같으면 true, 다르면 false.

  • Object 클래스의 equals()는 객체의 주소를 비교(참조변수 값 비교)
public boolean equals(Object obj) {
	return (this == obj);
}

equals(Object obj)의 오버라이딩

  • 인스턴스 변수(iv)의 값을 비교하도록 equals()를 오버라이딩해야 한다.
    cv : 객체마다 공통(공유) / iv : 객체마다 다름(개별)
    ⇒ cv(static)는 객체마다 같기때문에 구별 안됨. 객체는 iv로 비교
    → 두 객체의 모든 iv가 같으면 같은 객체이다.
    → 그래서 원래 주소값을 비교하는 equals()를 iv(id, 주민번호)값을 비교하게 끔 오버라이딩 해줘서 객체를 비교함.
  • object는 id를 사용하지 못하기 때문에 Person으로 형변환해서 Person객체가 가진 멤버(id)를 사용할 수 있게 해줌.
class Person {
	long id; // 주민번호    
    public boolean equals(Object obj) {  // equals 오버라이딩
    	if(obj instanceof Person)  // obj는 Object 타입이므로 id값을 참조하기 위해서는 Person타입으로 형변환이 필요
        	return id == ((Person)obj).id; // 주소값이 아닌 id값이 같은지 확인하도록 오버라이딩 했음.
        else
        	return false;  // 타입이 Person이 아니면 값을 비교할 필요도 없다.
   } 
   Person(long id) {
    this.id = id;
   } 
}

→ 일반적으로 쓰던 String의 equals는 오버라이딩이 되어 있는 상태.
→ equals()의 기본구현은 주소비교지만, 대부분의 경우 equals()를 오버라이딩 해서 내용비교를 하도록 한다.

출처

  • 자바의 정석 기초편 : ch 9- 1~3
profile
백엔드를 공부하고 있습니다.

0개의 댓글