[JAVA] Object Class에 대하여

2025. 6. 24. 13:53·자바

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

즉 다음과 같은 형식이 항상 묵시적으로 생략되어 있는 것이다.

public class Parent extends Object {
    //
}

 

이렇듯 자바에서 모든 클래스가 Object 클래스를 상속 받는 이유는 다음과 같다.

    ● 공통 기능 제공

    ● 다형성의 기본 구현

 

공통 기능 제공

객체의 정보를 제공하고, 이 객체가 다른 객체와 같은지 비교하고,  객체가 어떤 클래스로 만들어졌는지 확인하는 기능은 모든 객체에게 필요한 기본 기능이다. 이런 기능을 객체를 만들 때 마다 항상 새로운 메서드를 정의해서 만들어야하고, 만들었다 한듯 개발자마자 함수 명을 다르게 할 수 있어 상당히 번거로울 것이다.

 

Object 클래스는 다음과 같은 메서드를 제공한다.

 ● 객체의 정보를 제공하는 toString()

 ● 객체의 같음을 비교하는 equals()

 ● 객체의 클래스 정보를 제공하는 getClass()

 ● 기타 여러가지 기능

 

 

다형성의 기본 구현

Object 클래스는 다형성을 지원하는 기본적인 메커니즘을 제공한다. 모든 자바 객체는 Object 타입으로 처리될 수 있으며, 이는 다양한 타입의 객체를 통합적으로 처리할 수 있게 해준다.

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

 

만약 Object 클래스가 없다면 모든 객체를 받을 수 있는 메서드를 만들 수 없어 전세계 개발자는 비슷한 클래스를 만들 것이고, 서로 호환 되지 않는 XxxObject들이 넘쳐날 것이다.

 

 

toString()

이 Object 클래스는 여러 메서드를 제공하는데, 그중 대표적인 것이 toString()이다. 이 메서드는 객체의 정보를 문자열로 반환하며, 주로 디버깅이나 로깅 시에 객체의 상태를 확인하는 데 사용된다. 우리가 쉽게 볼 수 있는 System.out.println(객체)처럼 객체를 출력하면 내부적으로 자동으로 toString()이 호출되어 문자열 형태로 보여준다.

 

하지만 Object 클래스의 기본 toString()은 클래스 이름과 객체의 참조값(해시코드를 16진수로 변환한 값)을 보여주기 때문에, 객체 내부의 구체적인 상태를 확인하긴 어렵다. 그래서 실무에서는 이 메서드를 오버라이딩해서, 예를 들어 자동차라면 모델명, 강아지라면 이름과 나이처럼 객체의 주요 정보를 문자열로 보여주도록 재정의하는 것이 일반적이다.

 

이러한 방식은 다형성과도 잘 어울린다. 예를 들어 어떤 메서드가 Object 타입으로 매개변수를 받더라도, 그 안에서 toString()을 호출하면 실제 객체가 오버라이딩한 내용을 따라간다. 따라서 Object 하나로 여러 타입의 객체 정보를 출력할 수 있는 유연한 코드 구성이 가능하다. 이처럼 toString()은 자바의 객체지향 철학을 잘 보여주는 예시이며, 새로운 클래스를 추가하더라도 기존 코드를 바꾸지 않고 확장할 수 있어 OCP(Open-Closed Principle) 원칙도 자연스럽게 지킬 수 있게 해준다.

 

결국 toString()을 오버라이딩하는 것은 단순한 출력 이상의 의미를 가진다. 객체의 상태를 명확하게 표현할 수 있을 뿐만 아니라, 다형성과 추상화를 활용해 확장성과 유지보수성을 높이는 데도 중요한 역할을 한다.

 

 

equals()

자바에서 객체의 같음을 비교할 때는 두 가지 관점이 존재한다. 바로 동일성(Identity)과 동등성(Equality)이다. 이 두 개념은 비슷해 보이지만 완전히 다른 의미를 가진다.

 

동일성은 == 연산자를 사용하여 두 객체의 참조값이 같은지, 즉 물리적으로 같은 메모리 주소를 가리키고 있는지를 판단한다. 반면, 동등성은 equals() 메서드를 사용해 두 객체가 논리적으로 같은지를 판단한다. 여기서 논리적이라는 것은 사람의 기준에서 의미적으로 같다고 여길 수 있는지를 말한다.

 

쉽게 예를 들어보면 다음과 같다.

package lang.object.equals;
 public class EqualsMain {
     public static void main(String[] args) {
         User user1 = new User("id-100");
         User user2 = new User("id-100");
         System.out.println("identity = " + (user1 == user2));
         System.out.println("equality = " + user1.equals(user2));
    }
 }
 
 //실행 결과
 identity = false
 equality = true

결과를 확인하면 객체의 참조값이 달라 false지만, 논리적으로 같기 때문에 동등성은 ture임을 확인할 수 있다.

 

 

equals 메서드를 사용할때는 자바에서 자동으로 구현해주는 equals메서드를 오버라이딩하여 사용하면 된다.

Window기준: (ALT + Insert)  ->  Override Methods -> equals()  

'자바' 카테고리의 다른 글

[JAVA] 날짜와 시간  (1) 2025.07.06
[JAVA] 열거형(ENUM)에 대하여  (1) 2025.06.29
[JAVA] 래퍼 클레스에 대하여  (3) 2025.06.24
[JAVA] String 클래스에 대하여  (0) 2025.06.24
[JAVA] 불변객체에 대하여  (0) 2025.06.24
'자바' 카테고리의 다른 글
  • [JAVA] 열거형(ENUM)에 대하여
  • [JAVA] 래퍼 클레스에 대하여
  • [JAVA] String 클래스에 대하여
  • [JAVA] 불변객체에 대하여
0kingki_
0kingki_
자바 + 스프링 웹 개발
  • 0kingki_
    0kingki_
    0kingki_
  • 전체
    오늘
    어제
    • 분류 전체보기 (134)
      • 코딩 테스트 (54)
      • 자바 (21)
      • 스프링 (27)
      • 타임리프 (16)
      • 스프링 데이터 JPA (8)
      • 최적화 (2)
      • QueryDSL (4)
      • AWS (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    스프링 데이터 JPA
    객체지향
    자바
    thymeleaf
    컬렉션
    LocalDateTime
    불변객체
    fetch join
    mvc
    SpringDataJpa
    쿼리dsl
    스프링
    spring
    최적화
    Java
    JPA
    dfs
    BFS
    예외처리
    재귀
    쿼리
    코딩테스트
    백준
    코딩 테스트
    다형성
    예외 처리
    SOLID
    타임리프
    QueryDSL
    스프링 컨테이너
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
0kingki_
[JAVA] Object Class에 대하여
상단으로

티스토리툴바