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. 내부 참조 객체를 복사해왔다.

'study > JAVA 전문가' 카테고리의 다른 글

Wrapper Class, 제너릭, ,,  (0) 2021.12.08
arrays 클래스  (0) 2021.12.08
인터페이스  (0) 2021.12.07
예외  (0) 2021.12.07
추상 클래스  (0) 2021.12.07

+ Recent posts