[Java] Object 클래스

jinsung·1일 전

Java

목록 보기
1/5
post-thumbnail

1. java.lang 패키지

여기서 lang은 langauge의 줄임말로, 이 패키지는 자바언어를 이루는 가장 기본 클래스들을 보관하는 패키지를 말한다.

이 패키지는 자바 애플리케이션 단에서 자동으로 import 되어서 생략 가능하다.

java.lang 의 대표 클래스들

1. Object

  • 모든 자바 객체의 부모 클래스

2. String

  • 문자열

3. Integer / Long / Double

  • 래퍼 타입, 기본형 데이터 타입을 객체로 만든 것

4. Class

  • 클래스 메타 정보

5. System

  • 시스템과 관련된 기본 기능들을 제공

2. Object 클래스

모든 클래스의 최상위 부모 클래스는 Object 클래스이다.

공통 기능 제공

  • Object는 모든 객체에 필요한 공통 기능을 제공
  • Object는 최상위 부모 클래스이기 때문에 모든 객체는 공통 기능을 편리하게 상속받을 수 있다.
  • toString(), equals(), getClass() 등등

다형성의 기본 구현

  • 다형성을 지원하는 기본적인 메커니즘 제공
  • Object는 모든 객체를 다 담을 수 있고, 다양한 타입의 객체를 통합적으로 처리 가능

3. Object 다형성

모든 Java 클래스는 Object를 직접 또는 간접적으로 상속하므로, Object 타입 변수는 모든 클래스의 객체를 참조할 수 있다.

class B { // Object 상속받음(직접 상속)
}

class A extends B {  // Object를 상속받은 B를 상속받음(간접 상속)
}

Object를 활용한 다형성의 한계

Object 타입은 모든 객체를 다형적으로 참조할 수 있다. 오버라이딩된 Object 메서드는 실제 객체의 메서드가 실행되지만, 참조 타입이 Object이므로 각 클래스에만 정의된 고유 메서드를 호출하려면 다운캐스팅이 필요하다.

class Dog {
    void bark() {
        System.out.println("멍멍");
    }

    @Override
    public String toString() {
        return "강아지";
    }
}

Object obj = new Dog();

System.out.println(obj.toString()); // Dog에서 오버라이딩한 메서드 실행
// obj.bark(); // 컴파일 오류: Object에는 bark()가 없음

-> 공통으로 사용할 수 있는 메서드가 적어 다형성 활용에 한계가 있다.


4. Object 배열

Object 배열을 만들면 모든 객체를 담을 수 있는 배열이 만들어 진다.

Object obj[0] = new Cat();
Object obj[1] = new Dog();
Object obj[2] = new Lion();

5. toString()

Object.toString() 메서드는 객체의 정보를 문자열 형태로 제공한다.
모든 클래스에서 상속받아 사용 가능하다.

public String toString() {
        return getClass().getName() 
        + "@" 
        + Integer.toHexString(hashCode());
}
  • Object가 제공하는 toString() 메서드는 기본적으로 패키지를 포함한 객체의 이름과 객체의 참조값(해시코드)를 16진수로 제공

println()

System.out.println() 메서드는 내부에서 String.valueOf()를 거쳐 toString()을 호출한다.

public static String valueOf(Object obj) {
        return (obj == null) ? "null" : obj.toString();
}
  • null인 객체를 toString() 붙여서 println() -> NullPointerException
  • null인 객체를 그냥 println() -> null 출력

객체의 정보를 원하는 방식으로 제공하고 싶으면 toString()을 오버라이딩해서 사용

  • 오버라이딩 한 경우 객체의 참조값을 알고 싶으면
    -> Integer.toHexString(System.identityHashCode())

6. Object와 OCP

만약 Object 클래스가 없다면 클래스마다 toString 메서드를 정의해 작성해야 한다.

구체적인 것에 의존

사용하는 클래스가 특정 구현 클래스를 직접 참조하므로, 구현 클래스를 다른 것으로 교체할 때 사용하는 코드도 수정해야 한다.

추상적인 것에 의존

사용하는 클래스가 여러 구현 클래스의 공통 상위 타입인 인터페이스나 추상 클래스에 의존하므로, 구현체가 바뀌어도 사용하는 코드는 수정하지 않아도 된다.

OCP (Open - Closed - Principle) 원칙이란?

확장에는 열려 있고, 변경에는 닫혀 있어야 한다.

  • 새로운 기능은 추가할 수 있어야 하고,
  • 기존 코드는 가능하면 수정하지 않아야 한다.
  • OCP는 새로운 요구사항이 생겼을 때 기존 코드를 고치는 대신 새로운 구현을 추가해서 기능을 확장하도록 설계하는 원칙이다.

자바 언어는 객체지향 언어 답게 언어 스스로 객체지향의 특징을 매우 잘 활용해야 한다.


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

Object는 동등성 비교를 위한 equals() 메서드는 제공한다.

1. 동일성 (Identity)

== 연산자를 사용해서 두 객체가 참조가 동일한 객체를 가리키고 있는지 확인

2. 동등성 (Equality)

equals() 메서드를 사용하여 두 객체가 논리적으로 동등한지 확인

public boolean equals(Object obj) {
        return (this == obj);
}
  • Object가 기본으로 제공하는 equals()는 ==으로 동일성 비교를 제공
  • 동등성 비교를 사용해야되는 경우 equals 메서드를 재정의해서 사용
  • equals()를 재정의하면 일반적으로 hashCode()도 함께 재정의

Object의 나머지 메서드들

clone()

  • 객체를 복사할 때 사용

hashCode()

  • 객체를 숫자 형태의 해시값으로 표현하는 메서드
  • equals()가 true인 두 객체는 반드시 같은 hashCode()를 반환해야 한다.

    같은 hashCode()를 가진다고 해서 반드시 equals()가 true인 것은 아니다.

getClass()

  • 객체의 실제 실행 클래스 정보를 반환
  • final 메서드라 재정의 불가

notify(), notifyAll(), wait()

  • 멀티 쓰레드용 메서드
profile
Backend Engineer

0개의 댓글