프로그래밍 언어/JAVA

Object 클래스

· 코딩마이데이

Object 생성과 특징

Object는 java.lang 패키지에 속한 클래스이며, 모든 클래스에 강제로 상속됩니다. Object 만이 아무 클래스도 상속받지 않는 유일한 클래스로 계층 구조 상 최상위 클래스입니다. 그러므로 Object 클래스에는 모든 클래스에서 상속받아 사용할 공통 기능이 구현되어 있습니다. Object 클래스의 객체를 생성하여 사용하는 일은 많지만 다음과 같이 생성합니다.

Object obj = new Object();

 

 Object의 주요 메소드

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

 

객체 속성

Object는 모든 객체에게 공통적으로 있어야 할 메소드를 포함합니다.

 

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

package example;

class Point {
	private int x, y;
	public Point(int x, int y) {
		this.x = x;
		this.y = y;
	}
}

public class ObjectPropertyEx {
	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);
	}
}

 

실행결과

example.Point

1342443276

example.Point@50040f0c

example.Point@50040f0c

 

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

System.out.println(obj.getClass().getName());

 

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

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

 

객체를 문자열로 변환, toString() 메소드

객체를 문자열로 변환하는 메소드가 Object의 toString()입니다. JDK의 원본 Object.java 소스에는 다음과 같이 작성되어 있습니다.

public String toString() {
	return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

 

 

Object의 toString() 메소드는 객체의 클래스의 이름을 얻어 와서 '@'를 연결하고 다시 객체의 해시코드 값을 16진수로 변환하여 연결한 문자열을 리턴합니다.

Point a = new Point(2, 3);
System.out.println(a.toString());

 

출력 결과는 다음과 같습니다.

example.Point@50040f0c

 

또한, '객체 + 문자열' 연산이나 객체를 출력하는 경우, toString()이 자동으로 호출됩니다.

Point a = new Point(2, 3);
System.out.println(p); // System.out.println(p.toString()); 으로 자동 변환
String s = p + "점"; // String s = p.toString() + "점";으로 자동 변환

 

클래스에 toString() 만들기

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

public String toString(); // public으로 선언해야 함에 특히 주의

 

Point 클래스에 toString() 작성

package example;

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); // p는 p.toString으로 자동 변환
		System.out.println(p + "입니다."); // p.toString() + "입니다."로 자동 변환
	}
}

 

실행 결과

Point(2,3)

Point(2,3)

Point(2,3)입니다.

 

객체 비교와 equals() 메소드

== 연산자

객체 비교에 == 연산자를 사용하면 어떤 결과가 나타나는지 알아봅시다.

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

 

이 코드의 실행 결과는 다음과 같습니다.

a == c

 

2개의 Point 객체가 생성되고, 레퍼런스 a와 b는 이들을 각각 가르킵니다. 당연히 a + b의 레퍼런스 값이 다르기 때문에 a == b의 결과도 false입니다. c에는 a의 레퍼런스가 대입되므로, a == c의 결과는 true입니다.

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

실행 중 객체와 레퍼런스 관계

 

boolean equals(Object obj)

Object의 equals(Object obj)는 인자로 건네진 객체 obj와 자기 자신을 비교하여 두 객체의 내용이 같은지를 비교하는 메소드입니다. 내용의 동일성은 전적으로 클래스 작성자가 정의할 문제이기 때문에, 클래스 작성자가 클래스에 equals() 메소드를 오버라이딩 하는 것이 원칙입니다.

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.equals(b)) // true
	System.out.println("a와 b는 둘 다 Hello입니다.");

 

이 코드의 결과는 다음과 같습니다.

a와 b 둘 다 Hello입니다.

 

a와 b는 서로 다른 객체를 가리키므로 두 레퍼런스는 서로 다르며, 따라서 a == b의 결과도 false입니다. 하지만, a와 b가 가르키는 문자열은 같기 때문에 a.equals(b)의 결과는 true입니다.

 

Point 클래스에 equals() 작성

package example;

class Point {
	private int x, y;
	public Point(int x, int y) {
		this.x = x;
		this.y = y;
	}

	public boolean equals(Object obj) {
		Point p = (Point) obj; // 객체 obj를 Point 타입으로 다운 캐스팅
		if (x == p.x && y == p.y) return true;
		else return false;
	}
}

public class EqualsEx {
	public static void main(String[] args) {
		Point a = new Point(2, 3);
		Point b = new Point(2, 3);
		Point c = new Point(3, 4);
		if (a == b) // false
			System.out.println("a==b");
		if (a.equals(b)) // true
			System.out.println("a is equal to b");
		if (a.equals(c)) // false
			System.out.println("a is equal to c");
	}
}

 

실행 결과

a is equal to b

 

실행 과정 동안 생성된 Point 객체와 레퍼런스

 

 

Rect 클래스와 equals() 만들기 연습

package example;

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) { // 사각형 면적 비교
		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");
	}
}

 

실행 결과

a is equal to b

'프로그래밍 언어 > JAVA' 카테고리의 다른 글

String 클래스  (0) 2025.03.11
Wrapper 클래스  (0) 2025.03.09
자바 JDK에서 제공하는 패키지  (1) 2025.03.03
화면 설계  (1) 2025.02.28
모듈 개념  (0) 2025.02.28