Be ready to study forever - 개발자 꿈나무
[JAVA 문법] java.lang패키지 - Object클래스 본문
java.lang 패키지
자바 프로그래밍에 기본이 되는 클래스를 포함하고 있기 때문에 따로 import 과정없이 바로 사용될 수 있다. String, System클래스가 java.lang패키지에 속하기 때문에 따로 import없이 할 수 있었던 이유이다.
1. Object 클래스
Object클래스는 모든 클래스의 조상이므로 모든 Object클래스의 메서드를 기본적으로 상속받고 있다. 따라서 toString(), hashCode(), equals() 와 같은 메서드들은 모두 사용 가능하며 때에 따라서는 오버라이드 해서 사용한다.
1.1. equals(Object obj) 메서드
매개변수로 객체의 참조변수를 받아서 비교하여 boolean으로 같으면 true 다르면 false로 반환한다.
equals() 클래스의 인스턴스를 참조하는 주소 값을
교하기 때문에 같은 클래스나 클래스의 프로퍼티 값이 같더라도 참조하는 주소 값이 다르므로 false가 나오게 된다.
* ==연산자로 비교시에도 기본형타입은 값을 저장함으로 true로 반환하지만 참조형타입은 주소값을 저장함으로 이또한 ==로 연산시에는 false 값을 반환한다.
예제코드
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는 다릅니다.");
}
} // main
}
class Value {
int value;
Value(int value) {
this.value = value;
}
}
equals는 보통은 instanceof 연산을 이용하여 같은 클래스이면 같은 참조변수 값과 상관없이 true를 반환하게 끔 오버라이드해서 사용한다.
1.2.hashCode() 메서드
해시함수를 구현한 메서드로서, 값이 저장된 위치를 알려주는 해시코드를 반환한다. hashCode()는 참조변수의 주소값으로 해시코드를 만들기 때문에 중복되지 않지만 64ibt JVM에서는 8byte의 주소로 4byte의 해시코드를 만들기 때문에 중복 가능성이 있다.
String클래스에서는 문자열의 내용이 같으면 같은 해시코드 값을 반환하도록 hashCode()를 오버라이드 하였기 때문에 같은 문자열이면 같은 해시코드 값을 가진다. 반면 String클래스 내에서도 객체의 주소값으로 해시코드를 만드는 방법이 있는데 이것은 System.identityHashCode(Object str)이다.
1.3. toString() 메서드
인스턴스에 대한 정보를 문자열로 제공할 목적으로 정의된 메서드이다.
뒤에 @hashCode()의 값이 붙이 때문에 보통은 오버라이드해서 사용한다.
* String 클래스와 Date클래스는 기본적으로 자신이 가지고 있는 문자열을 반환하도록 오버라이드되어있아서 따로 오버라이드해서 사용하지 않아도 @hashCode값이 나오지 않는다.
1.4. clone()메서드
clone() 메서드는 자신을 복제하여 새로운 인스턴스를 생성하는 일을한다. clone()으로 새로운 인스턴스를 생성하여 작업하면 원래의 값이 보존되 리스크를 줄일 수 있다.
Object클래스에 정의된 clone() 메서드는 단순히 인스턴스 변수의 값만 복사하기 때문에 참조형 타입일 경우 같은 주소 값을 복사(얕은 복사)하게 되므로 따로 오버라이드해서 사용하는 것이 좋다.
얕은 복사 – 단순히 객체에 저장된 값만 복사하므로 참조형 타입은 주소를 복사하게되어 원본과 복사본이 동일한 같은 객체를 공유하게 된다. 이를 얕은 복사라고 한다.
깊은 복사 – 참조하고 있는 객체까지 복사하여 원본과 복사본이 서로 다른 객체를 참조하는 것을 깊은 복사라고 한다. 이경우는 서로 영향을 주지 못한다.
1.5. getClass() 메서드
Class객체는 클래스의 모든 정보를 담고있으며 클래스 당 1개만 존재한다. ClassLoader에 의해서 자동으로 생성된다.
Class객체를 얻는 방법
- Class cObj = new Card().getClass(); //생성된 객체로부터 얻는방법
- Class cObj = Card.class; //클래스 리터럴(*.class)로부터 얻는 방법
- Class cObj = Class.forName(“Card”); //클래스 이름으로부터 얻는 방법
'Programming > JAVA' 카테고리의 다른 글
[JAVA 문법]Collection Framework - Lists (0) | 2020.07.28 |
---|---|
[JAVA 문법] java.lang패키지 - Math클래스, Wrapper클래스 (0) | 2020.07.25 |
[JAVA 문법] java.lang패키지 - StringBuffer클래스 와 StringBuilder클래스 (0) | 2020.07.25 |
[JAVA 문법] java.lang패키지 - String 클래스 (0) | 2020.07.25 |
[JAVA문법] 예외처리 (0) | 2020.07.24 |