Object 클래스란
Object 클래스는 모든 자바 클래스의 최고 조상 클래스가 됩니다. 그래서 자바에서 모든 클래스는 사실 Object를 암시적으로 상속받고 습니다. 그 이유는 모든 클래스가 공통으로 포함하고 있어야 하는 기능을 제공해야하기 때문입니다.
참고) java.lang 패키지
java.lang패키지는 자바에서 가장 기본적인 동작을 수행하는 클래스들의 집합입니다.
따라서 자바에서는java.lang패키지의 클래스들은import문을 사용하지 않아도 클래스 이름만으로 바로 사용할 수 있도록 하고 있습니다.
java.lang패키지 중에서도 가장 많이 사용되는 클래스는 바로Object클래스입니다.
Object클래스는 모든 자바 클래스의 최고 조상 클래스가 됩니다.
따라서 자바의 모든 클래스는Object클래스의 모든 메소드를 바로 사용할 수 있습니다.
Object Method

Object 클래스는 필드를 가지지 않으며, 총 11개의 메소드만으로 구성되어 있습니다. 다시 말해서 자바의 객체는 위의 메소드들을 반드시 가지고 있다고 할 수 있습니다.
대표적인 Method
toString()메소드toString() 메소드는 해당 인스턴스에 대한 정보를 문자열로 반환합니다.
이때 반환되는 문자열은 클래스 이름과 함께 구분자로 '@'가 사용되며, 그 뒤로 16진수 해시 코드(hash code)가 추가됩니다.
16진수 해시 코드 값은 인스턴스의 주소를 가리키는 값으로, 인스턴스마다 모두 다르게 반환됩니다.
class Car extends Object {
void drive() { }
}
Car porsche = new Car();
Car maserati = new Car();
porsche.toString(); // Car@15d939e42
maserati.toString(); // Car@6dd2d69c
hashCode()메소드는 해당 객체의 코드값을 반환합니다.
equals()메소드equals() 메소드는 해당 인스턴스를 매개변수로 전달받는 참조 변수와 비교하여, 그 결과를 반환합니다.
이때 참조 변수가 가리키는 값을 비교하므로, 서로 다른 두 객체는 언제나 false를 반환하게 됩니다.
Car porsche = new Car();
Car maserati = new Car();
porsche.equals(maserati); // false
porsche = maserati;
porsche.equals(maserati); // true
clone()메소드clone()메소드는 해당 인스턴스를 복제하여, 새로운 인스턴스를 생성해 반환합니다.하지만
Object클래스의clone()메소드는 단지 필드의 값만을 복사하므로, 필드의 값이 배열이나 인스턴스면 제대로 복제할 수 없습니다.따라서 이러한 경우에는 해당 클래스에서
clone()메소드를 오버라이딩하여, 복제가 제대로 이루어지도록 재정의해야 합니다.이러한
clone()메소드는 데이터의 보호를 이유로Cloneable인터페이스를 구현한 클래스의 인스턴스만이 사용할 수 있습니다.
class Car implements Cloneable {
private String modelName;
private ArrayList<String> owners = new ArrayList<String>();
public String getModelName() { return this.modelName; } // modelName의 값을 반환함
public void setModelName(String modelName) { this.modelName = modelName; } // modelName의 값을 설정함
public ArrayList getOwners() { return this.owners; } // owners의 값을 반환함
public void setOwners(String ownerName) { this.owners.add(ownerName); } // owners의 값을 추가함
public Object clone() {
try {
Car clonedCar = (Car)super.clone();
// clonedCar.owners = (ArrayList)owners.clone();
// 주석 해제를 해야지 제대로 동작
return clonedCar;
} catch (CloneNotSupportedException ex) {
ex.printStackTrace();
return null;
}
}
}
public class Object03 {
public static void main(String[] args) {
Car car01 = new Car();
car01.setModelName("아반떼");
car01.setOwners("홍길동");
System.out.println("Car01 : " +
car01.getModelName() +
", " + car01.getOwners() + "\n"); // Car01 : 아반떼, [홍길동]
Car car02 = (Car)car01.clone();
car02.setOwners("이순신");
System.out.println("Car01 : " +
car01.getModelName() +
", " + car01.getOwners()); // Car01 : 아반떼, [홍길동, 이순신]
System.out.println("Car02 : " +
car02.getModelName() +
", " + car02.getOwners()); // Car02 : 아반떼, [홍길동, 이순신]
// 단순히 부모 클래스의 clone() 메소드를 호출하여 clone() 메소드를 재정의하면,
// 배열이나 인스턴스인 필드는 복제되는 것이 아닌 해당 배열이나 인스턴스를 가리키는 주소값만이 복제
}
}
참고
- TCPschool : http://tcpschool.com/java/java_api_object
- Opentutorials : https://opentutorials.org/module/516/6241
'👨🏻💻 Development > ☕️ Java' 카테고리의 다른 글
| JUnit의 @BeforeClass 와 static block {} (0) | 2021.10.20 |
|---|---|
| 2021년 09월 16일 TIL - Mocking Static Method (0) | 2021.09.17 |
| 2021년 09월 07일 TIL - 의존 역전 원칙 (Java) (0) | 2021.09.08 |
| [Java] String, StringBuffer, StringBuilder (0) | 2021.08.02 |