일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- JAVA11
- input
- 수학
- heroku
- 자바 thread 실행 순서 제어
- 카데인 알고리즘
- 사칙연산
- hash table
- 자바입력
- R
- Kadane's Algorithm
- 자바 스레드 실행 순서 제어
- scanner
- Easy
- SpringBoot 2
- array
- Today
- Total
DeFacto-Standard IT
[Java] Object Class 본문
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개의 코드는 같은 역할을 하는 코드이다.
'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 |