본문 바로가기

자바/자바 개념

[Java] Object 클래스 / 2021.11.17

1. Object 생성과 특징

Object는 java.lang 패키지에 속한 클래스이며 모든 클래스에 강제로 상속된다. Object는 아무 클래스도 상속받지 않는 유일한 클래스로 계층 구조상 최상위 클래스이다. 

Object 클래스 객체 생성
Object obj = new Object();

 

Object의 주요 메소드 :

 

메소드 설명
boolean equals(Object obj) obj가 가리키는 객체와 현재 객체를 비교하여 같으면 true 리턴
Class getClass() 현 객체의 런타임 클래스를 리턴
int hashCode() 현 객체에 대한 해시 코드 값 리턴
String toString() 현 객체에 대한 문자열 표현을 리턴
void notify() 현 객체에 대해 대기하고 있는 하나의 스레드를 깨움
void notifyAll() 현 객체에 대해 대기하고 있는 모든 스레드를 깨움
void wait() 다른 스레드가 깨울 때까지 현재 스레드를 대기하게 함

 

2. Object 클래스로 객체의 속성 알아내기

 

package Chapter6;

class Point{
	private int x, y;
	public Point(int x, int y) {
		this.x = x;
		this.y = y;
	}
}
public class ObjectProperEx {
	public static void print(Object obj) {
		System.out.println(obj.getClass().getName()); // 클래스 이름
		System.out.println(obj.hashCode()); // 해시 코드 값
		System.out.println(obj.toString()); // 객체를 문자열로 만들어 출력
		System.out.println(obj); // 객체 출력
	}
	
	public static void main(String [] args) {
		Point p = new Point(2, 3);
		print(p);
	}
}

 

실행 결과 : 

 

 

- Class 클래스는 주어진 객체의 클래스에 관한 정보를 담는 클래스이다. Object의 getClass() 메소드를 호출하면 바로 이 Class 객체를 리턴하는데, getName() 메소드를 이용하면 obj가 가리키는 객체의 클래스 타입을 알아낼 수 있다.

- 객체는 생성될 때 객체를 유일하게 구분할 수 있는 정수 id값이 할당된다. 이 값을 해시코드라고 부르고, Object의 hashCode() 메소드는 객체 안에 담겨진 해시코드 값을 리턴한다.

- Object의 toString()은 객체를 문자열로 변환하여 리턴하는 메소드이다.

 

3. 클래스에 toString() 만들기

개발자는 클래스를 작성할 때, Object의 toString()을 오버라이딩하여 자신만의 문자열을 리턴할 수 있다.

 

public String toString(); // public으로 선언해야함.

 

package Chapter6;

class Point{
	private int x, y;
	public Point(int x, int y) {
		this.x = x;
		this.y = y;
	}
	public String toString() { // 오버라이딩
		return "Point(" + x + "," + y +")";
	}
}

public class ToStringEx {
	public static void main(String[] args) {
		Point p = new Point(2, 3);
		System.out.println(p.toString());
		System.out.println(p + "입니다.");
	}
}

 

실행 결과 : 

 

 

- toString()을 오버라이딩하여 자신만의 문자열을 리턴하였다.

 

4. 객체 비교와 equals() 메소드

기본 타입의 값을 비교하기 위해서는 == 연산자를 사용하지만, 객체 비교를 위해서는 반드시 equals() 메소드를 사용해야 한다. == 연산자와 equals() 메소드의 차이를 알아보자.

 

(1) == 연산자

객체 비교에 == 연산자를 사용해보자. 위에서 작성한 Point 클래스를 예로 들어 Point 객체를 == 로 비교하는 코드를 실행해보자.

 

Point a = new Point(2, 3);
Point b = new Point(2, 3);
Point c = a;
		
if(a==b) // false
	System.out.println("a==b");
if(a==c) // true
	System.out.println("a==c");

 

실행 결과 : 

 

 

- 이 코드가 실행되면 2개의 Point 객체가 생성이 된다. 

 

 

- 레퍼런스 a와 b는 각각의 Point 객체를 가리킨다. a와 b는 레퍼런스의 값이 다르기 때문에 a==b의 결과는 false이다.

- c에는 a의 레퍼런스가 대입되므로, a==c의 결과는 true이다.

- == 연산자는 두 객체의 내용물이 같은지 비교하는 것이 아니라, 두 레퍼런스가 동일한 객체를 가리키는지 비교하는 것이다.

 

(2) boolean equals(Object obj)

Object의 equlas(Object obj)는 인자로 건네진 객체 obj와 자기 자신을 비교하여 두 객체의 내용이 같은지를 비교하는 메소드이다. 

 

String a = new String("Hello");
String b = new String("Hello");
if(a==b) // false
	System.out.println("a==b");
if(a.equals(b)) // true
	System.out.println("a와 b는 둘 다 Hello입니다.");

 

실행 결과 : 

 

 

- a와 b는 서로 다른 객체를 가리키므로 두 레퍼런스는 서로 다르며, 따라서 a==b의 결과도 false이다.

- 하지만, a와 b가 가리키는 문자열은 같기 때문에 a.equals(b)의 결과는 true이다.

 

(3) equals()를 오버라이딩한 예제

int 타입의 width(너비)와 height(높이) 필드를 가지는 Rect 클래스를 작성하고, 면적이 같으면 두 Rect 객체가 같은 것으로 판별하는 equals()를 작성하라. 생성자에서 너비와 높이를 받아 width, height 필드를 초기화하라.

 

package Chapter6;

class Rect{
	private int width;
	private int height;
	public Rect(int width, int height) {
		this.width = width;
		this.height = height;
	}
	public boolean equals(Object obj) {  // equals() 오버라이딩
		Rect p = (Rect)obj; // obj를 Rect로 다운 캐스팅
		if(width*height == p.width*p.height) return true;
		else return false;
	}
}
public class RectEqualsEx {
	public static void main(String[] args) {
		Rect a = new Rect(2, 3);
		Rect b = new Rect(3, 2);
		Rect c = new Rect(3, 4);
		if(a.equals(b)) System.out.println("a is equal to b");
		if(a.equals(c)) System.out.println("a is equal to c");
		if(b.equals(c)) System.out.println("b is equal to c");
	}
}

 

실행 결과 :