쉽지않은 블로그
[JAVA] Object 클래스 본문
Object Class
object class는 모든 클래스들의 최고 조상이다
그래서 다음과 같이 참조형 타입의 변수라면 어떤 것이든지 간에
객체지향의 다형성에 의해서 참조형 변수로 보관할수 있다
이런 특성을 이용하여 어느클래스의 타입이든 Object 배열에 보관하는 것이 가능하다.
(역은 성립하지 않는다)
Object a = new A(); //가능
A b = (A) new Object(); // java.lang.ClassCastException : class java.lang.Object cannot be cast to class A
Method
Object 의 메서드를 보면 다음과 같은 것들이 있다
하지만 여기서 자주 보게 되는 것은 다음 세 가지 메서드들이다.
public String toString() | object 의 정보를 string 으로 표현하여 보여준다 기본값으로는 getClass().getName() + "@" + Integer.toHexString(hashCode()) 가 설정되있다. |
public int hashCode() | object 의 해시코드 값을 반환한다. |
public boolean equals(Object obj) | 서로다른 두 객체의 값이 같은지를 boolean 타입으로 반환한다. |
1.toString 은 overriding 해주지 않을 경우 기본으로 클래스 타입과 해시 코드값을 반환하지만
사용자가 정의 한대로 출력을 가능하게 해 준다.
public class A {
public int va1;
public int val2;
public static void main(String[] args) {
A a = new A();
System.out.println(a.toString()); // A@123772c4 를 출력한다.
}
}
public class A {
public int val1;
public int val2;
public static void main(String[] args) {
A a = new A();
a.val1 = 10;
a.val2 = 20;
System.out.println(a.toString()); //val1 : 10 val2 : 20 을 출력
}
public String toString() {
return "val1 : "+val1 + " val2 : "+val2;
}
2.hashCode 는 참조형 변수가 가리키는 메모리 주소를 반환한다
밑의 예시를 보면 이해할 수 있다.
public class A {
public int va1;
public int val2;
public static void main(String[] args) {
A a = new A();
Object b = new A();
Object c = b;
System.out.println(a.hashCode());
System.out.println(b.hashCode());
System.out.println(c.hashCode());
}
}
3.equals 는 두 객체가 같은 객체인지 비교할 때 사용이 된다.
여기서 "두 객체가 같다"라는 것에 대한 정의를 내려야 한다.
즉 내가 정의하고자 하는 고유식별자가 무엇인지를 생각하여야 한다
1. 같은 주소를 갖는 것을 같다고 표현할지
2. 아니면 내부 값이 같은 상황이면 주소가 달라도 같다고 정의해줄 것인지
예를 들어 hashMap이 hashSet과 같은 자료구조에서는 고유식별자가
클래스의 주소보다는 클래스가 가지고 있는 정보 자체가 고유 식별자가 될 것이다
기본적으로는 equals 가
* @param obj the reference object with which to compare.
* @return {@code true} if this object is the same as the obj
* argument; {@code false} otherwise.
* @see #hashCode()
* @see java.util.HashMap
*/
public boolean equals(Object obj) {
return (this == obj);
}
1번의 방식으로 표현되어있다.
그래서 다음과 같이 사용자 정의 클래스를 함부로 비교하려고 하면 false 가 나온다.
public class A {
public int val1;
public int val2;
public static void main(String[] args) {
A a = new A();
a.val1 = 10;
a.val2 = 20;
A c = new A();
c.val1 = 10;
c.val2 = 20;
System.out.println(a.equals(c)); //false
}
}
우리가 Integer 나 String 등 은 jdk 자체 overriding 이 되어있기 때문에 그대로 사용할 수 있는 것이다.
그러면 우리가 클래스를 정의하고 주소가 달라도 같은 클래스이고 내부 값이 같을 때 "같다"라고 표현하기 위해서는
클래스가 같은지 비교해준 후 값이 같은지를 비교하는 코드를 작성해주면 된다.
public class A {
public int val1;
public int val2;
public static void main(String[] args) {
A a = new A();
a.val1 = 10;
a.val2 = 20;
A c = new A();
c.val1 = 10;
c.val2 = 20;
System.out.println(a.equals(c)); //true 출력
}
@Override
public boolean equals (Object obj) {
if(obj instanceof A) {
A tmp = (A) obj;
return val1 ==tmp.val1 && val2 ==tmp.val2;
}
return false;
}
}
'프로그래밍언어 > JAVA' 카테고리의 다른 글
[JAVA] 자바의 String (0) | 2021.04.13 |
---|---|
[JAVA] Wrapper class 래퍼클래스란? (2) | 2021.04.13 |
[JAVA] 제네릭 이란? (0) | 2021.03.31 |
[JAVA] 컬렉션 이란? (0) | 2021.03.31 |