Object

서린·2024년 5월 10일

혼자개발

목록 보기
80/82

최상위 클래스 Object

p.357

10.6 최상위 클래스 Object

자바의 모든 클래스는 Object 클래스를 상속받는다.
컴파일러는 아무런 클래스로 상속하지 않으면 자동으로 extends Object를 삽입해 Object 클래스를 상속한다.

자바의 모든 클래스는 어떤 객체로 만들든지 Object 타입으로 선언할 수 있게 된다.

Object oa = new A();
Object ob = new B();

1. Object 클래스의 주요 메서드

toString()

객체 정보(패키지명.클래스명@해시코드 형태)를 문자열로 리턴하는 메서드

class A {
	int a = 3;
    int b = 4;
}
클래스 A를 정의했을 때
아무것도 상속하지 않았으므로 컴파일러가 자동으로 extends Object를 삽입한다.
내부에는 Object 메서드가 포함되어있다.
A aa = new A();
System.out.printf("%x\n", aa.hashCode());
System.out.println(aa); //aa.toString()이 자동으로 실행
A객체를 생성한 후 hashCode() 메서드의 리턴값을 16진수로 출력하면 aa 객체의 위칫값과 관련된 고윳값이 출력된다.

println() 메서드는 객체를 출력하면 자동으로 객체 내의 toString() 메서드를 호출한다.

toString()의 출력 결과인 '패키지명.클래스명@해시코드'는 객체의 직관적인 정보를 제공하지 못한다.
그래서 아래 클래스 B처럼 자식 클래스에서 toString() 메서드를 오버라이딩해 사용하는 것이 일반적이다.
class B {
	int a = 3;
    int b = 4;
    
    @Override
    public String toString() {
    	return "필드값: a = " + a + ", b = " + b;
    }
}
B bb = new B();
System.out.println(bb); //bb.toString()이 자동으로 실행
// 필드값: a = 3, b = 4

equals(Object obj)

스택 메모리의 값을 비교해 그 결과를 true 나 false로 리턴하는 메서드
기본 자료형이 아니라 객체의 스택 메모리값을 비교하므로 실제 데이터의 값이 아닌 실제 데이터의 위치(번지)를 비교하는 것

class A {
	String name;
    A (String name) {
    	this.name = name;
    }
}
A aa1 = new A("안녕");
A aa2 = new A("안녕");

System.out.println(aa1 == aa2); //false
System.out.println(aa1.equals(aa2)); //false
클래스 A는 name필드 1개를 포함하고 있고
생성자를 이용해 이 필드값을 초기화한다.

동일한 필드 값을 포함하고 있는 2개의 객체를 생성해 비교했을 때
객체 내부의 값은 동일하지만 실제 객체를 다른 곳에 위치하므로 false값이 나온다.

실제 내용을 비교하고자 할 때는 equlse() 메서드를 오버라이딩해 사용해야 한다.

hashCode()

객체의 위치와 관련된 값으로, 객체의 위칫값을 기준으로 생성된 고윳값

HashMap 자료구조는 데이터를 (key, value)의 쌍으로 저장하고 key 값은 중복되지 않는다.
그래서 HashMap에서는 추가하고자 하는 데이터셋의 key가 기존의 key들과 동일한지를 확인하는 과정이 반드시 필요하다.

key값이 동일한지 확인하는 과정
1. 두 key의 hashCode()값이 동일한지를 확인(key1.hashCode() == key2.hashCode())한다.
2. equals()메서드를 이용해 동일 여부를 확인(key1.equals(key2) == true)한다.
3. 1번의 hashCode() 값이 일치하고 2번의 equals()의 반환값이 true라면 기존의 key객체로 인식되므로 기존 데이터셋을 덮어쓴다. 반면 둘 중 하나라도 만족하지 않으면 다른 새 객체로 인식하므로 새로운 데이터셋으로 추가된다.

0개의 댓글