본문 바로가기

Java 공부

11장 API 정리_Object클래스

자바 API?

-자바에서 기본적으로 제공되는 라이브러리

-프로그램 개발에 자주 사용되는 클래스 및 인터페이스의 모음을 말한다.


API 도큐먼트?

-쉽게 API를 찾아 이용할 수 있도록 문서화 한것

https://docs.oracle.com/javase/8/docs/api/index.html


java.lang패키지?

-자바 프로그램의 기본적인 클래스를 담고 있는 패키지

-포함된 클래스와 인터페이스는 import없이 사용 가능

-주요클래스 

  Object

  System

  Class

  String

  StringBuffer, StringBuilder

 Math

 Wrapper(byte. short, character, Integr, Float, Double, Boolean)


그중에서도 자바의 최상위 부모 클래스인 Object에 대해서 알아보자

모든 클래스는 Object클래스를 상속받는다. 따라서 모든 클래스는 Object의 메소드를 사용할 수 있다.


Object클래스가 가지고 있는 equals()메소드

-Object클래스 안의 equals()메소드는 기본적으로 ==연산자와 동일한 결과를 리턴한다.(번지 비교)

하지만 대부분의 클래스에서는 equals()가 오버라이딩되어 사용된다.

대표적인 예가 String클래스의 equals()메소드. 

String클래스 에서는 equals()메소드를 재정의하여 논리적 동등을 이루었다.

     *논리적 동등이란?

           같은 객체이건 다른 객체이건 상관없이 객체가 저장하고 있는 데이터가 동일하다면 같은 것으로 보는것.

따라서 String 클래스에서 equals()를 호출하면 객체간의 문자열을 비교하여  true false를 리턴한다.


Object클래스가 가지고 있는 hashCode()메소드

      * 해시코드란?

          객체를 식별할 하나의 정수값을 말한다.

-Object의 hashCode()메소드는 객체의 메모리 번지를 이용해서 해시코드를 만들어 리턴한다.

  따라서 개별 객체는 해시코드가 모두 다르다.

-논리적 동등 비교시 hashCode() 오버라이딩이 필요하다.

  이유?

  컬렉션 프레임워크의 HashSet, HashMap, Hashtable과 같은 클래스는 두 객체가 동등한 객체인지 판단할 때 아래와 같은 과정을 거친다.

1. hashCode()와 equals()메소드 재정의

2. 두 객체의 hashcode()가 같은지 비교

3. hashCode()가 같다면 두 객체의 내부값이 같은지 equals()를 통해 비교


즉, 어떤 클래스를 논리적으로 동등하게 하려면 equals()메소드와 hashCode()메소드 모두 재정의가 필요하다.


(( 예제 ))

key클래스 >> 


KeyExample클래스>>


예제를 통해 알게된 사실1.

여기서 나는 value값이 어떻게 나오는지 궁금했다.

재정의한 equals()메소드와 hashCode()메소드를 호출하는 코드를 작성하지 않았는데 자동으로 실행되는 이유는

hashMap의 put메소드에 값을 넣기 전에, hashCode()와 equals()를 실행하여 값의 중복여부를 체크하라고 정의되어 있기 때문이다.


다음엔

HashMap의 key자리에 생성자를 주지 않고, 직접 객체를 생성해서 넣어줘봤다.

a와 b객체는 각각 서로 다른 주소값을 가지고 있는 서로 다른 객체임을 알 수 있다 -> a==b : false


예제를 통해 알게된 사실2.

hashMap.put(a,"김동수"); 에서

put메소드가 실행되면서, hashCode(), equals()를 실행한다. 

실행한 결과, a는 위의 new Key(1)과 같은 객체로 간주된다. 따라서, new Key(1)이라는 key값에 해당하는 value값인 "홍길동"자리에

"김동수"가 들어간다.


그리고

값을 찾아올 때(get)는 key값으로 b를 주고 찾아오도록 했다.

결과는 김동수라는 값을 찾아온다.

a와 b의 객체는 서로 다른 주소값을 가지고 있는 다른 객체이지만, Key클래스에 재정의된 hashCode()를 통해서 a와 b는 같은 해시코드값을 갖는다.

또한 같은 number값을 가지는 a와b는 equals()를 통해 같은 객체라는 논리적동등이 성립된다.

따라서 hashMap에서 a와 b는 동등한 객체로 간주된다.


즉, hashMap에서는 new Key(1), a, b 모두 같은 Key로 간주되어진다는 것이다.



본 포스팅은 이것이 자바다 책을 참고하여 작성하였습니다.

'Java 공부' 카테고리의 다른 글

12장 스레드 우선순위  (0) 2018.12.02
12장 작업 스레드 생성과 실행  (0) 2018.12.02
11장 API정리_String클래스  (0) 2018.12.01
11장 API정리_Class클래스  (0) 2018.12.01
12장 멀티스레드  (0) 2018.11.27