Language/Java

[Java] 자바 API 클래스 - Object 클래스

재은초 2024. 4. 11. 16:43
반응형

java.lang 패키지

  • java.lang 패키지는 자바에서 가장 기본적인 동작을 수행하는 클래스들의 집합이다. 따라서 자바에서는 java.lang 패키지의 클래스들은 import 문을 사용하지 않아도 클래스 이름만으로 바로 사용할 수 있다.

 

java.lang.Object 클래스

  • java.lang 패키지 중에서도 가장 많이 사용되는 클래스는 바로 Object 클래스다.
  • Object 클래스는 모든 자바 클래스의 최고 조상 클래스로, 자바의 모든 클래스는 Object 클래스의 모든 메소드를 바로 사용할 수 있다.
  • Object 클래스는 필드를 가지지 않으며, 총 11개의 메소드만으로 구성되어 있다.

toString() 메소드

  • toString() 메소드는 해당 인스턴스에 대한 정보를 문자열로 반환한다. 이때 반환되는 문자열은 클래스 이름과 함께 구분자로 '@'가 사용되며, 그 뒤로 16진수 해시 코드(hash code)가 추가된다. 16진수 해시 코드 값은 인스턴스의 주소를 가리키는 값으로, 인스턴스마다 모두 다르게 반환된다.
  • 자바에서 toString() 메소드는 기본적으로 각 API 클래스마다 자체적으로 오버라이딩을 통해 재정의되어 있다.
Car car01 = new Car();
Car car02 = new Car();

System.out.println(car01.toString());
System.out.println(car02.toString());

>> Car@15db9742
>> Car@6d06d69c

equals() 메소드

  • equals() 메소드는 해당 인스턴스를 매개변수로 전달받는 참조 변수와 비교하여 그 결과를 반환한다. 이때 참조 변수가 가리키는 값을 비교하므로, 서로 다른 두 객체는 언제나 false를 반환한다.
  • 자바에서 equals() 메소드는 기본적으로 각 API 클래스마다 자체적으로 오버라이딩을 통해 재정의되어 있다.
Car car01 = new Car();
Car car02 = new Car();
System.out.println(car01.equals(car02));

car01 = car02;                               // 두 참조 변수가 같은 주소를 가리킴
System.out.println(car01.equals(car02));

>> false
>> true

clone() 메소드

  • clone() 메소드는 해당 인스턴스를 복제하여, 새로운 인스턴스를 생성해 반환한다. 하지만 Object 클래스의 clone() 메소드는 단지 필드의 값만을 복사하므로, 필드의 값이 배열이나 인스턴스면 제대로 복제할 수 없다. 따라서 이러한 경우에는 해당 클래스에서 clone() 메소드를 오버라이딩하여, 복제가 제대로 이루어지도록 재정의해야 한다.
  • clone() 메소드는 데이터의 보호를 이유로 Cloneable 인터페이스를 구현한 클래스의 인스턴스만이 사용할 수 있다.
  • 단순히 부모 클래스의 clone() 메소드를 호출하여 clone() 메소드를 재정의하면, 배열이나 인스턴스인 필드는 복제되는 것이 아닌 해당 배열이나 인스턴스를 가리키는 주소값만이 복제된다.
import java.util.*;

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();                // 부모 클래스의 clone() 메소드 호출
           // clonedCar.owners = (ArrayList)owners.clone();    // 배열이나 인스턴스인 필드에 대해서는 별도로 clone() 메소드를 구현해 호출해야 정확한 복제
            return clonedCar;
        } catch (CloneNotSupportedException ex) {
            ex.printStackTrace();
            return null;
        }
    }
}

public class Object03 {
    public static void main(String[] args) {
       Car car01 = new Car();                                 // Car 클래스 인스턴스인 car01 생성
       car01.setModelName("아반떼");
       car01.setOwners("홍길동");
       System.out.println("Car01 : " + car01.getModelName() + ", " + car01.getOwners());

       Car car02 = (Car)car01.clone();                         // 오버라이딩한 clone() 메소드를 호출하여 복제를 수행
       car02.setOwners("이순신");                              // 복제된 인스턴스인 car02의 owners 필드에 새로운 값을 하나 추가
       System.out.println("Car01 : " + car01.getModelName() + ", " + car01.getOwners());
       System.out.println("Car02 : " + car02.getModelName() + ", " + car02.getOwners());
    }
}

>> Car01 : 아반떼, [홍길동]
>> Car02 : 아반떼, [홍길동, 이순신]
>> Car02 : 아반떼, [홍길동, 이순신]

Object 메소드들

 

Reference

반응형