Language/JAVA

[JAVA] Object 클래스

IT수정 2024. 10. 15. 15:03

Object 클래스

클래스를 선언할 때 extends 키워드로 다른 클래스를 상속하지 않으면 암시적으로 java.lang.Object 클래스를 상속하게 된다. 따라서 자바의 모든 클래스는 Object의 자식이거나 자손 클래스이다.

 

그렇기 때문에 Object가 가진 메서드는 모든 객체에서 사용할 수 있다.

메서드 용도
boolean equals(Object obj) 객체의 번지를 비교하고 결과를 리턴
int hashCode() 객체의 해시코드를 리턴
String toString() 객체 문자 정보를 리턴

 

객체 동등 비교

Object의 equals() 메서드는 객체의 번지를 비교하고 boolean 값을 리턴한다.

public boolean equals(Object obj)

 

equals() 메서드의 매개변수 타입이 Object 이므로 자동 타입 변환에 의해 모든 객체가 매개값으로 대입될 수 있다.

equals() 메서드는 비교 연산자인 ==과 동일한 결과를 리턴한다. 두 객체가 동일한 객체라면 true를 반환하고, 그렇지 않으면 false를 반환한다.

Object obj1 = new Object();
Object obj2 = obj1;
// 하단의 두 코드는 동일한 결과값을 리턴한다.
boolean result = obj1.equals(obj2);
boolean result = (obj1 == obj2);

 

일반적으로 Object의 equals() 메서드는 재정의해서 동등 비교용으로 사용된다. 동등 비교란 객체가 비록 달라도 내부의 데이터가 같은지를 비교하는 것을 말한다.

 

예제 코드

Member.java

package ch11;

public class Member {
	public String id;
	
	public Member(String id) {
		this.id = id;
	}
	
	@Override
	public boolean equals(Object obj) {
		if(obj instanceof Member target) {
			if(id.equals(target.id)) {
				return true;
			}
		}
		return false;
	}
}

 

EqualsExample.java

package ch11;

public class EqualsExample {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Member obj1 = new Member("blue");
		Member obj2 = new Member("blue");
		Member obj3 = new Member("red");
		
		if(obj1.equals(obj2)) {
			System.out.println("obj1과 obj2는 동등합니다.");
		} else {
			System.out.println("obj1과 obj2는 동등하지 않습니다.");
		}
		
		if(obj1.equals(obj3)) {
			System.out.println("obj1과 obj3는 동등합니다.");
		} else {
			System.out.println("obj1과 obj3는 동등하지 않습니다.");
		}
	}

}

 

출력 결과

obj1과 obj2는 동등합니다.
obj1과 obj3는 동등하지 않습니다.

 

객체 해시코드

객체 해시코드란 객체를 식별하는 정수를 말한다. Object의 hashCode() 메서드는 객체의 메모리 번지를 이용해서 해시코드를 생성하기 때문에 객체마다 다른 정수값을 리턴한다. hashCode() 메서드의 용도는 equals() 메서드와 비슷한데, 두 객체가 동등한 지 비교할 때 주로 사용한다.

public int hashCode()

 

equals() 메서드와 마찬가지로 hashCode() 메서드 역시 객체의 데이터를 기준으로 재정의해서 새로운 정수값을 리턴하도록 하는 것이 일반적이다. 객체가 다르다 할지라도 내부 데이터가 동일하다면 같은 정수값을 리턴하기 위해서이다.

 

자바는 두 객체가 동등함을 비교할 때 hashCode()와 equals() 메서드를 같이 사용하는 경우가 많다. 우선 hashCode()가 리턴하는 정수값이 같은지 확인하고, equals() 메서드가 true를 리턴하는지를 확인해서 동등 객체임을 판단한다.

 

예제 코드

Student.java

package ch11;

public class Student {
	private int no;
	private String name;
	
	public Student(int no, String name) {
		this.no = no;
		this.name = name;
	}
	
	public int getNo() { return no; }
	public String getName() { return name; }
	
	@Override
	public int hashCode() {
		int hashCode = no + name.hashCode();
		return hashCode;
	}
	
	@Override
	public boolean equals(Object obj) {
		if(obj instanceof Student target) {
			if(no == target.getNo() && name.equals(target.getName())) {
				return true;
			}
		}
		return false;
	}
}

 

HashCodeExample.java

package ch11;

public class HashCodeExample {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Student s1 = new Student(1, "홍길동");
		Student s2 = new Student(1, "홍길동");
		
		if(s1.hashCode() == s2.hashCode()) {
			if(s1.equals(s2)) {
				System.out.println("동등 객체입니다.");
			} else {
				System.out.println("데이터가 다르므로 동등 객체가 아닙니다.");
			}
		} else {
			System.out.println("해시코드가 다르므로 동등 객체가 아닙니다.");
		}
	}

}

 

출력 결과

동등 객체입니다.

 

객체 문자 정보

Object의 toString() 메서드는 객체의 문자 정보를 리턴한다. 객체의 문자 정보란 객체를 문자열로 표현한 값을 말한다. 기본적으로 Object의 toString() 메서드는 '클래스명@16진수해시코드'로 구성된 문자열을 리턴한다.

Object obj = new Object();
Ststem.out.println(obj.toString());

java.lang.Object@de6ced

 

객체의 문자 정보가 중요한 경우에는 Object의 toString() 메서드를 재정의해서 간결하고 유익한 정보를 리턴하도록 해야 한다.

 

예제 코드

SmartPhone.java

package ch11;

public class SmartPhone {
	private String company;
	private String os;
	
	public SmartPhone(String company, String os) {
		this.company = company;
		this.os = os;
	}
	
	@Override
	public String toString() {
		return company + ", " + os;
	}
}

 

ToStringExample.java

package ch11;

public class ToStringExample {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		SmartPhone myPhone = new SmartPhone("삼성전자", "안드로이드");
		
		String strObj = myPhone.toString();
		System.out.println(strObj);
		
		System.out.println(myPhone);
	}

}

 

출력 결과

삼성전자, 안드로이드
삼성전자, 안드로이드

'Language > JAVA' 카테고리의 다른 글

[JAVA] 롬복 사용하기  (1) 2024.10.15
[JAVA] 레코드 선언  (0) 2024.10.15
[JAVA] java.base 모듈  (1) 2024.10.15
[JAVA] 모듈  (2) 2024.09.05
[JAVA] 라이브러리  (2) 2024.09.05