Object 클래스란 무언인가

Updated: Categories:

java.lang 패키지와 Object 클래스에 대해 알아보자!

해당 포스팅은 Java의 정석 책을 참고하였습니다

java.lang 패키지

  • 자바프로그래밍에 가장 기본이 되는 클래스를 포함하는 패키지 (근-본)
  • import문 없이 사용할 수 있다. (ex. String 클래스)
  • 이제 알아볼 Object 클래스도 이 패키지 소속이다~


Object 클래스

  • 모든 클래스의 최고 조상 클래스
  • Object 클래스의 멤버는 모든 클래스에서 바로 사용이 가능
  • Object 클래스는 멤버변수는 없고 오직 11개의 메소드만을 가지고 있다.
  • 아래에서 기본 메소드들을 알아보자


equals(Object obj)

  • equals 메소드는 객체의 참조변수를 입력받고 비교해 결과를 boolean 값으로 리턴하는 메소드이다.
class Value{
  int value;

  Value(int value){
    this.vaule = value;
  }
}

public static void main(){
  // 1
  Value v1 = new Value(10);
  Value v2 = new Value(10);
  System.out.println(v1.equals(v2));
  // 2
  v2 = v1;
  System.out.println(v1.equals(v2));
}
  • 위의 결과는 1 : false / 2 : true 가 나온다.
  • class는 기본적으로 Reference 객체이기 때문에 객체에는 주소값이 저장됨.
  • 따라서 객체 클래스의 변수에 동일한 값 10을 넣었다 하더라도, ‘주소값’을 비교하기 때문에 1번은 false가 나온다.
  • 2번에서는 객체 클래스를 똑같이 만들었기 때문에 두 객체가 같은 주소를 가리킴. 따라서 true를 리턴

그럼 값을 비교하고 싶으면 어떡해?

  • 그럴땐 equals 메소드를 오버라이딩해서 사용하면 된다.
class Value{
  int value;

  Value(int value){
    this.vaule = value;
  }

  // 오버라이딩!!
  public boolean equals(Object obj){
    if(obj instanceof Value)
      return value == ((Value)obj).value
    else
      return false
  }
}
  • 이렇게 equals 메소드를 오버라이딩해서 주소값이 아닌 변수 value를 직접 비교해줄 수 있다.


hashCode()

  • 객체의 주소값으로 해시코드를 만들어 반환한다.
  • 32bit JVM에서는 중복되지 않지만 64bit JVM에서는 중복될 수 있음
String str = "abc";
str.hashCode();


toString()

  • 인스턴스에 대한 정보를 문자열로 제공하는 메소드
// toString Default 모습
public String toString(){
  return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
  • 내부가 이렇게 생겼다. (이래서 그냥 print로 찍으면 해시코드가 나왔구나)
  • 일반적으로 자바에서 제공하는 컬렉션에서 toString은 오버라이딩되어 있기에 print로 찍거나 .toString() 메소드를 붙여주면 원하는 값을 볼 수 있다.
  • 하지만 내가 직접 만든 클래스라면 직접 오버라이딩을 해줘야 원하는 값을 볼 수 있음
  • Object 클래스에서 toString 메소드는 접근제어자가 public이기 때문에 오버라이딩할때도 public으로 해야한다.