[KOSTA JAVA] #Day 10 (Java API)

0f1c04·2021년 2월 26일
0

KOSTA JAVA TIL

목록 보기
9/11
post-thumbnail

자바 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로 간주되어진다는 것이다.

Class 클래스?

-클래스와 인터페이스의 메타데이터를 Class 클래스로 관리

*메타데이터?

​ 클래스 이름, 생성자 정보, 필드 정보, 메소드 정보

-클래스와 인터페이스의 메타데이터를 얻을 수 있다(리플렉션)

Class객체를 얻는 방법은 두가지가 있다.

\1. 객체로부터 얻는 방법 : getClass()

Class clazz = obj.getClass();

--> 최상위 클래스인 Object클래스가 가지고 있는 getClass()메소드

\2. 문자열로부터 얻는 방법 : forName()

try{

Class clazz = Class.forName(String className);

} catch(ClassNotFoundException e) { }

동적 객체 생성 : newInstance()

-이렇게 만들어진 Class 객체를 이용하면 new연산자를 사용하지 않고도 동적으로 객체를 생성할 수 있다.

-코드 작성 시에 클래스 이름을 결정 할 수 없고, 런타임 시에 클래스 이름이 결정되는 경우 유용하게 사용된다.

-newInstance()메소드의 리턴타입은 Object

String 클래스

- java.lang패키지에 속한 클래스

-자바의 문자열은 String클래스의 인스턴스로 관리된다.

-문자열 리터럴은 String객체로 자동 생성되지만, String 클래스의 다양한 생성자를 이용해서 직접 String객체를 생성할 수도 있다.

파일의 내용을 읽거나, 네트워크를 통해 받은 데이터는 보통 byte[]배열이므로 이것을 문자열로 변환하기 위해 자주쓰는 String클래스의 생성자가 있다.

byte[]배열을 문자열로 변환하는 String 클래스의 생성자

//배열 전체를 String 객체 생성

String str = new String(byte[] bytes);

//지정한 문자셋으로 디코딩

String str = new String(byte[] bytes, String charsetName);

//배열의 offset인덱스 위치부터 length개만큼 String 객체 생성

String str = new String(byte[] bytes, int offset, int length, int length);

//지정한 문자셋으로 디코딩

String str = new String(byte[] bytes, int offset, int length, String charsetName);,

profile
라면 먹고 싶다. 두 개 끓여서 혼자 먹고 싶다. - 임덕배 (1997. 06 ~ )

0개의 댓글