Object 클래스란 ?
자바에서 Object 클래스는 모든 클래스의 최상위 클래스이며, 자바의 모든 객체는 이 클래스에서 상속받는다.
Object 클래스는 기본적인 객체의 특성과 동작을 정의하고 있다.
Object 클래스의 존재 이유
Object 클래스는 자바에서 객체 지향 프로그래밍의 기본 원칙을 지원하고 모든 클래스가 일관된 방식으로
동작하도록 보장하는 역할을 하기 위해 존재한다.
다형성
다형성은 객체 지향 프로그래밍에서 중요한 개념 중 하나로, 서로 다른 클래스의 객체가 같은 값을 받은 후 각자의 방식으로 동작하는 방식이다. 즉, 하나의 객체가 여러가지 타입을 가질 수 있는 것을 의미 한다.
Object 클래스는 자바의 다형성을 지원하는 데에도 중요한 역할을 한다. 어떤 클래스든 Object 클래스를 상속받게 되고,
다양한 클래스의 객체를 Object 타입으로 다룰 수 있다. 즉, 매개변수의 다형성과 같은 상황에서 유용하게 사용될 수 있다.
Object 클래스의 주요 메서드
1. equals() : 두 객체가 같은지 아닌지 비교하는 메서드이다. 두 객체가 동일한 객체라면 true, 그렇지 않으면 false를 리턴한다. equals() 메서드는 기본적으로 객체의 참조(주소)를 비교한다. 하지만 String 클래스는 equals() 메서드를 재정의하여 문자열의 내용을 비교하도록 구현되어 있다.
즉, String 클래스 equals() 메소드는 String 객체의 번지값을 비교하는 것이 아닌 문자열이 동일한지 비교하여,
같다면 true, 그렇지 않다면 false를 리턴한다.
예) String text1 = "text"; String text2 = new String("text"); System.out.println(text1==text2); //false System.out.println(text1.equals(text2)); //true |
2-1. hashCode() : 객체의 메모리 주소 값을 해시 코드 값로 만들어 리턴한다. 해시 코드는 객체를 식별하기 위해 사용되는 정수 값이다.
2-2. eqauls()와 hashCode() 의 재정의 :
동등성 ( 내부 값이 같은가 ) 비교와 해시 충돌 문제로 인해 equals()와 hashCode()를 아래 코드와 같이 재정의해준다.
예를 들어, Person 클래스에서 이름(name)과 나이(age) 필드로 구성된 객체가 있다.
이 두 필드의 값이 동일한 경우, 두 Person 객체를 동등한 것으로 간주하고 싶을 때, equals() 메서드를 오버라이드하여
두 객체의 필드 값을 비교하도록 만들 수 있다.
public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } // equals() 메서드 재정의 @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return age == person.age && Objects.equals(name, person.name); } // hashCode() 메서드 재정의 @Override public int hashCode() { return Objects.hash(name, age); } public static void main(String[] args) { Person person1 = new Person("Alice", 30); Person person2 = new Person("Alice", 30); // equals() 메서드를 통해 두 객체를 비교 System.out.println("Are person1 and person2 equal? " + person1.equals(person2)); // hashCode() 메서드를 통해 해시 코드 비교 System.out.println("Hash code of person1: " + person1.hashCode()); System.out.println("Hash code of person2: " + person2.hashCode()); } } |
3. toString() : 객체의 정보를 문자열로 반환한다. 이때 toString() 메서드는 객체의 클래스 이름과 해시 코드를 포함한
문자열을 반환한다.
예) testObject test = new testObject(1, "test"); System.out.println(test.toString()); // testObject@123a45b6 |
3-1 toString() 오버라이딩 : toString()메소드를 이용한 인스턴스의 정보를 편하게 출력하기 위해 toString() 메소드를
오버라이딩 한다.
class testObject { int num; String text; public testObject(int num, String text) { this.num = num; this.text = text; } @Override public String toString() { return " num = " + num+ ", text = " + text ; } } public class Main{ public static void main(String[] args) { testObject test = new testObject(1, "test"); System.out.println(test.toString()); // num = 1, text = test } } |
4. getClass() : 객체의 클래스 정보를 확인할 수 있는 메소드이다. getClass() 메서드를 호출하면 객체가 속한 클래스의 Class 객체가 반환된다. Class 객체를 통해 클래스의 이름, 메서드, 필드, 상위 클래스, 인터페이스 등에 대한 정보를 얻을 수 있다.
예) testObject test = new testObject(); System.out.println(test.getClass()); // class testObject |
5. clone() : 인스턴스 객체의 복제를 위한 메소드이다. 인스턴스를 복제하여 새로운 인스턴스를 생성해 그 참조 값을 반환함. clone() 메서드를 오버라이딩 하려면 데이터 보호를 이유로 "Cloneable" 을 구현해야하 함. 만약 "Cloneable" 인터페이스를 구현하지 않고 clone() 을 호출하면 예외가 발생한다.
* 얕은 복사와 깊은 복사
clone()으로 복제하는 경우 원본과 복제본이 같은 객체를 공유하므로 완전한 복제라고 보기 어렵다.
즉, 이러한 복제를 "얕은 복사" 라고 하며 원본을 변경하면 복사본도 영향을 받는다.
깊은 복사는 원본이 참조하고 있는 객체까지 복제하는 것을 말하고 서로 다른 객체를 참조하기 때문에 원본의 변경이
복제본에 영향을 미치지 않는다.
출처 - https://staticclass.tistory.com/77
6. finalize() : finalize()메서드는 "객체 소멸자"라고도 불린다. 말 그대로 객체가 가비지 컬렉터에 의해 수집되기 전에 호출되는 메서드이다. 주로 객체의 정리(clean-up) 작업을 수행하는 데 사용한다.
@Override protected void finalize() throws Throwable { // 객체가 소멸되기 전에 수행해야 할 코드 } |
사용 목적
1. 자원 해제: 객체가 사용한 자원이 있다면(File, Socket, Database Connection 등) finalize() 메서드에서 해당 자원을 해제하고 정리하는 작업을 할 수 있다. 이를 통해 메모리 누수(memory leak)를 방지하고 시스템 자원을 효율적으로 관리할 수 있다.
2. 종료 작업: 객체가 소멸되기 전에 해야 할 특정 작업이 있다면, finalize() 메서드에서 해당 작업을 수행할 수 있다.
예를 들어, 파일이나 네트워크 연결을 닫거나, 로그를 남기거나, 기록을 저장하는 등의 작업을 할 수 있다.
7. wait(), notify(), notifyAll() : 객체 간의 스레드 통신 및 동기화를 위해 사용되는 메서드들이다.
1. wait() 메서드는 스레드를 일시 정지 상태로 만든다.
2. notify() 메서드는 일시 정지 상태에 있는 다른 스레드를 실행 대기 상태로 만든다
3. notifyAll() 메서드는 모든 대기 중인 스레드를 깨운다.
Object 클래스는 자바의 모든 클래스에서 상속받기 때문에, 이 클래스의 메서드를 사용하거나 재정의함으로써
객체의 동작을 제어할 수 있다.
'자바' 카테고리의 다른 글
자바 중첩 클래스 ( Nested Class ) (0) | 2023.07.18 |
---|---|
자바 final (0) | 2023.07.16 |
자바 접근 제어자 (0) | 2023.07.15 |
자바 오버로딩과 오버라이딩 (0) | 2023.07.14 |
자바 OOP ( 객체 지향 프로그래밍 ) (0) | 2023.07.14 |