728x90
객체 문자 정보(toString())
객체의 문자 정보란 객체를 문자열로 표현한 값을 말한다.
Object클래스의 toString() 메소드는 객체의 문자정보를 리턴한다.
Object클래스의 toString() 메소드는 "클래스명@해시코드"로 구성된 문자정보를 리턴
일반적으로 재정의해서 의미있는 문자정보가 나오도록 재정의한다
- Date클래스는 toString()메소드는 재정의하여 현재시스템의 날짜와 시간정보를 리턴한다
- String 클래스는 toString()메소드를 재정의해서 저장하고있는 문자열을 리턴
System.out.println(Object)메소드는 Object의 toString()의 리턴값을 출력한다.
public class ToStringExample{
public static void main(String[] args){
Object obj1 = new Object();
Date obj2 = new Date();
//문자정보리턴 클래스명@16진수해시코드
System.out.println(obj1.toString());
//Date클래스가 재정의함
System.out.println(obj2.toString());
}
}
package Sec03;
public class SmartPhone {
private String company;
private String os;
public SmartPhone(String company, String os){
this.company = company;
this.os = os;
}
@Override
public String toString() {
return company+","+os;
}
}
import Sec03.SmartPhone;
public class SmartPhoneExample {
public static void main(String[] args) {
SmartPhone myphone = new SmartPhone("구글","안드로이드");
String strObj = myphone.toString();
System.out.println(strObj);
//sout 의 위아래 둘다 같은 결과값이 나온다.
System.out.println(myphone);
}
}
객체 복제(clone())
원본 객체의 필드값과 동일한 값을 가지는 새로운 객체를 생성하는 것을 말한다.
복제종류
얕은 복제(thin clone) : 단순히 필드값만 복제(참조타입필드는 번지공유)
깊은복제 (deep clone) : 참조하고있는 객체도 복제
Object의 clone()메소드는 동일한 필드값을 가진 얕은 복제된 객체를 리턴한다.
java.lang.Cloneable 인터페이스를 구현한 객체만 복제 가능하다.
구현하지 않을경우 clone()을 호출하면 CloneNotSupportedException 예외발생
깊은 복제를 하려면 clone()메소드를 재정의하고 참조객체도 복제해야한다.
//복제를하려면 Cloneable 을 implements해주어야한다
public class Member implements Cloneable {
public String id;
public String name;
public String password;
public int age;
public boolean adult;
public Member(String id, String name, String password, int age, boolean adult) {
this.id = id;
this.name = name;
this.password = password;
this.age = age;
this.adult = adult;
}
//class Membet타입의 메소드 선언
public Member getMember() {
//변수선언
Member cloned = null;
//강제타입변환
try {
//clone에서 예외가 발생 > 예외처리 해야함
cloned = (Member) clone();
} catch (CloneNotSupportedException e) {
return cloned;
}
return cloned;
}
}
public class MemberExample {
public static void main(String[] args) {
Member original = new Member("blue", "홍길동", "12345",25,true);
//복제객체를 수정하여 사용할때 원본객체는 변경되지않음
//얕은 복제
//복제해서 복제객체를 수정하여 사용할수있다
Member cloned = original.getMember();
cloned.password = "67890";
System.out.println("[원본 객체의 필드값]");
System.out.println("id:"+original.id);
System.out.println("name:" +original.name);
System.out.println("password"+original.password);
System.out.println("age:"+original.age);
System.out.println("adult:"+original.adult);
System.out.println("[복제 객체의 필드값]");
System.out.println("id:"+cloned.id);
System.out.println("name:" +cloned.name);
System.out.println("password"+cloned.password);
System.out.println("age:"+cloned.age);
System.out.println("adult:"+cloned.adult);
}
}
import java.util.Arrays;
//
public class Member implements Cloneable {
public String name;
public int age;
public int[] scores;
public Car car;
//필드초기화
public Member(String name, int age, int[] scores, Car car) {
this.name = name;
this.age = age;
this.scores = scores;
this.car = car;
}
@Override
protected Object clone() throws CloneNotSupportedException {
//먼저 얕은복사를 해서 name , age를 복제한다
Member cloned = (Member) super.clone(); //object의 clone()호출
//scores를 깊은복제한다
cloned.scores = Arrays.copyOf(this.scores, this.scores.length);
//car를 깊은복제한다
cloned.car = new Car(this.car.model);
//깊은복제된 Member 객체리턴
return cloned;
}
public Member getMember() {
Member cloned = null;
try {
cloned = (Member) clone(); // 제정의된 clone()메소드 호출
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return cloned;
}
}
public class MemberExample {
public static void main(String[] args) {
Member original = new Member("홍길동",25,new int[] {90,90}, new Car("소나타"));
Member cloned = original.getMember();
System.out.println("[원본 객체의 필드값]");
System.out.println("name:" +original.name);
System.out.println("age:"+original.age);
System.out.print("scores:{");
for(int i =0; i<original.scores.length; i++){
System.out.print(original.scores[i]);
System.out.print((i==(original.scores.length-1))?"":",");
}
System.out.println("}");
System.out.println("car:"+original.car.model);
System.out.println();
System.out.println("[복제 객체의 필드값]");
System.out.println("name:" +cloned.name);
System.out.println("age:"+cloned.age);
System.out.print("scores:{");
for(int i =0; i<cloned.scores.length; i++){
System.out.print(cloned.scores[i]);
System.out.print((i==(cloned.scores.length-1))?"":",");
}
System.out.println("}");
System.out.println("car:"+cloned.car.model);
}
}
복제객체의 값을 변경해보자.
public class MemberExample {
public static void main(String[] args) {
Member original = new Member("홍길동",25,new int[] {90,90}, new Car("소나타"));
Member cloned = original.getMember();
//복제객체의 값변경
cloned.scores[0] = 100;
cloned.car.model = "그랜저";
System.out.println("[원본 객체의 필드값]");
System.out.println("name:" +original.name);
System.out.println("age:"+original.age);
System.out.print("scores:{");
for(int i =0; i<original.scores.length; i++){
System.out.print(original.scores[i]);
System.out.print((i==(original.scores.length-1))?"":",");
}
System.out.println("}");
System.out.println("car:"+original.car.model);
System.out.println();
System.out.println("[복제 객체의 필드값]");
System.out.println("name:" +cloned.name);
System.out.println("age:"+cloned.age);
System.out.print("scores:{");
for(int i =0; i<cloned.scores.length; i++){
System.out.print(cloned.scores[i]);
System.out.print((i==(cloned.scores.length-1))?"":",");
}
System.out.println("}");
System.out.println("car:"+cloned.car.model);
}
}
@Override
protected Object clone() throws CloneNotSupportedException {
//먼저 얕은복사를 해서 name , age를 복제한다
Member cloned = (Member) super.clone(); //object의 clone()호출
//scores를 깊은복제한다
cloned.scores = Arrays.copyOf(this.scores, this.scores.length);
//car를 깊은복제한다
cloned.car = new Car(this.car.model);
//깊은복제된 Member 객체리턴
return cloned;
}
위 오버라이드 부분을 작성하지않았다면 원본객체도 값이 수정된다.
728x90
'STUDY > JAVA' 카테고리의 다른 글
[JAVA] 참조변수 super, 생성자 super() (0) | 2022.12.05 |
---|---|
[JAVA] 이름 붙은 반복문 (0) | 2022.12.04 |
[JAVA-이것이자바다.10장] 예외 확인 문제 (0) | 2022.07.24 |
[JAVA] 22-07-21 객체의 해시코드 hashCode() ☑ (0) | 2022.07.21 |
[JAVA-이것이자바다.9장] 중첩 클래스와 중첩 인터페이스 확인 문제 (0) | 2022.07.20 |