반응형
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
반응형
'Language > Java' 카테고리의 다른 글
[Java] 자바 API 클래스 - StringBuffer 클래스 (0) | 2024.04.11 |
---|---|
[Java] 자바 API 클래스 - String 클래스 (0) | 2024.04.11 |
[Java] 자바 다형성 - 타입 변환 확인, 추상클래스, 인터페이스, 내부클래스 (0) | 2024.04.11 |
[Java] 자바 상속 - 부모/자식 클래스, super/super(), 메소드 오버라이딩 (0) | 2024.04.10 |
[Java] 자바 제어자 - default, public, private, protected, final, static, abstract (1) | 2024.04.10 |