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");
}
}
실행 결과 :
'자바 > 자바 개념' 카테고리의 다른 글
[Java] String 클래스 / 2021.11.21 (0) | 2021.11.21 |
---|---|
[Java] Wrapper 클래스 / 2021.11.17 (0) | 2021.11.17 |
[Java] 인터페이스 / 2021.11.10 (0) | 2021.11.10 |
[Java] 추상 클래스 / 2021.11.10 (0) | 2021.11.10 |
[Java] 메소드 오버라이딩 / 2021.11.02 (0) | 2021.11.02 |