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 |