본문 바로가기
[ JAVA ]/JAVA

[ Java ] JDK 기본 클래스 1

by 환이s 2022. 12. 22.
CHAPTER 13. JDK 기본 클래스 알아가기

오늘은 JDK(Java Development Kit : 자바 개발자 도구)에 대한 포스팅을 하겠습니다..!! 자바를 설치하면 JDK도 같이 설치되는데, 개발자들의 편의를 위해 오라클이 미리 만들어놓은 클래스의 집합입니다. 이 클래스들은 기능별로 구분되어 패키지 단위로 제공되고, 이렇게 자바에서 기본으로 제공하는 패키지를 자바 API라고 합니다.

 

 

1 ) Java.lang Package

 

지금까지 사용한 String , Integer와 같은 클래스를 자료형으로 불러서 사용했는데, 이러한 클래스들은 'java.lang package'에 속해있습니다.

String 클래스의 전체 이름은 java.lang.String이고,  Integer 클래스의 전체 이름은 java.lang.Integer입니다. java.lang 패키지에는 기본적으로 많이 사용하는 클래스들이 포함되어 있습니다.

 

지금까지 코딩을 하면서 우리가 String 클래스를 쓰거나 , Integer 클래스를 사용할 때 import를 직접적으로 선언한 적이 없습니다.

java,lang package는 JVM경로/ Contents/Home/bin/src.zip 내부에 존재하고, 컴파일시 코드에 import java.lang.*;문장이 자동으로 추가되어 java.lang 패키지 하위 클래스를 모두 사용할 수 있어서 프로그래머의 편의성이 높아집니다. 

 

즉 프로그래머가 import문을 쓰지 않아도 java.lang package의 모든 하위 클래스가 참고할 수 있기 때문이고, java.lang package에 속해있는 클래스는 모두 프로그램에서 가장 많이 사용하는 " 기본 클래스 "입니다.

 

더보기

# java.lang package


- String, Integer, System, etc
- Compile base package

 

2 ) Object class

 

Object 클래스는 모든 클래스의 최상위 클래스입니다. 이 뜻은 모든 클래스는 Object클래스로 부터 상속을 받는다는 뜻입니다.

또한! 행렬을 포함한 모든 객체는 Object 클래스의 메서드들을 구현합니다

 

그럼 Object 클래스에 정의된 메서드 중 주로 사용하는 메서드는 어떤 게 있을까?? 아래 표와 같습니다.

메서드 설명
String toString() 객체를 문자열로 표현하여 반환한다. 재정의하여 객체에 대한 설명이나 특정 멥버 변수 값을 반환한다.
boolean equals(Object obj) 두 인스턴스가 동일한지 여부를 반환한다. 재정의하여 논리적으로 동일한 인스턴스임을 정의할 수 있다.
int hashCode() 객체의 해시 코드 값을 반환한다.
class getClass() 객체의 클래스를 반환한다.
void finalize() 인스턴스가 힙 메모리에서 제거될 때 GC(Garbage collector)에 의해 호출되는 메서드이다. 네트워크 연결 해제, 열려있는 파일 스트림 해제 등을 구현한다.
void wait() 멀티스레드 프로그램에서 사용하는 메서드이다. 스레드를"기다리는 상태"(non runnable)로 만든다.
void notify() wait() 메서드에 의해 기다리고 있는 스레드(non runnable)를 실행가능한 상태(runnable)로 바꾼다.

 

Object 메서드 중에는 재정의할 수 있는 메서드가 있고, 그렇지 않은 메서드가 있습니다. ( final 선언된 메서드는 재정의 하지 않습니다. )

 

그럼 자주 재정의하여 사용하는 메서드를 포스팅해보겠습니다.

 

2-1 ) String Object.toString() 

 

toString()은 객체 정보를 문자열로 바꿔 줍니다. Object 클래스를 상속받은 모든 클래스는 toString()을 재정의할 수 있는데,

String이나 Integer 등의 여러 JDK 클래스에는 toString() 클래스가 이미 재정의 되어 있습니다.

 

toString()의 반환되는 문자열은 클래스 이름과 함께 구분자로 '@'가 사용되고, 그 뒤로 16진수 hash code가 추가됩니다.

