Java/객체지향

[객체지향][자바의 정석] - 9.1 Object 클래스

얄루몬 2021. 12. 28. 21:25

1. Object 클래스의 메서드

  • 모든 클래스의 최고 조상. 오직 11개의 메서드만을 가지고 있다.
  • notify( ), wait( )등은 쓰레드와 관련된 메서드이다.
  • equals( ), hashCode( ), toString( )은 적절히 오버라이딩해야 한다.

 

2. equals(Object obj)

  • 객체가 자신주어진 객체(obj)를 비교한다. 같으면 true 다르면 false
  • Object클래스에 정의된 equals( )는 참조변수 값(객체의 주소)을 비교한다.
    • 서로 다른 객체는 주소가 항상 다르다.
  • equals( )를 오버라이딩해서 인스턴스변수의 값을 비교하도록 바꾼다.

< equals를 오버라이딩 하지 않고 사용했을 때 >

package javaStandard;

public class Ex9_1_1 {
	public static void main(String[] args) {
		Value v1 = new Value(10);
		Value v2 = new Value(10);
				
		if(v1.equals(v2))
			System.out.println("v1과 v2는 같습니다");
		else
			System.out.println("v1과 v2는 다릅니다.");
	}

}

class Value{
	int value;
	
	Value(int value){
		this.value = value;
	}
}

// 서로 다른 객체는 같은 값을 집어 넣더라도 주소가 다르다. (오버라이딩 하지 않은 equals를 사용하면 객체의 값을 비교하는 것이 아닌 객체의 주소값을 비교하기 때문)

 

<equals() 오버라이딩 해준 뒤 사용했을 때>

package javaStandard;

public class Ex9_1_1 {
	public static void main(String[] args) {
		Value v1 = new Value(10);
		Value v2 = new Value(10);
				
		if(v1.equals(v2))
			System.out.println("v1과 v2는 같습니다");
		else
			System.out.println("v1과 v2는 다릅니다.");
	}

}

class Value{
	int value;
	
	Value(int value){
		this.value = value;
	}
	
	public boolean equals(Object obj) {
		Value v = (Value)obj; // obj는 값이 없기에 형변환를 해준다. 
		
		return this.value == v.value;
		
	}
}

// 서로 같다고 인식한다. equals()를 오버라이딩 해준 뒤 사용했기 때문

 

🤷‍♀️여기서 우리는 왜 iv(instance value)으로 객체가 같은지 여부를 판단할까?

  • cv의 경우엔 객체마다 공통으로 사용한다(공유)
  • 그러나 iv의 경우엔 객체마다 다르게(개별) 사용되기 때문이다 

 

3. hashCode( )

  • 객체의 해시코드(int타입의 정수)를 반환하는 메서드(해시함수)
  • 다량의 데이터를 저장 검색하는 해싱기법에 사용된다.
  • Object클래스의 hashCode( )는 객체의 내부주소(객체의 주소를 int로 변환해서 반환)를 반환한다.
  • equals( )를 오버라이딩하면, hashCode( )도 같이 오버라이딩 해야 한다.
    • equals( )의 결과가 true인 두 객체의 hash code는 같아야하기 때문이다.
  • System.identityHashCode(Object obj)는 Object 클래스의 hashCode( )와 동일한 결과를 반환한다.

 

 

4. toString( )

  • 객체의 정보를 문자열(String)로 제공할 목적으로 정의된 메서드
    • 객체를 문자열로 변환하기 위한 메서드
    • toString() = iv 값들을 문자형으로 바꿈

<toString( ) 오버라이딩 없이 사용할 때>

package javajungsuk;

class Card{
	String kind;
	int number;
	
	Card(){
		this("SPADE",1);
	}
	
	Card(String kind, int number){
		this.kind = kind;
		this.number = number;
	}
}


public class Java9_3_1 {
	public static void main(String[] args) {
		System.out.println(new Card().toString());
		System.out.println(new Card().toString());
		
		/*결과 출력 클래스이름 객체주소
		  Card@5305068a
          Card@1f32e575   */
	}

}

<toString( ) 오버라이딩 해서 사용할 때>

package javajungsuk;

class Card{
	String kind;
	int number;
	
	Card(){
		this("SPADE",1);
	}
	
	Card(String kind, int number){
		this.kind = kind;
		this.number = number;
	}
    
    //오버라이딩 해주어야 한다.
	public String toString() {
		return "kind: " + kind + ", number : "+number;
	}
	
}


public class Java9_3_1 {
	public static void main(String[] args) {
		System.out.println(new Card().toString());
		System.out.println(new Card().toString());
		
		/*결과 출력 클래스이름 객체주소
		  kind: SPADE, number : 1
          kind: SPADE, number : 1   */
	}

}

 

5. getClass( )

  • 자신이 속한 클래스의 Class 객체를 반환하는 메서드
  • Class객체는 클래스의 모든 정보를 담고 있으며, 클래스당 단 1개만 존재한다.
    • 클래스파일(*.class)이 메모리에 로드될 때 생성된다.

 

6. 실습코드

package javajungsuk;

import java.util.Objects;

class Card{
	String kind;
	int number;
	
	Card(){
		this("SPADE",1);
	}
	
	Card(String kind, int number){
		this.kind = kind;
		this.number = number;
	}
	
	//equals()를 오버라이딩하면 hashCode()도 오버라이딩 해야한다.
	public int hashCode() {
		return Objects.hash(kind,number);
	}
	
	public boolean equals(Object obj) {
		if(!(obj instanceof Card))
			return false;
		Card c = (Card)obj;
		return this.kind.equals(c.kind) && this.number==c.number;
		
	}
	
	
	public String toString() {
		return "kind: " + kind + ", number : "+number;
	}
	
}


public class Java9_3_2 {
	public static void main(String[] args) {
		Card c1 = new Card();
		Card c2 = new Card();
		
		System.out.println(new Card().toString());
		System.out.println(new Card().toString());
		System.out.println(c1.equals(c2));

	}

}

이클립스가 오버라이딩을 자동으로 진행해줌 (hashCode( )와 equals( )에 대해서)