java.lang.Object 클래스
- 모든 클래스의 부모 클래스
- Object 클래스에 있는 메소드들을 통해서 클래스의 기본적인 행동을 정의할 수 있다.
- 클래스라면 "이 정도의 메소드는 정의되어 있어야하고 처리해줘야 한다"는 것을 정의하는 작업이 필요하기 때문에 Object 클래스를 상속 받는다.
- 기본적으로 아무런 상속을 받지 않아도 java.lang.Object를 상속받는다.
Object 클래스에서 제공하는 메소드
- Object 클래스에 선언된 메소드는 객체를 처리하기 위한 메소드와 쓰레드를 위한 메소드로 나뉜다.
쓰레드: 프로그램이 실행되는 작은 단위 중 하나
- 객체를 처리하기 위한 메소드
- Object clone() : 객체 복사본을 만들어 리턴한다.
- boolean equals() : 현재 객체와 매개 변수의 객체가 같은지 확인한다.
- void finalize() : 현재 객체가 더 이상 쓸모가 없어졌을 때 가비지 컬렉터에 의해 이 메소드가 호출된다.
- Class <?> getClass() : 객체의 클래스 타입을 리턴한다.
- int hashCode() : 객체에 대한 해시 코드 값을 리턴한다. (16진수로 제공되는 객체의 메모리 주소)
- String toString() : 객체를 문자열로 표현하는 값을 리턴한다.
- 쓰레드 처리를 위한 메소드
- void notify() : 이 객체의 모니터에 대기하고 있는 단일 쓰레드를 깨운다.
- void notifyAll() : 이 객체의 모니터에 대기하고 있는 모든 쓰레드를 깨운다.
- void wait() : 다른 쓰레드가 notify() 메소드를 호출할 때까지 이 쓰레드가 대기하도록 한다.
- void wait(long timeout) : wait()과 동일하며 매개 변수로 지정한 시간만큼 대기한다.
- void wait(long timeout, int nanos) : wait()과 동일하며 더 자세한 시간(나노 초)만큼 대기한다.
toString() 메소드
ex) toString() Example
public class ToString {
public static void main(String[] args) {
ToString object = new ToString();
object.toStringMethod(object);
object.toStringMethod2();
}
public void toStringMethod(Object obj) {
System.out.println(obj);
System.out.println(obj.toString());
System.out.println("" + obj);
}
public void toStringMethod2() { // this는 자신의 객체에 대한 참조를 할 때 사용
// 위 메소드처럼 자기 자신을 매개 변수로 받을 필요 없이 this를 사용하면 된다.
System.out.println(this);
}
}
- Object 클래스의 메소드 중 가장 많이 사용되는 메소드
- 해당 객체가 어떤 클래스인지를 쉽게 나타낼 수 있는 메소드
- toString() 메소드가 자동으로 호출되는 경우
- System.out.println() 메소드의 매개 변수로 들어가는 경우
- 객체에 대하여 + 연산을 하는 경우
- String을 제외한 참조 자료형에 + 연산을 수행하면 자동으로 toString() 메소드가 호출되어 객체의 위치에 String 값이 놓인다.
- 실제 Object의 toString()메소드 : getClass().getName() + '@' + Integer.toHexString(hashCode())
- getClass()의 결과에 getName()으로 현재 클래스의 패키지 이름, 클래스 이름이 나온다.
- @는 구분자 역할
- 마지막 부분은 hashCode() 메소드로 가져온 객체의 int타입의 해시 코드 값을 toHexString() 메소드로 16진수로 변환하는 역할
- toString() 메소드는 그냥 사용하기만 하면 되는 것이 아닌 직접 구현해야만 하는 메소드
- Overriding을 적용해 toString() 메소드를 구현한다.
- 모든 클래스의 toString()을 오버라이딩할 필요는 없지만 DTO를 사용할 때 toString()을 오버라이딩함으로 내용확인이 쉽도록 설계해야한다.
equals() 메소드
- 기본 자료형의 값을 비교하는 연산자는 ==, !=이 있다.
- 참조 자료형에서 사용하면 값이 아닌 주소값을 비교하기에 사용해서는 안된다.
- 참조 자료형에서는 두 객체를 비교하기 위해서 equals() 메소드를 사용해야한다.
- Object 클래스의 eqauls() 메소드는 hashCode() 값( = 객체의 주소값) 을 비교한다.
- 우리가 원하는 것은 객체의 주소값을 비교하는 것이 아닌 객체의 값을 비교해 같으면 같은 객체로 판단하기 위함.
- 그렇기에 equals()를 오버라이딩해서 사용해야 제대로 된 비교가 가능하다.
- Object 클래스의 eqauls() 메소드는 hashCode() 값( = 객체의 주소값) 을 비교한다.
- equals() 메소드를 오버라이딩할 때 "반드시" 만족시켜야하는 다섯 가지 조건
- 재귀 : null이 아닌 객체 x의 x.equals(x) 결과는 항상 true
- 대칭 : null이 아닌 x, y 객체가 있을 때 y.equals(x)가 true라면 x.equals(y)도 반드시 true
- 타동적 : null이 아닌 x, y, z가 있을 때 x.equals(y)가 true, y.equals(z)가 true라면 x.equals(z)도 반드시 true
- 일관 : null이 아닌 x, y가 있을 때 객체가 변경되지 않은 상황에서 몇 번을 호출해도 x.equals(y)는 항상 true거나 항상 false
- null 과의 비교 : null 이 아닌 객체 x의 x.equals(null) 결과는 항상 false
- equals() 메소드를 오버라이딩할 때 반드시 hashCode() 메소드도 함께 오버라이딩해줘야 한다.
- 두 객체의 equals()의 결과가 같다하더라도 hashCode()를 오버라이딩 하지 않으면 hashCode() 결과 값이 서로 다르기에 다른 객체로 판단된다.
hashCode() 메소드
- 객체의 메모리 주소를 16진수로 리턴한다.
- 두 개의 객체가 서로 동일하다면, hashCode() 값은 무조건 동일해야한다.
- equals()메소드를 오버라이딩하면 hashCode() 메소드도 오버라이딩해서 동일한 결과가 나오게 해야한다.
- hashCode() 메소드 오버라이딩 시 지켜야 하는 조건
- 자바 애플리케이션이 수행되는 동안 어떤 객체에 대해서 이 메소드가 호출될 때에는 항상 동일한 int 값이 리턴되어야한다. (자바를 실행할 때마다 같은 값일 필요는 없다.)
- 두 개의 객체에 대해서 equals() 메소드를 사용한 결과가 true 라면 두 객체의 hashCode() 값도 동일한 int 값을 리턴해야한다.
- 두 객체의 equals() 메소드 결과가 false 라고 해서 hashCode() 리턴 값인 int 값이 무조건 다를 필요는 없다.
(하지만 서로 다른 int 값인 경우 hashtable 의 성능을 향상시키는데 도움을 준다.)
- 제약들로 인해 equals(), hashCode() 메소드를 직접 작성하는 것은 별로 권장되지 않는다.
- 개발 툴을 이용해 자동 생성 기능 사용할 것을 권장.
간단 내용 정리
1. 모든 클래스의 최상위 부모 클래스인 Object 클래스는 어떤 패키지에 선언되어 있나요 ?
ㅡ> java.lang 패키지
2. 클래스가 어떻게 선언되어 있는지 확인할 수 있는 명령어(실행파일)의 이름은 무엇인가요?
ㅡ> javap
3. Object 클래스에 선언되어 있는 모든 메소드를 Overriding해야 하나요?
ㅡ> X, 필요한 메소드만 오버라이딩해서 사용한다.
4. Object 클래스의 clone() 메소드의 용도는 무엇인가요?
ㅡ> 객체를 복제하기 위해서 사용한다.
5. System.out.println() 메소드를 사용하여 클래스를 출력했을 때 "최종적으로" 호출되는 Object 클래스에 있는 메소드는 무엇인가요?
ㅡ> toString() 메소드
6. 객체의 주소를 비교하는 것이 아닌, 값을 비교하려면 Object 클래스에 선언되어 있는 어떤 메소드를 overrding해야 하나요?
ㅡ> equals() 메소드를 오버라이딩해서 객체의 값을 비교한다.
7. Object 클래스에 선언되어 있는 hashCode()라는 메소드는 어떤 타입의 값을 리턴 하나요?
ㅡ> int 값
출처: 이상민, <자바의 신 VOL.1> 로드북
'Java > 자바의 신 VOL.1' 카테고리의 다른 글
14. 다 배운 것 같지만, 예외라는 중요한 것이 있어요 (0) | 2024.06.24 |
---|---|
13. 인터페이스와 추상 클래스, enum (1) | 2024.06.22 |
11. 매번 만들기 귀찮은데 누가 만들어 놓은 거 쓸 수 없나요? (0) | 2024.06.21 |
10. 자바는 상속이라는 것이 있어요 (0) | 2024.06.21 |
09. 자바를 배우면 패키지와 접근 제어자는 꼭 알아야 해요 (0) | 2024.06.20 |