모든 클래스의 최상위 부모 클래스
자바의 객체들이 최소한으로 요구될 메소드를 보유
Object 클래스에서 제공하는 기본 메소드들을 그냥 사용해도 되지만, 필요에 따라 오버라이딩 해서 사용
메소드 종류
getClass() : 클래스 이름
hashCode() : 해시코드값 리턴
toString() : 객체를 문자열로 만들어 출력
객체 자체를 호출시 => 내부적으로 toString() 을 호출
obj.getClass().getName() : 내부적으로 보유한 Class 라는 클래스를 getClass() 로 리턴받고, getName() 으로 리턴받은 Class 클래스의 이름을 리턴받음
객체를 문자열로 변환
출력형태 : "클래스명@기본 해시코드를 16진수로 변환한 값"
== 연산자
equals()
기본적으로는 == 랑 동일하게 동작함.
물리적으로 다른 메모리 객체를 가질지라도, 그 안의 데이터가 동일한지를 비교를 하고싶은 경우 오바라이딩 해줄것!
예제
Member 클래스에서 equals 를 재정의
내 id 와 인자로 전달받은 obj 의 id 가 일치한다면 true 리턴
(즉 문자열 id 가 일치하면 동인한 객체라고 판단)
메소드
두 객체의 동등 비교
비교할 객체가 배열일 경우 항목 값을 모두 비교
=> Arrays.deepEquals(a, b) 라는 것을 호출함
전달받은게 배열이 아니면, a.equals(b) 로 동작
해당 클래스가 가지고 있는 값이 동일하면 true 리턴
(기존의 equals 는 참조 객체가 동일한지를 봤지만, Integer 클래스는 이 기능을 오버라이딩 해서 참조 객체가 아니라 그 객체 안에 있는 값이 동일한지를 본다.)
deepEuals 는 두 인자가 배열이 아니라면 equals 와 동일하게 동작 연산을 수행
배열이 인자인 경우는 배열의 모든 값을 비교한다.
(물리적으로 다른 메모리에 위치해도 모든 값이 동일하면 true 리턴 )
기본적으로 제공되는 해시코드 (메모리 주소에 기반한 해시코드값) 을 쓰는게 아니라, 내가 직접 hash해시코드값을 지정해보자!
Object 클래스의 hashCode() 는 해당 객체의 메모리 주소에 기반한 해시코드값을 생성
Objects 클래스의 hash() 는 해당 객체의 인자로 주어진 배열의 값들을 기반으로 해시코드를 생성
Objects.hash( Object ... values )
Objects.hashCode(Object o)
최상위 클래스인 Object 클래스로부터 상속받은 메소드 hashCode() 를 오버라이딩함.
오버라이딩 내용 : Objects 의 hash 메소드를 인자 2개를 넣어주면서 호출함으로써 받은 해시코드 값을 리턴해준다.
오버라이딩을 안했다면, 객체의 메모리 주소를 Object 클래스의 hashCode() 함수에 인자로 넣어서 나온 해시코드값을 리턴해줌
즉, Objects 클래스의 hash() 를 활용해 오버리이딩을 함으로써, 해당 객체의 번호와(sno) 이름(name) 을 넣어서 해시코드값을 형성하는 기능을 구현한 것이다.
s1.hashCode() 를 호출하는 것은 Object 클래스로 부터 상속받은 hashCode() 를 오바라이딩해서 호출하는 것이다. 즉, 코드상에서 보이는 오버라이딩된 hashCode() 가 호출된다.
s2.hashCode() 를 호출하는 것은 Objects 클래스에 있는 hashCode() 가 호출되는 것이다!!