[java] java.lang 패키지

java.lang 패키지

- 가장 기본이 되는 클래스들을 포함하고 있다. 따라서 import문 없이도 사용할 수 있도록 되어 있다.

[참고] 자세한 설명은 http://docs.oracle.com/javase/7/docs/api/ 참고. 본문에서는 강의때 다루었던 부분들의 이론에 대해서 집중, 정리한다.

 

Object 클래스

- 모든 클래스의 최고 조상이기 때문에 Object클래스의 멤버들은 모든 클래스에서 바로 사용 가능하다.

+ equals메서드

- 매개변수로 객체의 참조변수를 받아서 비교하여 그 결과를 boolean값으로 알려 주는 역할을 한다.

----------------------------------

public boolean equals(Object obj){

return (this == obj);

}

----------------------------------

- 두 객체의 같고 다름을 참조변수의 값으로 판단한다. 그렇기 때문에 서로 다른 두 객체를 equals메서드로 비교하면 항상 false를 결과로 얻게 된다.

[참고] 객체 생성 시, 메모리의 비어있는 공간을 찾아 생성하므로 서로 다른 두 개의 객체가 같은 주소를 갖는 일은 있을 수 없다. 하지만, 두 개 이상의 참조변수가 같은 주소값을 갖는 것(한 객체를 참조하는 것)은 가능하다.

- equals메서드를 사용해서 value값을 비교하도록 하고 싶으면 오버라이딩하여 사용하면 된다.

---------------------------------------------------------

equals 오버라이딩 예제

public class Test {

long id;

public boolean equals(Object obj){

if(obj != null && obj instanceof Test)

return id == ((Test)obj).id;  // 주소값이 아닌 멤버변수의 값을 비교하여 결과를 반환한다.

else

return false;

}

}

---------------------------------------------------------

[참고] String클래스 역시 Object클래스의 equals메서드를 오버라이딩하여 문자열 값을 비교한다. 그 외에도 Date, File, wrapper클래스등 역시 오버라이딩되어 있다.

+ hashCode메서드

- 해싱(hasing)기법에 사용되는 해시함수를 구현한 것이다. 찾고자하는 값을 입력하면, 그 값이 저장된 위치를 알려주는 해시코드를 반환한다.

- 일반적으로 해시코드가 같은 두 객체가 존재하는 것이 가능하지만, Object클래스에 정의된 hashCode메서드는 객체의 주소값을 이용해서 해시코드를 만들어 반환하기 때문에 한번의 실행에서 서로 다른 두 객체는 결코 같은 해시코드를 가질 수 없다.

- 클래스의 멤버변수 값으로 객체의 같고 다름을 판다해야하는 경우라면 hashCode메서드를 적절히 오버라이딩해야 한다. 만일 오버라이딩하지 않는다면 Object클래스에 정의된 대로 모든 객체가 서로 다른 해시코드값을 가질 것이다.

[참고] 해싱기법을 사용하는 HashMap이나 HashSet과 같은 클래스에 저장할 객체라면 반드시 HashCode메서드를 오버라이딩해야 한다.

------------------------------------------------------

String클래스의 hashCode 예제

public class _03_HashCode {

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

1968829424

1688096192

------------------------------------------------------

- String클래스는 문자열의 내용이 같으면 동일한 해시코드를 반환하도록 hashCode메서드를 오버라이딩하였기 때문에, str1과 str2에 대해 항상 동일한 해시코드값을 얻는다.

identityHashCode(Object)는 Object클래스의 hashCode메서드처럼 객체의 주소값으로 해시코드를 생성하기 때문에 모든 객체에 대해 항상 다른 해시코드값을 반환할 것을 보장한다.

- 위의 예제가 말하고자 하는 것은 str1과 str2가 해시코드는 같지만 서로 다른 객체라는 것을 보여주는 예제이다.

+toString메서드

[참고] 0905 강의필기 (이론도 여기에 정리하였다.)