Notice
Recent Posts
Recent Comments
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

DeFacto-Standard IT

[Java] Object Class 본문

Java/Useful Classes

[Java] Object Class

defacto standard 2017. 10. 2. 12:33

java.lang Package는 import하지 않고도 사용할 수있다.


String, System 클래스 등을 포함하고 있다.


이 중 Object Class를 알아본다.



Object Class Methods

Method

설명

protected Object clone()

자신의 복사본을 반환

public boolean equals(Object obj)

자신과 obj가 같은 객체인지 알려준다.

같은 경우 true 반환

protected void finalize()

객체가 소멸될 때 GC에 의해 자동적으로 호출된다.

수행되어야 하는 추가적인 코드가 있는 경우에만 오버라이딩한다.

public Class getClass()

객체의 클래스 정보를 담고있는 Class인스턴스 반환

public int hashCode()

객체의 해시코드 반환

public String toString()

자신의 정보를 문자열로 반환

public void notify()

자신을 사용하려고 기다리는 쓰레드 하나를 깨움

public void notifyAll()

자신을 사용하려고 기다리는 쓰레드 모두를 깨움

public void wait()

다른 쓰레드가 notify()나 notifyAll()을 호출할 때까지 현재 쓰레드를 현재 지정된 시간(timeout, nanos)동안, 또는 무한히 기다리게 한다.

timeout은 1/1000초, nanos는 1/10의 9승 초 이다.

public void wait(long timeout)

public void wait(long timeout, int nanos)



equals() Method

매개변수로 객체를 받아 자신과 비교하여 결과 값을 boolean으로 리턴한다.

인스턴스 2개를 비교하면 무조건 false를 리턴하지만,

한 개의 인스턴스를 참조하는 참조변수 2개를 비교하면 같은 주소값을 가지기 때문에 true를 리턴한다.


결국, equals()는 두 개의 참조 변수가 같은 객체를 참조하는 있는지 알아보기 위해,

두 참조변수에 저장된 주소값이 같은지를 판단하는 기능을 가지고 있는 것이다.


만약, 주소값이 아니라 value값이 같은지를 확인하려면 이를 Overriding하면 된다.

대표적인 예로 String Class의 equals는 오버라이딩되어있기 때문에 '주소값'이 아닌 '문자열' 값 그대로를 비교한다.

참고로 StringBuffer는 오버라이딩 되어있지 않다.


Date, File, Wrapper 클래스 역시도 오버라이딩 되어있다.



hashCode() Method

해싱기법에 사용되는 해시함수를 구현한 것이다.

일반적인 해시코드는 같은 두 값이 존재하는게 가능하지만, hashCode()는 객체의 주소값을 이용하여 해싱하기 때문에 서로 다른 두 객체는 절대로 같은 값을 가질 수 없다.


프로그램 실행 마다 달라지지만 한 번 실행되고 객체가 생성된 이후에는 끝나거나 GC에 의해 정리되기 전까지는 같다.

클래스의 멤버변수 값으로 객체의 같고 다름을 판단해야하는 경우라면 hashCode()를 적절히 오버라이딩해야한다.

같은 객체라면 hashCode()를 호출했을 때 결과 값인 해시코드도 같아야 하기 때문이다.

만일 오버라이딩 하지 않는다면 Object 클래스에 정의된 대로 모든 객체가 서로 다른 해시코드값을 가진다.


그래서 equals()를 오버라이딩하면서 hashCode()도 같이 오버라이딩하는 것이일반적이다.




toString() Method

클래스 작성 시 toString메서드를 작성하지 않는다면, 클래스이름에 대한 출력과, 16진수 해시코드를 그대로 얻는다.

ClassName@xxxxxxxx  와 같이 출력된다. xxx는 위에서 설명한 hashCode()에 대한 값이 출력된다.

클래스에서 가지고 있는 필드명과 값을 출력하려면 오버라이딩을 해야하며 

주로 lombok이라는 라이브러리를 사용하면 대체로 의도한 대로 출력된다.



clone() Method

자신을 복제하여 새로운 인스턴스를 생성한다.

새로운 인스턴스를 만든다는 것은, 원래의 인스턴스는 보존되기 때문에 어떤 작업을 수행하고 나서 실패한다면 원래의 상태로 되돌리거나 변경되기 전의 값을 참조하는데 사용할 인스턴스를 확보할 수 있다는 의미이다.


Object Class의 clone()은 단순히 멤버변수의 값만을 복사한다. 따라서 배열이나 인스턴스가 멤버로 정의되어 있는 클래스의 인스턴스는 완전한 복제가 이루어지지 않는다.

배열의 경우, 복제된 인스턴스도 같은 배열의 주소를 가지기 때문에 복제된 작업이 원래 인스턴스에도 영향을 미친다.

이런 경우에는 clone()을 오버라이딩하여 새로운 배열을 생성하고 여기에 기존 배열의 내용을 복사하도록 한다.


clone()을 통한 복제를 수행하려면 Cloneable Interface를 구현한 클래스의 인스턴스여야 한다.

인스턴스 복제는 데이터를 복사하는 것이기 때문에 데이터 보호를 위해서 이다.


반환하는 객체의 타입은 원본과 같으므로 캐스팅할 필요는 없다.


배열을 복사하는 경우, System.arraycopy()를 사용해서 주로 복사를 한다. 하지만 메서드 자체의 인자가 많아서 복잡하다.

아래 2개의 코드는 같은 역할을 하는 코드이다.



Vector, ArrayList, LinkedList, HashSet, TreeSet, HashMap, TreeMap, Calendar, Date와 같은 클래스들도 역시 복제가 가능하다.
clone()으로 복제가 가능한 클래스인지 확인하려면 Java API에서 Cloneable을 구혔하였는지 확인하면 된다.


'Java > Useful Classes' 카테고리의 다른 글

[Java] Wrapper Class  (0) 2017.10.02
[Java] Math Class  (0) 2017.10.02
[Java] StringBuffer Class  (0) 2017.10.02
[Java] String Class  (0) 2017.10.02
Comments