java.lang 패키지
자바 프로그래밍에서 가장 기본이 되는 클래스들을 포함하고 있다. 그렇기 때문에 import문 없이도 사용할 수 있다.
그동안 String클래스나 System클래스를 import 없이 사용할 수 있었던 것도 이러한 이유이다.
Object 클래스
equals(Object obj)
매개변수로 객체의 참조변수를 받아서 비교하여 그 결과를 boolean 값으로 알려주는 역할을 한다.
public boolean equals(Object obj) {
return (this==obj);
}
import com.sun.jdi.Value;
public class EqualsEx1 {
public static void main(String[] args) {
Value v1 = new Value(10);
Value v2 = new Value(10);
if (v1.equals(v2))
System.out.println("v1과 v2는 같습니다.");
else
System.out.println("v1과 v2는 다릅니다.");
v2 = v1;
if (v1.equals(v2))
System.out.println("v1과 v2는 같습니다.");
else
System.out.println("v1과 v2는 다릅니다.");
}
}
class Value {
int value;
Value(int value) {
this.value = value;
}
}
/* 결과
v1과 v2는 다릅니다.
v1과 v2는 같습니다.
*/
equals 메서드는 주소값으로 비교하기 때문에 값이 둘 다 10일지라도 false를 반환한다.
v2 = v1; 을 수행한 후에는 참조변수 v2는 v1이 참조하고 있는 인스턴스의 주소값이 저장되므로 서로 같은 주소값이 저장된다. 그래서 true를 반환한다.
hashCode()
해싱기법에 사용되는 '해시함수'를 구현한 것이다. 해싱은 데이터 관리기법 중의 하나, 다량의 데이터를 저장하고 검색하는 데 유용하다.
해시함수는 찾고자하는 값을 입력하면, 그 값이 저장된 위치를 알려주는 해시코드를 반환한다.
class HashCodeEx1 {
public static void main(String[] args) {
String str1 = new String("abc");
String str2 = new String("abc");
System.out.println(str1.hashCode());
System.out.println(str2.hashCode());
System.out.println(System.identityHashCode(str1));
System.out.println(System.identityHashCode(str2));
}
}
/* 결과
96354
96354
27134973
1284693
*/
String 클래스는 문자열의 내용이 같으면, 동일한 해시코드를 반환하도록 hashCode 메서드가 오버라이딩 되어있기 때문에 동일한 해시코드 값을 얻는다. 반면에 System.identityHashCode(Object x)는 주소값으로 해시코드를 생성하기 때문에 모든 객체에 대해 항상 다른 해시코드 값을 반환한다.
그래서 str1과 str2가 해시코드는 같지만 서로 다른 객체라는 것을 알 수 있다.
toString()
인스턴스에 대한 정보를 문자열로 제공할 목적으로 정의한 것이다.
인스턴스의 정보를 제공한다는 것은 대부분의 경우 인스턴스 변수에 저장된 값들을 문자열로 표현한다는 뜻이다.
public String to String() {
return getClass().getName()+"@"+Integer.toHexString(hashCode());
}
클래스를 사용할 때 toString()을 오버라이딩하지 않는다면, 위와 같은 내용이 그대로 사용될 것이다.
즉, toString()을 호출하면 클래스이름에 16진수의 해시코드를 얻게 될 것이다.
래퍼(Wrapper) 클래스
객체지향 개념에서 모든 것은 객체로 다루어져야 한다. 그러나 자바에서는 8개의 기본형을 객체로 다루지 않는다.
int 와 char를 제외한 나머지는 자료형 이름의 첫 글자를 대문자로 한 것이 각 래퍼 클래스의 이름이다.
| 기본형 | 래퍼클래스 | 생성자 | 예 |
| boolean | Boolean | Boolean (boolean value) Boolean (String s) |
Boolean b = new Boolean (true); Boolean b2 = new Boolean ("true"); |
| char | Character | Character (char value) | Character c = new Character ('a'); |
| byte | Byte | Byte (byte value) Byte (String s) |
Byte b = new Byte (10); Byte b2 = new Byte ("10"); |
| short | Short | Short (short value) Short (string s) |
Short s = new Short (10); Short s2 = new Short ("10"); |
| int | Integer | Integer (int value) Integer (String s) |
Integer i = new Integer (100); Integer i2 = new Integer ("100"); |
| long | Long | Long (long value) Long (String s) |
Long l = new Long (100); Long l2 = new Long ("100"); |
| float | Float | Float (double value) Float (float value) Float (String s) |
Float f = new Float (1.0); Float f2 = new Float (1.0f); Float f3 = new Float ("1.0f"); |
| double | Double | Double (double value) Double (String s) |
Double d = new Double(1.0); Double d2 = new Double ("1.0"); |
class WrapperEx1 {
public static void main(String[] args) {
Integer i = new Integer(100);
Integer i2 = new Integer(100);
System.out.println(i == i2); // 주소 비교
System.out.println(i.equals(i2)); // 값 비교
}
}
/* 결과
false
true
*/'자바 > Java의 정석' 카테고리의 다른 글
| [Chapter 11] 컬렉션 프레임웍 (1) | 2024.11.26 |
|---|---|
| [Chapter 10] 날짜와 시간 & 형식화 (0) | 2024.11.25 |
| [Chapter 08] 예외처리 (0) | 2024.11.23 |
| [Chapter 07] 객체지향 프로그래밍 II (2) | 2024.11.19 |
| [Chapter 06] 객체지향 프로그래밍 I (1) | 2024.11.19 |