╱╱╭╮╱╱╱╱╱╱╭━━━╮╱╱╱╭╮╱╭╮╱╱╱╱╱╱ ╱╱┃┃╱╱╱╱╱╱┃╭━╮┃╱╱╱┃┃╱┃┃╱╱╱╱╱╱ ╱╱┃┣━━┳━━╮┃┃╱┃┣━╮╱┃╰━╯┣━━┳━╮╱ ╭╮┃┃╭╮┃┃━┫┃╰━╯┃╭╮╮┃╭━╮┃╭╮┃╭╮╮ ┃╰╯┃╭╮┃┃━┫┃╭━╮┃┃┃┃┃┃╱┃┃╭╮┃┃┃┃ ╰━━┻╯╰┻━━╯╰╯╱╰┻╯╰╯╰╯╱╰┻╯╰┻╯╰╯

Java/Java 기초

[Java] 오브젝트 클래스 (Object Class)

재안안 2022. 4. 20. 01:40

이번에 알아볼 것은 Object Class이다.

 

Object Class는 모든 java파일에 존재하고

Class의 상속 관계에서 가장 최상위에 있는 클래스이다.

 

즉, 모든 Class는 Object Class를 상속하여 만들어진다.

이말은 곧 Object Class는 모든 Class에 대한 부모 클래스라는 것이다.

Class를 정의할 때 extends Object를 사용하지 않지만 이는 자동적으로 실행 되는 것이다.

 

Object Class는 자바 기본 패키지에 저장되어있다.

 

또한 Object Class에 정의되어 있는 기본적인 메소드들이 있는데

모든 클래스에서 상속 또는 오버라이드하여 사용할 수 있다.

 

이 메소드들을 잘 활용하면 코딩을 더 깊이 있게 할 수 있다.

 

 

Object Class에 정의된 메소드들은 아래와 같다.

 

  • clone() : returns shallow copy of this object
  • equals() : returns true if this object is the same as the argument object
  • toString() : returns a string representing this object
  • getClass() : returns the runtime class of this object
  • hashCode() : returns a hash code value for this instance
  • finalize() : throws the Exception if such happens
  • notify() : throws IllegalMonitorStateException if such happens
  • nofityAll() : throws IllegalMinitorStateException if such happens
  • wait() : throws InterruptedException if such happens

 

생각보다 많은 메소드들이 있다.

 

모든 메소드들을 다뤄보진 않을 것이고 이번에는 몇개의 메소드들만 알아볼 것이다.

가장 쉽게, 많이 사용하는 것들로 추려보았다.

 

  • getClass()
  • toString()
  • hashCode()
  • equals()

 

우선 어떠한 클래스라도 Object Class를 상속받는지 부터 확인하겠다.

 

단축키 Ctrl + Space

 

Empty Class를 정의하였다.

override가 가능한 메소스들이 보이고 오른쪽의 설명을 보면 메소드들은 'Object'에 정의되어있는 것을 확인할 수 있다.

추가적으로 Empty 클래스는 Blog 패키지안에 정의되었다는 것도 알 수 있다.

 

이제 위의 메소드들에 대해 알아보겠다.

 

  • getClass() : returns the runtime class of this object

getClass() 사용

  • 참조변수 obj가 Object Class를 참조한다.
  • 참조변수 emp가 Empty Class를 참조한다.
  • 두 인스턴스 모두 getClass 메소드를 실행 가능하다.

 

실행결과

"class java.lang.Object"는 obj.getClass()의 실행결과이고

"class Blog.Empty"는 emp.getClass()의 실행결과이다.

 

여기서 Blog는 파일의 패키지 이름이고 Empty는 클래스 이름이다.

 

즉 이것은 경로이다.

 

getClass()를 통해 Class에 대한 경로를 알 수 있다.

 

반대로 생각하면 Object Class는 java 패키지내에 있는 lang 패키지에 선언되어 있는 것을 알 수 있다.

 

 

  • hashCode() : returns a hash code value for this instance

 

