Java에서 모든 클래스들은 Object 클래스를 상속받는다.
따라서 제작하는 클래스들은 Object 클래스가 가진 메소드를 override하여 사용할 수 있다.
대표적인 Object클래스의 메소드인 toString, equals, hashcode, clone 을 언제 어떻게 사용해야 할까?
어떤 객체를 문자열로 표현해야 할 때 사용한다.
String 클래스는 이미 toString을 Override하고 있어 String을 print 할때 toString 결과가 알아서 적용된다~
📜 코드
public class ObjectMethods {
private String methodName;
public ObjectMethods(String methodName) {
this.methodName = methodName;
}
@Override
public String toString() {
return "I love programmers " + methodName;
}
public static void main(String[] args) {
/***
* toString : 어떤 객체를 문자열로 표현해야할때.
*/
System.out.println("=======================");
System.out.println("[toString test]");
ObjectMethods method1 = new ObjectMethods("toString");
//오버라이드한 toString 의 결과 나타남
//만약 오버라이드 하지 않으면 -> 클래스 풀네임@해시코드로 출력됨.
System.out.println("METHOD IS : " + method1);
//String 클래스가 toString을 override 하고 있음
String justString = "toString";
System.out.println(justString);
}
}
=======================
[toString test]
METHOD IS : I love programmers toString
toString
객체들의 메모리 주소는 다르지만 논리적으로 둘이 같음을 표현해야 할 때
📜 코드
public class ObjectMethods {
private String methodName;
public ObjectMethods(String methodName) {
this.methodName = methodName;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ObjectMethods methods = (ObjectMethods) o;
return methodName != null ? methodName.equals(methods.methodName) : methods.methodName == null;
}
public static void main(String[] args) {
ObjectMethods method1 = new ObjectMethods("toString");
/***
* equals : 메모리 주소는 다르지만 논리적으로 같은것을 표현해야 할 때.
*/
System.out.println("=======================");
System.out.println("[equal test]");
//만약 오버라이드 하지 않으면 둘은 false
ObjectMethods method2 = new ObjectMethods("toString");
System.out.println("IS EQAUL? : " + method2.equals(method1));
}
}
=======================
[equal test]
IS EQAUL? : true
public class ObjectMethods {
private String methodName;
public ObjectMethods(String methodName) {
this.methodName = methodName;
}
@Override
public int hashCode() {
return methodName != null ? methodName.hashCode() : 0;
}
public static void main(String[] args) {
ObjectMethods method1 = new ObjectMethods("toString");
ObjectMethods method2 = new ObjectMethods("toString");
/***
* hashcode : 메모리 주소는 다르지만 객체가 같은 것을 표현해야 할 때.
*
* hashcode = jvm이 각 메모리 주소에 부여하는 코드(실제 메모리 주소와는 별개)
*
* 자바에서 두 객체의 동일성 : equals() == true 이고 hashcode 반환값이 동일해야함. (왜일까요?)
* equals와 hashcode는 함께 오버라이드
*/
System.out.println("=======================");
System.out.println("[hashcode test]");
//만약 오버라이드 하지 않으면 eqauls는 true 인데 해시코드는 다르다.
System.out.println("IS EQAUL? : " + method2.equals(method1));
System.out.println("method 1 hashcode : " + method1.hashCode());
System.out.println("method 2 hashcode : " + method2.hashCode());
//Integer 클래스가 hashCode를 override 하고 있음.
Integer int1 = 1200;
Integer int2 = 1200;
System.out.println("IS EQAUL? : " + int1.equals(int2));
System.out.println("method 1 hashcode : " + int1.hashCode());
System.out.println("method 2 hashcode : " + int2.hashCode());
}
}
=======================
[hashcode test]
IS EQAUL? : true
method 1 hashcode : -1776922004
method 2 hashcode : -1776922004
IS EQAUL? : true
method 1 hashcode : 1200
method 2 hashcode : 1200
개체의 복사본을 제작할 때 사용
개체의 private 정보가 공개되어 캡슐화가 깨질 수 있어서 Cloneable 인터페이스를 implements 해야한다.
📜 코드
public class ObjectMethods implements Cloneable {
private String methodName;
public ObjectMethods(String methodName) {
this.methodName = methodName;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
public static void main(String[] args) {
ObjectMethods method1 = new ObjectMethods("toString");
/***
* clone : 객체의 복사본을 제작
*
* private이 공개될 수 있어서 Cloneable 인터페이스를 적어 확장해줘야한다.
* 아니면 Execption이 발생한다.
*/
System.out.println("=======================");
System.out.println("[clone test]");
try {
ObjectMethods methodClone = (ObjectMethods) method1.clone();
System.out.println("CLONE : " + methodClone);
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
=======================
[clone test]
CLONE : I love programmers toString
toString이 String클래스의 메소드인 줄 알았던 바보는 안녕!
😃 각 메소드를 적재적소에 오버라이드해서 사용하기!