OneDev

[JAVA] Object 클래스 본문

Language/JAVA

[JAVA] Object 클래스

one_dev 2024. 5. 6. 16:00

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() 등은 당연히 자식 클래스에서 오버라이딩 가능)

Object 다형성 한계

 

※ 다운캐스팅 예시

 

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)

1. generate (윈도우 단축키 : Alt + Insert)

 

2. eqauls() and hashCode() 클릭

next > next> ,,,, > create
자동완성된 equals() 메서드

 

(3) 그 외 Object 클래스의 메서드들

 

  • clone() : 객체를 복사할 때 사용
  • hashCode() 
  • getClass()
  • notify(), notifyAll(), wait() : 멀티스레드용 메서드
Comments