hashCode() 사용
실행 결과

  • obj의 hash code가 출력되었다.
  • emp의 hash code가 출력되었다.

 

해쉬코드는 java.util.HashMap를 통해 만들어진 integer 값이다.

어떠한 알고리즘으로 만들어지는지 아직은 이해할 수 없다.

 

하지만 Object Class의 메소드들을 오버라이드해서 사용할 것이니 괜찮다.

 

hash code는 무작위로 만들어지는 값이 아닌 어떠한 알고리즘을 통해 만들어지는 값이라는 개념을 알면 된다.

 

 

  • toString() : returns a string representing this object

toString() 사용

  • obj와 obj.toString()을 출력한다.
  • emp와 emp.toString()을 출력한다.

 

아래의 실행 결과를 확인하자.

 

실행 결과

obj의 출력 값이 obj.toString()의 출력 값과 같고

emp의 출력 값이 emp.toString()의 출력 값과 같다.

 

인스턴스를 출력하려고하면 인스턴스내 toString()의 결과 값이 출력되는 것이었다.

 

참고로 toString은 아래와 같다.

 

Object.class

 

1. getClass()로 가져온 String에서 .getName()을 이용해 경로를 가져오고

2. @를 붙이고

3. hashCode()를 통해 정수값을 가져온 뒤 16진수로 바꾼다.

 

위의 과정을 통해 만든 String을 반환하는 것이다.

실행 결과

 

경로@해쉬코드를 반환한다는 것을 기억해야겠다.

 

 

  • equals() : returns true if this object is the same as the argument object

 

equals()는 Boolean 값을 반환한다.

 

equals() 사용

  • obj2, emp2가 생성되었다.
  • equals메소드를 사용한다.
  • == 연산자를 사용한다.

 

실행결과

 

equals메소드와 ==연산자의 결과가 동일한 이유는 아래와 같다.

 

Object.class

 

equals 메소드에서 ==를 사용해 주소를 비교한다. (깨알같은 업캐스팅)

 

 

여기까지 Object Class의 메소드들에 대해 알아봤다.

하지만 위의 메소드들의 개념과 용도를 가지고 오버라이딩하여 사용할 것이다.

 

메소드들의 오버라이딩은 아래의 예제를 통해 설명하겠다.

 

ID Class

  • ID가 정의되었다.
  • name과 age를 요소로 가진다.

 

이때 ID에서 toString(), hashCode(), equals()를 오버라이드 해보겠다.

 

단축키 Shitf+Alt+s

 

해당 사진이 너무 커서 일단은 나누어서 설명하겠다.

추가적으로 해당 사진에서만 잠시 private을 제거했다.

 

  • hashCode()

hashCode override

hashCode를 override하였다.

자동으로 어떠한 연산식이 만들어지고 이를 통해 값을 반환한다.

 

overrided hashCode() 사용
실행 결과

 

해쉬코드가 생성되었다.

 

오버라이드된 해쉬코드를 보니까 해쉬 값은 객체가 가지고있는 값을 통해서 만들어진다.

 

다른객체가 같은 값을 갖고있다면 동일한 해쉬 값이 만들어진다.

 

이를해용해 객체가 가지고있는 요소들의 값이 같은지를 확인할 수 있다.

 

hashCode value

 

  • equals()

Overrided equals()

 

메소드를 보면 단 하나의 요소라도 다른경우 false를 리턴한다.

그러나 위와같이 모든 요소가 같다면 다른 객체더라도 리턴값은 true가 나올 수 있다.

 

 

  • toString()

 

Overrided toString()

 

요소들의 값을 친절하게 알려주는 메소드가 되었다.

 

많은 메소드들이 있었는데 결국 모든 메소드들은 객체의 필드 값을 다루는 메소드들 이었다.

이러한 방법들을 아는 상태로 인스턴스를 다루는 것과 모르는 상태로 인스턴스를 다루는 것은 많이 다를 것이다.

 

추가적으로 Object Class를 통해 알게된, 의외로 숨겨져있는 기능들이 많았다.