JAVA_java.lang패키지 , 유용한 클래스 정리 (자바의정석 9장)
java.lang 패키지 : 자바프로그래밍에 가장 기본이 되는 클래스들을 포함.
Object 클래스
모든 클래스의 최고 조상. 멤버변수는 없고 오직 11개의 메서드를 갖고 있음.
멤버변수를 갖고 있지 않지만, 메서드들은 인스턴스 메서드이다.
그 이유는 Object를 상속받는 자손들은 인스턴스 변수를 사용할 수도 있고 그렇지 않을 수도 있기 때문에 메서드에 인스턴스 변수 지원을 해야한다
Object 클래스의 주요 메서드
equals(Object obj)
매개변수로 객체의 참조변수를 받아 비교하여 그 결과를 boolean값으로 알려 주는 역할을 한다.
public boolean equals (Object obj){
return (this==obj);
}
equals는 주소값을 비교하기 때문에 iv가 가진 값이 같더라도 주소값이 다르면 false를 출력하게 된다.
주소값이 아닌 iv값을 비교하려면 equals를 오버라이딩 하면 된다.
public boolean equals (Object obj) {
if(obj != null && obj instanceof Person) {
return id == ( (Person)obj).id;
} else {
return false;
}
}
hashCode()
해싱기법에 사용되는 '해시함수'를 구현한 것
해싱 : 데이터관리기법 중의 하나. 다량의 데이터를 저장하고 검색하는데 유용.
찾고자하는 값을 입력하면 그 값이 저장된 위치를 알려주는 해시코드를 반환한다. ( 객체 주소를 반환 )
32bit JVM에서는 서로 다른 두 객체는 같은 해시코드를 가질 수 없었지만, 64bit JVM에서는 8 byte 주소값으로 해시코드를 만들기 때문에 해시코드가 중복될 수 있다.
toString()
to String 이라는 이름답게 객체에 대한 정보를 문자열로 제공할 목적으로 사용된다.
Object 클래스에 정의된 toString()
public String toString() {
return getClass().getName()+"@"+Integer.toHexString(hashCode());
}
클래스를 작성할 때 toString()을 오버라이딩 하지 않으면, 클래스이름과 16진수의 해시코드를 얻게된다.
String
String클래스는 문자열을 저장하고 문자열을 다루는데 필요한 메서드를 함께 제공.
변경 불가능한 ( immutable ) 클래스 = 읽기만 가능. Read Only
String 클래스는 문자열을 저장하기 위해서 문자형 배열 참조변수 value를 인스턴스 변수로 정의해놓고 있다.
인스턴스 생성 시 생성자의 매개변수로 입력받는 문자열은 이 인스턴스 변수(Value)에 문자형 배열(char[ ])로 저장되는 것
문자열을 만들 때, 문자열 리터럴을 지정하는 방법, String 클래스의 생성자를 사용해서 만드는 방법 두 가지가 있다
String 클래스의 생성자를 이용한 경우에는 new 연산자에 의해서 메모리할당이 이루어지기 때문에 String 인스턴스 생성
문자열 리터럴은 이미 존재하는 것을 재사용 하는 방법
String str1 = "abc";
String str2 = "abc";
String str3 = new String("abc");
String str4 = new String("abc");
equals()를 사용했을 때는 두 문자열의 내용("abc")을 비교하기 때문에 두 경우 모두 true 결과를 얻지만, String 인스턴스의 주소를 등가비교연산자 '=='로 비교했을 때는 결과가 다르다
빈 문자열(empty string)
길이가 0인 배열.
String s =""; 참조변수 s가 참조하고 있는 String 인스턴스는 내부에 'new char[0]' 과 같이 길이가 0인 char형 배열을 저장하고 있다.
clone()
clone 메서드는 자신을 복제하여 새로운 인스턴스를 생성하는 일을 한다.
clone()은 단순히 인스턴스 변수의 값만 복사하기 때문에 참조타입의 인스턴스 변수가 있는 클래스는 완전한 인스턴스 복제가 이루어지지 않는다.
clone()을 사용하려면, 먼저 복제할 클래스가 Cloneable 인터페이스를 구현해야하고, clone()을 오버라이딩 하면서 접근 제어자를 protected에서 public으로 변경한다. 그래야만 상속관계가 없는 다른 클래스에서 호출할 수 있다.
공변 반환타입 (covariant return type)
이 기능은 오버라이딩할 때, 조상 메서드의 반환타입을 자손 클래스의 타입으로 변경을 허용하는 것.
공변 반환타입을 사용하면, 조상의 타입이 아닌, 실제로 반환되는 자손 객체의 타입으로 반환할 수 있어 형변환 하는 번거로움이 줄어드는 장점을 갖고있다.
얕은 복사와 깊은 복사
clone() 단순히 객체에 저장된 값을 그대로 복제만 하고, 객체가 참조하고 있는 객체까지 복제하지는 않는다.
원본과 복제본이 같은 객체를 공유하므로 완전한 복제로 보기에는 어렵다. 이러한 경우를 얕은 복사 라고 한다.
얕은 복사는 원본을 변경하면 복사본도 영향을 받는다
원본이 참고하고 있는 객체까지 복제하는 것을 깊은 복사.
깊은 복사에서는 원본과 복사본이 서로 다른 객체를 참조하기 때문에 원본의 변경이 복사본에 영향을 미치지 않음.
얕은 복사 : 원본을 변경하면 복사본도 영향을 받음 / 읽기만 할거면 얕은 복사 / 깊은 복사보다 빠르다
깊은 복사 : 원본이 참조하는 객체까지 복사하는 것을 말함 / 서로 다른 객체를 참조해서 원본의 변경이 복사본 영향 X
읽기 쓰기 둘 다 할꺼면 깊은 복사
getClass()
getClass 메서드는 자신이 속한 클래스의 Class객체를 반환하는 메서드.
파일 형태로 저장되어 있는 클래스를 읽어서 Class 클래스에 정의된 형식으로 변환하는 것.
클래스 파일을 읽어서 사용하기 편한 형태로 저장해 놓은 것이 클래스 객체.
Class 객체를 얻는 방법
Class c0bj = new Card().getClass(); // 생성된 객체로 부터 얻는 방법
Class c0bj = Card.class; // 클래스 리터럴(*.class)로 부터 얻는 방법
Class c0bj = Class.forName("Card"); // 클래스 이름으로 부터 얻는 방법
Math클래스
기본적인 수학계산에 유용한 메서드로 구성
대표적인 메서드는 임의의 수를 얻을 수 있는 random() / 반올림에 사용되는 round()