22일차 - 기본 API 클래스(3, Object클래스)
안녕하세요. pitang입니다.
Object 클래스에 대해서 알아보겠습니당~!
Object 클래스
자바의 모든 클래스는 Object 클래스의 자식이거나 자손 클래스이다. 따라서 자바의 최상위 부모 클래스에 해당한다.
필드가 없고, 메서드들로 구성되어 있다. 자바의 최상위 부모 클래스이므로 모든 클래스에서 사용이 가능하다.
toString()
toString() - 객체의 문자 정보를 리턴한다. 객체의 문자 정보란 객체를 문자열로 표현한 값을 말한다.
기본적으로 Object 클래스의 toString() 메서드는 "클래스명@16진수해시코드"로 구성된 문자 정보를 리턴한다.
Object toString() 메서드의 리턴 값은 별 값어치가 없는 정보이므로 메서드를 오버 라이딩하여 간결하고 유익한 정보를 리턴한다.
예를 들어, Date 클래스는 현재 시스템의 날짜와 시간 정보를, String 클래스는 저장하고 있는 문자열을 리턴한다.
출력을 위해 System.out.println() 메서드를 사용해 왔는데,
기본 타입은 해당 값을 그대로 출력하고 객체를 주면 객체의 toString() 메서드를 호출해 리턴 값으로 받아 출력하도록 되어 있다.
ex1)
ex2)
-> toString() 메서드를 오버 라이딩했다.
ex3)
hashCode()
hashCode() - 객체의 메모리 번지를 이용해서 해시 코드를 만들어 리턴한다. 그렇기에, 객체마다 다른 값을 가지고 있다.
객체 해시 코드란 객체를 식별할 하나의 정수값을 말한다.
해시코드 값이 다르면 다른 객체로 판단하고, 해시코드 값이 같으면 equals() 메서드로 다시 비교한다.
hashCode() - true, equals() - false 라면, 다른 객체가 된다.
다시 정리하자면, 서로 다른 객체가 같은 hashcode를 가질 수 있다. 하지만, 같은 객체라면 무조건 같은 hashcode를 가져야 한다.
ex1)
ex2)
-> String의 hashCode()는 같은 문자열일 경우 동일한 해시 코드를 리턴한다.
ex3)
-> hashCode()를 오버 라이딩할 때, 서로 같은 객체를 다른 값이 나오도록 재정의해도 문법적 오류는 나지 않지만, 잘못된 표현이다.
같은 객체라면 무조건 같은 hashcode를 가져야 한다.
equals()
equals() - 비교 연산자인 ==과 동일한 결과를 리턴한다.
기준객체.equals(비교객체); 이다.
String 객체의 equals()는 객체의 번지가 아닌 문자열이 동일한지를 조사한다.
그 이유는, String 클래스에서 Object의 equals() 메서드를 오버 라이딩하였기 때문이다.
ex1)
-> System.identityHashCode() 는 지정된 개체의 클래스가 hashCode()의 오버 라이딩의 여부에 관계없이
기본 메서드 hashCode()에서 반환되는 것과 동일한 해시 코드를 반환한다.
ex2)
-> b2==b3 주소 값은 false지만 equals는 true가 나온 것을 볼 수 있다.
ex3)
-> 15장에서 배울 컬렉션 프레임워크에서 HashSet, HashMap, Hashtable은 두 객체가 동등한 지 비교한다.
동등한 객체가 있으므로 size가 늘어나지 않는 것을 볼 수 있다.
ex4)
-> equals()와 hashCode() 오버 라이딩에서 model과 year가 포함된 식이 들어있으면 같은 객체는 true가 나오게 된다.
ex5)
감사합니다.
*m1 맥북을 사용 중입니다*