본문 바로가기

언어 기초/JAVA

Object클래스 [JAVA | 학습을 위한 자료 | 김영한 자바 중급 1편]

 

java.lang 패키지 소개

자바가 기본으로 제공하는 라이브러리(클래스 모음) 중에 가장 기본이 되는 것이 바로 java.lang 패키지이다. lang은 Language(언어)의 줄임말이다. 쉽게 이야기해서 자바 언어를 이루는 가장 기본이 되는 클래스들을 보관하는 패키지를 뜻한다.

java.lang 패키지의 대표적인 클래스들

  • Object : 모든 자바 객체의 부모 클래스
  • String : 문자열
  • Integer, Long, Double : 래퍼 타입, 기본형 데이터 타입을 객체로 만든 것
  • Class : 클래스 메타 정보
  • System : 시스템과 관련된 기본 기능들을 제공

Object 클래스

자바에서 모든 클래스의 최상위 부모 클래스는 항상 Object클래스이다.

자바에서 Object 클래스가 최상위 부모 클래스인 이유는 공통 기능을 제공하고 다형성의 기본 구현하기 위해서다.

Object 는 모든 객체를 다 담을 수 있다. 타입이 다른 객체들을 어딘가에 보관해야 한다면 바로 Object에 보관하면 된다.

Object 가 제공하는 기능은 다음과 같다.

  • 객체의 정보를 제공하는 toString()
  • 객체의 같음을 비교하는 equals()
  • 객체의 클래스 정보를 제공하는 getClass() 기타 여러가지 기능
  • *Object를 활용한 다형성의 한계

Object는 모든 객체를 대상으로 다형적 참조를 할 수 있다.

쉽게 이야기해서 Object는 모든 객체의 부모이므로 모든 객체를 담을 수 있다. Object를 통해 전달 받은 객체를 호출하려면 각 객체에 맞는 다운캐스팅 과정이 필요하다.

Object가 세상의 모든 메서드를 알고 있는 것이 아니다.

Object 배열

Object는 모든 타입의 객체를 담을 수 있다. 따라서 Object[]을 만들면 세상의 모든 객체를 담을 수 있는 배열을 만들 수 있다.

만약 Object 와 같은 개념이 없다면 어떻게 될까?

  • void action(Object obj)` 과 같이 모든 객체를 받을 수 있는 메서드를 만들 수 없다.
  • Object[] objects` 처럼 모든 객체를 저장할 수 있는 배열을 만들 수 없다.

size() 메서드 size(Object[] objects)메서드는 배열에 담긴 객체의 수를 세는 역할을 담당한다.

이 메서드는 Object 타입만 사용한다. Object타입의 배열은 세상의 모든 객체를 담을 수 있기 때문에, 새로운 클래스가 추가되거나 변경되어도 이 메서드를 수정하지 않아도 된다. size()메서드는 자바를 사용하는 곳이라면 어디든지 사용될 수 있다.

toString()

Object.toString()메서드는 객체의 정보를 문자열 형태로 제공한다. 그래서 디버깅과 로깅에 유용하게 사용된다. 이 메서드는 Object클래스에 정의되므로 모든 클래스에서 상속받아 사용할 수 있다.

toString() 은 기본으로 객체의 참조값을 출력한다. 그런데 toString() 이나 hashCode() 를 재정의하면 객체 의 참조값을 출력할 수 없다. 이때는 다음 코드를 사용하면 객체의 참조값을 출력할 수 있다.

equals() - 1. 동일성과 동등성

  • 동일성(Identity): == 연산자를 사용해서 두 객체의 참조가 동일한 객체를 가리키고 있는지 확인
  • 동등성(Equality): equals()메서드를 사용하여 두 객체가 논리적으로 동등한지 확인

equals() 메서드를 구현할 때 지켜야 하는 규칙

  • 반사성(Reflexivity): 객체는 자기 자신과 동등해야 한다. ( x.equals(x) 는 항상 true).
  • 대칭성(Symmetry): 두 객체가 서로에 대해 동일하다고 판단하면, 이는 양방향으로 동일해야 한다. (x.equals(y) 가 true이면 y.equals(x)도 true).
  • 추이성(Transitivity): 만약 한 객체가 두 번째 객체와 동일하고, 두 번째 객체가 세 번째 객체와 동일하다면, 첫번째 객체는 세 번째 객체와도 동일해야 한다.
  • 일관성(Consistency): 두 객체의 상태가 변경되지 않는 한, equals()메소드는 항상 동일한 값을 반환해야 한다.
  • null에 대한 비교 : 모든 객체는 null과 비교했을 때 false를 반환해야 한다.

동등성 비교가 필요한 경우에만 equals() 를 재정의하면 된다. equals() 와 hashCode() 는 보통 함께 사용된다.

문제와 풀이

문제: toString(), equals() 구현하기

  • 다음 코드와 실행 결과를 참고해서 Rectangle클래스를 만들어라.
  • Rectangle클래스에 IDE의 기능을 사용해서 toString(), equals()메서드를 실행 결과에 맞도록 재정의해라.
  • rect1과 rect2는 넓이(width)와 높이(height)를 가진다. 넓이와 높이가 모두 같다면 동등성 비교에 성공해야 한다.
public class RectangleMain {
     public static void main(String[] args) {
         Rectangle rect1 = new Rectangle(100, 20);
         Rectangle rect2 = new Rectangle(100, 20);
         System.out.println(rect1);
         System.out.println(rect2);
         System.out.println(rect1 == rect2);
         System.out.println(rect1.equals(rect2));
     }
}

실행결과

Rectangle{width=100, height=20}

Rectangle{width=100, height=20}

false

true