(16진수 hash code 값은 인스턴스의 주소를 가리키는 값으로, 인스턴스마다 모두 다르게 반환됩니다.)

 

그럼 간단하게 예제를 통해서 알아봅시다.

 

 

글쓴이는 학번(id)과 이름(name)을 갖는 학생(Student) 클래스를 만들고,
각각의 getter, setter를 만들었습니다.

그리고 이름과 학번을 `홍길동(921234)`와 같이 출력하는 toString() method를 구현을 했습니다.

 

 

결과로는 제가 원하는 출력값이 나오는 걸 확인했고, 앞서 말씀드린 것처럼 toString() 메서드를 직접 재정의하면 객체의 참조 변수를 이용해 원하는 문자열을 표현할 수 있습니다.

 

 

2-2 ) boolean Object.equals()

 

equals() 메서드는 두 인스턴스의 주소값을 비교하여 boolean(ture/false) 값으로 반환해 줍니다. 주소값이 같다면 동일한 인스턴스인데, 서로 다른 주소 값을 가짐에도 같은 인스턴스라고 정의해줄 수 있는 경우가 있습니다.

따라서 물리적 동일성(인스턴스의 메모리 주소가 같다.)뿐 아니라 논리적 동일성(논리적으로 두 인스턴스가 같다.)을 구현할 때도 equals() 메서드를 재정의하여 사용합니다.

 

그렇다면 두 인스턴스가 같다?? 는 것은 무엇을 의미하는 걸까??

간단하게 예시로 알아봅시다.

 

 

학번과 이름이 같으면 동일한 학생이라고 판단하는 equals() method를
구현(Override)하시오.

 

 

위 코드를 보면 s1, s3는 서로 다른 주소를 가지고 있지만, 저장된 학생 정보는 같다. 이런 경우 논리적으로는 s1, s3을 논리적으로 같다라고 판단한다.

 

 

2-3 ) int Object.hashCode()

 

hashCode() 메서드는 정보를 저장하거나 검색할 때 사용하는 자료 구조입니다.

정보를 어디에 저장할 것인지, 어디서 가져올 것인지 해시 함수를 사용하여 해당 객체가 참조하고 있는 주소를 10진수로 반환합니다.

 

해시 함수는 객체의 특정 정보(키 값)를 매개변수 값으로 넣으면 그 객체가 저장되어야 할 위치나 저장된 해시 테이블 주소(위치)를 반환해 줍니다. 따라서 객체 정보를 알면 해당 객체의 위치를 빠르게 검색할 수 있습니다.

 

간단하게 예제를 통해서 알아봅시다.

 

 

equals() 메서드에서 구현했던 코드 그대로 가져와서 hashCode를 알아보려고 합니다. 내가 원하는 hashCode가 무엇인지, 오버라이딩 하여 값을 반환하려고 합니다.

 

 

System.identityHashCode()객체의 고유한 hashcode를 리턴하는 메서드입니다.

s1 , s2, s3에 동일한 정보를 주고 출력을 해보려 합니다.

 

 

s1과 s2를 비교했을 때 왜 false가 나올까?? 그건 바로 주소값이 다르기 때문입니다. s3와 s2는 값이 같기 때문에 논리적으로 같기 때문에 true가 반환됩니다. 또한 s1과 s2의 실제 인스턴스의 주소 값이 다르게 나오는 걸 확인할 수 있는데 hashCode() 메서드를 보면 동일한 코드 값이 반환되는 걸 확인할 수 있습니다.

 

즉 s1과 s2는 실제로는 다른 인스턴스지만, 논리적으로 같다는 것입니다.


마치며 

 

다음 포스팅에 JDK 기본 클래스 이어 나가겠습니다. 고생하셨습니다.

728x90

'[ JAVA ] > JAVA' 카테고리의 다른 글

[ Java ] Generic  (0) 2022.12.26
[ Java ] JDK 기본 클래스 2  (0) 2022.12.25
[ Java ] Interface 2  (2) 2022.12.21
[ Java ] Interface 1  (0) 2022.12.19
[ Java ] 추상 클래스  (0) 2022.12.15