1. 자바 API 도큐먼트
여태 사용했던 String, System과 같은 클래스들 모두 자바의 API 클래스들 이었다.
API 도큐먼트란 API를 쉽게 찾아 사용할 수 있도록 문서화 한 것이다.
API들은 <JDK가 설치된 경로>/jre/lib/rt.jar 압축 파일에 저장되어 있다.
자바에서 공통적으로 많이 사용되는 패키지들은 java.lang, java.util, java.time 패키지 등이 있다.
2. java.lang 패키지
java.lang이라는 패키지 안에는 자바 프로그램의 여러 기본 클래스들이 있는 패키지이다.
이 패키지는 모든 클래스들이 import 문 없이 사용 가능한데 자동으로 java.lang은 import 되기 때문이다 .
※ java.lang의 주요 클래스들 요약 정리
Object 클래스 : 자바 클래스의 최 상위 클래스이다.
System 클래스 : 표준 입출력 장치 사용 및 JVM 종료, 가비지 컬렉터 실행 요청 시 사용 된다.
Class 클래스 : 클래스를 메모리로 로딩할 때 사용되는 클래스이다
String 클래스 : 문자열 저장 클래스
StringBuffer, StringBuilder 클래스 : 문자열을 저장하고 내부 문자열을 조작할 때 사용
Math 클래스 : 수학 함수들이 저장된 클래스
Warpper 클래스 : 기본 타입의 데이터를 갖는 객체를 만들 때 사용된다.
3. Object 클래스
java.lang 패키지에 어떤 클래스들이 있는지 위에서 소개헀으며 Object부터 정리한다.
java.lang.Object 클래스는 모든 자바 클래스의 최 상위 클래스이다.
예를 들어 사용자가 클래스를 선언했다하면 해당 클래스는 extends Object가 자동으로 상속되게 된다.
따라서 자바에서 모든 클래스들은 Object의 메소드를 사용할 수 있고 이 메소들르 Override하여 자신(클래스)의 입맛에 맞게 사용할 수 있다.
1) equals 메소드
public boolean equals(Obejct obj){ ... }
Object 클래스의 equals메소드가 있다.
Object의 equals 메소드는 두 객체의 동등 비교를 수행한다.
예를 들어
Object o1 = new Object();
Object o2 = new Object();
boolean result = obj1.equals(obj2);
위 코드는 obj1 == obj2이 코드와 같은 의미를 지닌다. (따라서 false가 나온다.)
equals 메소드는 각 클래스에서 "논리적" 비교를 수행하기 위해 재정의되어 사용된다.
예를 들어 Member라는 클래스의 id 필드 값이 같으면 두 객체는 논리적으로 동등하다라고 할 수 있는데
이러한 논리적 동등 수행을 equlals메소르를 Member 클래스에서 재정의함으로써 구현할 수 있다.
아래 예시를 보면
public class Mainclass {
public static void main(String ar[]) {
Member o1 = new Member("blue");
Member o2 = new Member("blue");
Member o3 = new Member("red");
if(o1.equals(o2)) {
System.out.println("o1과 o2는 동등");
}
else {
System.out.println("o1과 o2는 다름");
}
if(o1.equals(o3)) {
System.out.println("o1과 o3는 동등");
}
else {
System.out.println("o1과 o3는 다름");
}
}
}
public class Member {
public String id;
public Member(String id) {
this.id = id;
}
@Override
public boolean equals(Object obj) {
if(obj istanceof Member) {
Member member = (Member) obj;
if(id.equals(member.id)) {
return true;
}
}
return false;
}
}
Member라는 클래스에서 Obejct 클래스의 메소드인 equals 메소드를 재정의한 것이다.
Member 클래스 객체의 id 값이 동일하다면 두 객체는 논리적으로 동등하도록 equals 메소드를 재정의한 것이다.
※ x instanceof y
x에는 객체가 y에는 데이터 타입이 들어간다.
만약 x라는 객체의 데이터 타입이 y라면 true를 반환한다.
※ String 클래스의 equals 메소드
String 클래스에서는 내부적으로 equlas 메소드를 역시 재정의하며 사용하는데 String 클래스에서는 두 문자열이 동일하다면 equals 메소드는 true를 반환하도록 재정의 되어 있다.
따라서 String s1 = "hello"; String s2 = "hello"; 이렇게 두 문자열이 있을 때 s1.equals(s2)는 true를 반환한다.
2) hashCode() 메소드
public int hashCode() {...}
메소드의 형태는 위와 같다. 해시코드란 객체의 메모리 번지에 일대일 대응하는 정수 값을 말한다.
해시코드는 컬렉션프레임워크에서 HashSet, HashMap, 등등의 클래스에 저장되는 요소(객체)의 논리적 동등을 비교할 때 해시코드를 사용한다.
두 객체가 같음을 비교할 때 해시코드가 같은지를 먼저 비교하고 같다면 equals 매소드가 같은지를 비교해 같다면 두 객체는 같은 객체라고 판단한다.
hashcode는 재정의하지 않으면 메모리 번지를 참조해 정수값을 만들기 때문에 다른 해시코드 값을 리턴한다 그래서 재정의를 해서 Key클래스에서는 필드 값이 같으면 같은 해시코드를 리턴하게 재정의하면 된다.
...
int number;
@Override
public int hashCode(){
return number;
}
클래스에서 hashCode 메소드를 재정의할 떄 주로 위와 같이 클래스가 가진 필드를 해시코드로 지정하는 것이 일반적이다. hashCode가 어떻게 사용되는지 아래 예시를 보면
public class Mainclass {
public static void main(String ar[]) {
HahsMap<Key, String> hm = new HahsMap<Key, String>();
hm.put(new Key(1), "홍길동");
String val = hm.get(new Key(1));
System.out.println(val); //결과는 "홍길동"이 나온다.
}
}
class key {
public int num;
public Key(int num){
this.num = num;
}
@Override
public int hashCode() {
return num;
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Key) {
Key k = (Key) obj;
if(this.num == k.num) { return true;}
}
return false;
}
}
위 예시를 보면 HashMap에는 Key와 value 형태로 요소를 저장하는 컬렉션 프레임워크인데 Key라는 객체는 hashCode와 equals 두 메소드를 차례로 실행하며 두 Key 객체가 논리적으로 동등한지를 판단한다.
HashMap 에는 Key(1) 라는 키의 값으로 "홍길동"을 저장하였다.
new Key(1)로 새로운 Key를 생성하였다지만 HashMap (컬렉션 프레임워크) 내부에서 key를 찾을 떄 hashCode 메소드와 equals 두 메소드를 실행 시켜 두 메소드 모두 true라면 동일한 key로 간주한다.
따라서 Key(1)이라는 객체는 HashMap 내부에서는 하나의 동일한 키로 간주되면 그 value로 "홍길동"을 가진다.
3) toString() 메소드
public String toString() { ... }
Object 의 toString 메소드는 각 클래스에서 재정의하여 클래스의 정보를 제공하는 목적으로 사용된다.
예를 들어 Date 클래스의 toString 메소드는 현재 시스템의 날짜와 시간 정보를 제공하도록 재정의 되어 사용된다.
또한 String 의 toString 메소드는 저장된 문자열이 반환되도록 재정의되어 있다.
'Java' 카테고리의 다른 글
14. 제네릭 (0) | 2022.03.30 |
---|---|
13. 컬렉션 프레임워크 (0) | 2022.03.30 |
11. 자바 예외 처리(실행 예외, 예외 처리 코드, 사용자 정의 예외) (0) | 2022.02.16 |
10. 중첩 클래스 (0) | 2022.02.06 |
9. 인터페이스 (0) | 2022.02.06 |