Object 클래스 toSting() 오버라이드
Point.java
package com.javaex.api.objectclass.v1;
// 자바 최상위 클래스는 Object
public class Point {
private int x;
private int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public String toString() {
// 객체 문자열 포맷을 반환
return String.format("Point(%d, %d)",x,y);
}
}
LangClassTest.java
package com.javaex.api.objectclass.v1;
public class LangClassTest {
public static void main(String[] args) {
Point p = new Point(10,10);
//Object의 메서드를 기본 상속
System.out.println(p.getClass().getName()); // 클래스 정보 : com.javaex.api.objectclass.v1.Point
System.out.println(p.hashCode()); // 객체 식별자 : 1521118594
System.out.println(Integer.toHexString(p.hashCode())); // 5aaa6d82
System.out.println(p); // 클래스명@해시코드 16진수 값 : com.javaex.api.objectclass.v1.Point@5aaa6d82
System.out.println(p.toString());
}
}
결과
com.javaex.api.objectclass.v1.Point
1521118594
5aaa6d82
Point(10, 10)
Point(10, 10)
equals( )
package com.javaex.api.objectclass.v2;
public class LangClassTest {
public static void main(String[] args) {
Point p1 = new Point(10,10);
Point p2 = new Point(10,10);
System.out.println("p1 == p2 ? " + (p1 == p2));
System.out.println("p1.equals(p2) ? " + p1.equals(p2));
}
}
결과
p1 == p2 ? false
p1.equals(p2) ? false
equals 오버라이딩
Point.java
package com.javaex.api.objectclass.v2;
// 자바 최상위 클래스는 Object
public class Point {
private int x;
private int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public String toString() {
// 객체 문자열 포맷을 반환
return String.format("Point(%d, %d)",x,y);
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Point) {
Point other = (Point)obj; // 변환
return x == other.x && y == other.y;
}
return super.equals(obj);
}
}
결과
p1 == p2 ? false
p1.equals(p2) ? true
객체 단순 복제
LangClassTest.java
package com.javaex.api.objectclass.v3;
public class LangClassTest {
public static void main(String[] args) {
Point p1 = new Point(10,10);
System.out.println("p1 =" + p1);
Point p2 = p1.getClone(); // 복제
System.out.println("p2 =" + p2);
System.out.println("p1 == p2 ? "+ (p1 == p2));
p1.setX(100);
p1.setY(200);
System.out.println("p1 =" + p1);
System.out.println("p2 =" + p2);
}
}
Point.java
package com.javaex.api.objectclass.v3;
// v3. 얕은 ㅗㅂ갓
// 객체 필드데이터를 단순 복제
// Cloneable 인터ㅔ이스 구현
public class Point implements Cloneable{
public Point getClone() {
//복제본
Point clone = null;
try {
clone = (Point) clone();
}catch(CloneNotSupportedException e) {
e.printStackTrace();
}
return clone;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
private int x;
private int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public String toString() {
// 객체 문자열 포맷을 반환
return String.format("Point(%d, %d)",x,y);
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Point) {
Point other = (Point)obj; // 변환
return x == other.x && y == other.y;
}
return super.equals(obj);
}
}
결과 :
p1 =Point(10, 10)
p2 =Point(10, 10)
p1 == p2 ? false
p1 =Point(100, 200)
p2 =Point(10, 10)
객체 필드 데이터 단순 복제
깊은 복제
LangClassTest.java
package com.javaex.api.objectclass.v4;
public class LangClassTest {
public static void main(String[] args) {
ScoreBoard s1 = new ScoreBoard(new int[] { 10,20,30,40});
System.out.println("s1 = " + s1);
ScoreBoard s2 = s1.getClone();
System.out.println("s2 = " + s2);
System.out.println("s1 == s2 ? "+ (s1 == s2));
s2.getScores()[2] = 100;
System.out.println("s1 = " + s1);
System.out.println("s2 = " + s2);
System.out.println("s1.scores == s2.scores ? "+ (s1.getScores() == s2.getScores()));
}
}
ScoreBoard.java
package com.javaex.api.objectclass.v4;
import java.util.Arrays;
// v4. 깊은 복제
public class ScoreBoard implements Cloneable{
//참조 타입 필드
private int[] scores;
// 생성자
public ScoreBoard(int[] scores) {
this.scores = scores;
}
public ScoreBoard getClone() {
ScoreBoard clone = null;
try {
clone = (ScoreBoard)clone();
}catch(CloneNotSupportedException e) {
e.printStackTrace();
}
return clone;
}
public int[] getScores() {
return scores;
}
public void setScores(int[] scores) {
this.scores = scores;
}
@Override
public String toString() {
return "ScoreBoard [scores=" + Arrays.toString(scores) + "]";
}
}
결과
s1 = ScoreBoard [scores=[10, 20, 30, 40]]
s2 = ScoreBoard [scores=[10, 20, 30, 40]]
s1 == s2 ? false
s1 = ScoreBoard [scores=[10, 20, 100, 40]]
s2 = ScoreBoard [scores=[10, 20, 100, 40]]
s1.scores == s2.scores ? true
객체를 만드는 것
깊은 복제를 얕은 복제 시도
LangClassTest.java
package com.javaex.api.objectclass.v4;
public class LangClassTest {
public static void main(String[] args) {
ScoreBoard s1 = new ScoreBoard(new int[] { 10,20,30,40});
System.out.println("s1 = " + s1);
ScoreBoard s2 = s1.getClone();
System.out.println("s2 = " + s2);
System.out.println("s1 == s2 ? "+ (s1 == s2));
s2.getScores()[2] = 100;
System.out.println("s1 = " + s1);
System.out.println("s2 = " + s2);
System.out.println("s1.scores == s2.scores ? "+ (s1.getScores() == s2.getScores()));
}
}
ScoreBoard.java
package com.javaex.api.objectclass.v4;
import java.util.Arrays;
// v4. 깊은 복제
public class ScoreBoard implements Cloneable{
//참조 타입 필드
private int[] scores;
// 생성자
public ScoreBoard(int[] scores) {
this.scores = scores;
}
public ScoreBoard getClone() {
ScoreBoard clone = null;
try {
clone = (ScoreBoard)clone();
}catch(CloneNotSupportedException e) {
e.printStackTrace();
}
return clone;
}
public int[] getScores() {
return scores;
}
@Override
protected Object clone() throws CloneNotSupportedException {
// 1. 얕은 복제 시도
ScoreBoard clone = (ScoreBoard)super.clone();
// 2. 내부 참조 객체를 복제
clone.scores = Arrays.copyOf(scores, scores.length);
return clone;
}
public void setScores(int[] scores) {
this.scores = scores;
}
@Override
public String toString() {
return "ScoreBoard [scores=" + Arrays.toString(scores) + "]";
}
}
결과
s1 = ScoreBoard [scores=[10, 20, 30, 40]]
s2 = ScoreBoard [scores=[10, 20, 30, 40]]
s1 == s2 ? false
s1 = ScoreBoard [scores=[10, 20, 30, 40]]
s2 = ScoreBoard [scores=[10, 20, 100, 40]]
s1.scores == s2.scores ? false
참조 타입 필드를 같이 참조하다가.
1. 얕은 복제하고
2. 내부 참조 객체를 복사해왔다.