OneDev
[JAVA] Object 클래스 본문
1. Object 클래스란 무엇인가요?
- 자바에서 모든 클래스의 최상위 부모 클래스
- 부모가 없으면 묵시적으로 Object 클래스를 상속받는다
- 자바가 extends Object 코드를 넣어준다
- 따라서 extends Object는 생략하는 것을 권장
2. 자바에서 Object 클래스가 최상위 부모 클래스로서 가지는 역할
→ JAVA 의 핵심인 상속, 다형성 등을 제공하고 공통 기능을 제공
- 공통기능 제공
- 다형성 지원
□ 공통기능 제공
- 객체의 정보를 제공하고, 이 객체가 다른 객체와 같은지 다른지 비교하고, 객체가 어떤 클래스로 만들어졌는지 확인하는 기능은 모든 객체에게 필요한 기본 기능.
- 이런 기능을 객체를 만들 때 마다 새로운 메소드를 만들어 사용해야한다면 상당히 번거로울 것 & 만든다 해도 개발자마다 서로 다른 이름의 메서드를 만들어 일관성이 없을 것
- Object 는 모든 객체에 필요한 공통 기능을 제공/ Object는 최상위 부모 클래스이기 때문에 모든 객체는 공통 기능을 편하게 상속 받을 수 있다
※ Object가 제공하는 기능
- 객체의 정보 제공 toString()
- 객체의 같음을 비교하는 equals()
- 객체의 클래스 정보를 제공하는 getClass()
- 기타 여러가지 기능
→ 프로그래밍 단순화 & 일관성 보장
□ 다형성의 기본 구현
- Object는 모든 클래스의 부모 클래스이기 때문에 모든 객체를 참조할 수 있음
- Object 클래스는 다형성을 지원하는 기본적인 메커니즘을 제공한다
- 모든 자바 객체는 Object 타입으로 처리될 수 있음 (Object 는 모든 객체를 다 담을 수 있음)
3. Object 다형성의 한계
- Object 는 모든 객체를 대상으로 다형적 참조를 할 수는 있다
→ Object 는 모든 객체의 부모이므로 모든 객체를 담을 수 있다 - Object 를 통해 전달 받은 객체를 호출하려면 각 객체에 맞는 다운캐스팅 과정이 필요하다
→ Object 는 자식의 메서드를 모른다 - 다형성을 제대로 활용하려면 다형작 참조 + 메서드 오버라이딩을 함께 사용해야 하는데, Object 클래스는 다형적 참조는 가능하지만 메서드 오버라이딩이 불가능하기 때문에 다형성을 활용하기에는 한계가 있다.
(Object 의 메서드인 toString() 등은 당연히 자식 클래스에서 오버라이딩 가능)
※ 다운캐스팅 예시
4. Object 클래스의 메소드들
(1) toString()
- 객체의 정보를 문자열 형태로 제공한다 (클래스 정보 + 해시코드(객체의 잠조값, 16진수))
- 디버깅과 로깅에 유용하게 사용
- 모든 클래스에서 상속받아 사용 가능
- 보통 toString() 을 오버라이딩해서 보다 유용한 정보를 제공하는 것이 일반적임
(클래스명 + 해시코드 보다는 객체의 다른 정보들을 원하는 경우가 많기 때문)
※ Object 클래스의 toString() 메서드 소스코드
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
(2) equals()
→ 동등성 비교를 위한 메서드
- Object 가 기본으로 제공하는 equals() 메서드는 == 으로 동일성 비교를 제공한다
- 동등성 비교를 사용하고 싶으면 equals() 메서드를 재정의 해야 한다 (오버라이딩 후 사용)
- ▼ Object 클래스의 equals() 메서드 소스코드
public boolean equals(Object obj) {
return (this == obj);
}
- Object 의 equals() 는 Object 타입을 매개변수로 사용하기 때문에 오버라이딩 시 객체의 특정 필드 값을 사용하려면 적절한 다운캐스팅이 필요하다
※ 동일성 vs 동등성 ?
◎ 동일성(Identity)
- == 연산자를 사용해서 두 객체가 참조한 동일한 객체를 가리키고 있는지 확인
- 물리적으로 같은 메모리에 있는 인스턴스인지 참조값을 확인하는 것
- 자바 머신 기준, 메모리의 참조가 기준이므로 물리적
◎ 동등성 (Equality)
- equals() 메서드를 사용해 두 객체가 논리적으로 동등한지 확인
- 논리적으로 같은지 확인하는 것
- 사람이 보통 생각하는 논리적인 기준에 맞추어 비교
Human a = new Human("홍길동"); // 참조 x001
Human b = new Human("홍길동"); // 참조 x002
// 두 객체는 물리적으로 다른 메모리에 있는 다른 객체이지만,
// 이름을 기준으로 생각하면 논리적으로 같은 사람으로 볼 수 있음
// => 두 객체는 동일하지는 않지만, 동등하다
// 아래의 경우도 마찬가지
String str1 = new String("Hello World");
String str2 = new String("Hello World");
※ 정확한 equals() 구현
1) equals() 메서드를 구현할 때 지켜야 하는 규칙
- 반사성(Reflexivity) : 객체는 자기 자신과 동등해야 한다 → x.equals(x) 는 항상 true 여야
- 대칭성(Symmetry) : 두 객체가 서로에 대해 동일하다고 판단하면 이는 양방향으로 동일해야 한다
→ x.equals(y)가 true 라면 y.equals(x) 도 true 여야 한다 - 추이성(Transitivity) : A 객체와 B 객체가 동일하고, B객체와 C 객체가 동일하다면 A 와 C 객체도 동일해야 한다
- 일관성(Consistency) : 두 객체의 상태가 변경되지 않는 한, equals() 메서드는 항상 동일한 값을 반환해야 한다.
- null 에 대한 비교 : 모든 객체는 null 과 비교했을 때 false 를 반환해야 한다
▷ 외우면 좋지만 외우지 않아도 크게 문제는 되지 않는다 (IDE가 만들어주는 equals() 메서드 사용하는 경우 多 )
2) IDE 를 사용한 equals() 메서드 구현 (IntelliJ 기준)
1. Generate (윈도우 기준 Alt + Insert)
2. eqauls() and hashCode() 클릭
(3) 그 외 Object 클래스의 메서드들
- clone() : 객체를 복사할 때 사용
- hashCode()
- getClass()
- notify(), notifyAll(), wait() : 멀티스레드용 메서드
'Language > JAVA' 카테고리의 다른 글
[JAVA] java.lang 패키지 (0) | 2024.04.29 |
---|---|
[JAVA] 입력받기 (Scanner vs BufferedReader) (0) | 2023.10.03 |
[JAVA] 배열 출력하기 (반복문 / Arrays.toString()) (0) | 2023.06.03 |
[JAVA] 2.연산자(Java Operator) (0) | 2023.01.23 |
[JAVA] 1.변수(Variable) : 선언, 초기화, 자료형, 형변환 (0) | 2023.01.02 |
Comments