블로그

[JAVA] Object 클래스, 포장 클래스(Wrapper class) 본문

개발자 준비과정/JAVA

[JAVA] Object 클래스, 포장 클래스(Wrapper class)

하늘바람a 2024. 3. 14. 17:48

Object 클래스

-자바 클래스의 최상위 클래스-

Object 클래스 中 3가지 메서드

 

toString()

 

Object의 toString() 메소드는 객체의 문자 정보를 리턴한다. 

객체의 문자 정보란 객체를 문자열로 표현한 값을 말한다.

기본적으로 Object의 toString() 메소드는 '클래스명@16진수해시코드'로구성된 문자열을 리턴한다.

Object obj = new Object();
System.out.println(obj.toString());
java.lang.Objectøde6ced



객체의 문자 정보가 중요한 경우에는 Object의 toString() 메소드를 재정의하여 사용한다.

@Override //toString 재정의
public String toString() {
    return "C02MyClass1{" +
            "name='" + name + '\'' +
            ", age=" + age +
            '}';
}

 

System.out.println() 메소드는 매개값이 기본 타입(byte, short, int, long, float, double, boolean)이거나 문자열일 경우 해당 값을 그대로 출력한다.

그러므로 toString() 을 생략할 수 있다.

 


equals(Object obj)

 

객체 자신과 주어진 객체(obj)를 비교하는 메서드이다.

Object의 equals() 메소드참조변수 값(객체의 주소)을 비교하고 boolean 값을 리턴한다.

Object o1 = new Object();
Object o2 = new Object();
Object o3 = o2;  // 참조값이 같음

boolean a1 = o1.equals(o2); //false
boolean a2 = o2.equals(o3); //true
boolean a3 = o1.equals(o3); //false

 

내부의 데이터(인스턴스변수의 값)가 같은지 확인하고 싶을 때,

equals()메소드를 재정의(오버라이딩)하여 사용한다.

 

※equals() 메소드의 매개변수 타입이 Object이므로 자동 타입 변환에 의해 모든 객체가 매개값으로 대입될 수 있다.

 

 

객체가 같다면 같은 해시코드를 가져야 한다.


hashCode()

 

객체의 해시코드(int타입의 정수)를 반환하는 메서드(해시함수)

객체를 식별하는 정수이다.

객체의 메모리 번지를 이용해서 해시코드를 생성하기 때문에 객체마다 다른 정수값을 리턴한다.

 

equals()메소드와 비슷하게 두 객체가 동등한지를 비교할 때 사용한다.

equals()메소드와 마찬가지로 객체의 데이터를 기준으로 재정의해서 새로운 정수값을 리턴할 때 사용하는것이 일반적이다.

 

hashCode() 재정의 규칙
1. 같은 객체가 hashCode를 여러 번 호출해도 같은 값이 나와야한다
2. 두 객체가 equals로 같은 객체로 여겨지면 두 객체의 hashCode는 같아야한다
3. 두 객체가 equals로 같지 않더라도 두 객체의 hashCode는 같을 수도 있다(하지만 다르면 더 좋다)

하지만 위의 내용을 외울필요는 없다. API와 인텔리제이 도움을 받아서 필드기준으로 재정의 하자

 

※equals()를 오버라이딩하면, hashCode()도 같이 오버라이딩 해야한다.

  -> 위의 2번째 규칙처럼 equals() 결과가 같은 객체라면 hash code도 같아야 하기 때문이다.

public class C07HashCode {
    public static void main(String[] args) {
        C07MyClass o1 = new C07MyClass("안녕하세요");
        C07MyClass o2 = new C07MyClass("안녕하세요");
        C07MyClass o3 = new C07MyClass("자바를 배웁니다");

        System.out.println(o1 == o2); // false : 참조값 다름
        System.out.println(o1.equals(o2)); // true : equals 메소드 재정의
        System.out.println(o1.hashCode());
        System.out.println(o2.hashCode());

        System.out.println(o1.equals(o3)); // false
        System.out.println(o3.hashCode()); // 다른 hash 값
    }
}

class C07MyClass {
    private String title;

    public C07MyClass(String title) {
        this.title = title;}

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        C07MyClass that = (C07MyClass) o;

        return Objects.equals(title, that.title);
    }

    @Override
    public int hashCode() {
        return title != null ? title.hashCode() : 0;
    }
}

 

※ System.identityHashcode(Object obj)

주어진 객체의 클래스가 hashCode()를 재정의하는지 여부에 관계없이 기본 메서드 hashCode()가 반환하는 것과 동일한 객체에 대해 동일한 해시 코드를 반환한다.


포장 클래스(Wrapper class)

 

자바는 기본타입의 값을 갖는 객체를 생성 할 수 있다. 포장(Wrapper)객체라고 한다.

포장 객체를 생성하기 위한 클래스는 java.lang 패키지에 포함되어 있다.

 

기본 타입 포장 클래스
byte Byte
char Character
short Short
int Integer
long Long
float Float
double Double
boolean Boolean

 

포장 객체는 포장하고 있는 기본 타입의 값을 변경할 수 없고, 객체로 생성하는 데 목적이 있다.
이런 객체가 필요한 이유는 컬렉션 객체 때문이다. 컬렉션 객체는 기본 타입의 값은 저장할 수 없고, 객체만 저장할 수 있다.

Integer obj = 100; // auto boxing
System.out.println("obj = " + obj.intValue()); // obj.intValue() : 수동 언박싱
System.out.println("obj = " + obj);            // 재정의한 toString 호출
System.out.println("obj = " + obj.toString()); // 재정의한 toString 호출

int value = obj; // auto unboxing
int result = obj + 100; // auto unboxing

 

 

실제 객체의 참조값 비교 : ==, != 비교연산자를 사용한다.

👉 객체 내부 값 비교 : equals() 메소드를 사용한다. 👈 🔴아주아주아주아주아주아주 중요!!!!!!!!!!! 🔴

int a = 60000;
int b = 60000;

System.out.println(a == b); // true

Integer c = 70000; // auto boxing
Integer d = 70000; // auto boxing

System.out.println(c == d); // false
System.out.println(System.identityHashCode(c));
System.out.println(System.identityHashCode(d));

// *****************************************
// 참조타입 비교는 equals 사용!!
// *****************************************
System.out.println(c.equals(d)); // true

 

출처 : 이것이 자바다, 자바의 정석

'개발자 준비과정 > JAVA' 카테고리의 다른 글

[JAVA] 제네릭(Generic)  (0) 2024.03.15
[JAVA] Regular Expression (정규 표현식)  (0) 2024.03.15
[JAVA] 람다식  (0) 2024.03.13
[JAVA] 중첩 클래스, 익명 클래스  (0) 2024.03.12
[JAVA] instanceof 연산자  (0) 2024.03.11