All About IT
[Java 기초] 자바에서 얕은 복사와 깊은 복사의 비교
안녕하세요~
이번 시간에는 자바의 얕은 복사와 깊은 복사의 차이에 대해 알아보려고 하는데요.
어떻게 차이가 있는지 살펴볼까요?
얕은 복사와 깊은 복사(복사 생성자, 팩토리메서드)
package day36;
public class Person {
private String name;
private int age;
public Person(){
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person(Person p){
this.name = p.getName();
this.age = p.getAge();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public static Person copy(Person p){
Person cp = new Person();
cp.name = p.getName();
cp.age = p.getAge();
return cp;
}
}
package day36;
public class 복사 {
public static void main(String[] args) {
Person p1 = new Person("홍길동", 20);
Person p2 = p1;
Person p3 = new Person(p1);
Person p4 = Person.copy(p1);
p2.setName("강감찬");
p3.setName("이순신");
p4.setName("심청이");
System.out.println("p1.name = "+p1.getName());
System.out.println("p2.name = "+p2.getName());
System.out.println("p3.name = "+p3.getName());
System.out.println("p4.name = "+p4.getName());
System.out.println("================");
System.out.println("p1 : "+p1.toString());
System.out.println("p2(얕은 복사) : "+p2.toString());
System.out.println("p3(복사 생성자) : "+p3.toString());
System.out.println("p4(복사 팩토리메서드) : "+p4.toString());
}
}
💻 Person 클래스 기준으로 객체를 생성하여 얕은 복사, 깊은 복사를 하고 비교하는 코드.
오늘의 핵심 키워드
- 얕은 복사는 참조값(주소값)을 복사하는 것이다.
- 깊은 복사는 객체에 실제 저장된 값을 복사하는 것이다.
① 이름을 저장하는 필드 name, 나이를 저장하는 필드 age
② 기본생성자, 필드를 저장하는 생성자, 깊은 복사를 위한 생성자
③ 필드를 저장하거나 리턴하는 getter, setter 메서드와 깊은 복사를 위한 copy 메서드
① name에 "홍길동", age에 20을 저장하는 객체 변수 p1
② p1의 참조값(주소값)을 얕은 복사하는 객체 변수 p2
③ p1의 참조값을 매개변수로 받아 복사생성자로 깊은 복사하는 객체 변수 p3
④ p1의 참조값을 매개변수로 받아 복사팩토리메서드로 깊은 복사하는 객체 변수 p4
① p2, p3, p4 객체의 name에 각각 "강감찬", "이순신", "심청이" 저장
① p1, p2, p3, p4의 name을 리턴하여 출력
② p1, p2, p3, p4의 참조값(주소값)을 출력
최종 출력본
꼭 봐야되는 마무리 꿀팁!
- 같은 객체를 공유할 때는 얕은 복사 사용하기!
- 객체의 실제 값만 복사할 때는 깊은 복사 사용하기!
▲영상으로 한번 더 복습하세요! :)