본문 바로가기

자바/자바 개념

[Java] Object 클래스 / 2021.11.17

728x90

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");
	}
}

 

실행 결과 : 

 

728x90