본문 바로가기
Java 강의

자바 객체 복사 / 얕은 복사와 깊은 복사 / Object Copy

by 자유코딩 2017. 9. 29.

안녕하세요 이번 글에서는 객체의 복사에 대해서 알아보겠습니다

 

소스 코드를 보겠습니다

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package StringTest;
 
public class Main{
    public static void main(String[] args) {
        Car c1 = new Car();
        Car c2 = new Car();//c2의 타입은 Car타입이다
        
        System.out.println("c1의 주소 값 : "+c1);//c1의 주소 값을 출력한다
        System.out.println("c2의 주소 값 : "+c2);//c2의 주소 값을 출력한다
        
        c1.setSpeed(10);//c1의 speed를 10으로 초기화 한다
        c2.setSpeed(20);//c2의 speed를 20으로 초기화 한다
        
        System.out.println("c1의 speed 출력 : "+c1.getSpeed());//c1.getSpeed를 출력해서 확인한다
        System.out.println("c2의 speed 출력 : "+c2.getSpeed());//c2.getSpeed를 출력해서 확인한다
        
        c1.setSpeed(c2.getSpeed());//c2.getSpeed의 값을 c1의 speed에 저장한다
        System.out.println("값의 복사가 일어남");
        
        System.out.println("c1의 speed를 출력 : "+c1.getSpeed());//c1.getSpeed를 출력한다
        System.out.println("c2의 speed를 출력 : "+c2.getSpeed());//c2.getSpeed를 출력한다
        System.out.println("c1의 주소 값 : "+c1);//c1에 저장된 주소 값을 출력한다
        System.out.println("c2의 주소 값 : "+c2);//c2에 저장된 주소 값을 출력한다
        
        c1=c2;
        
        c1.setSpeed(10);//c1의 speed를 10으로 저장한다
        System.out.println("c2의 speed를 출력 (c1이 c2의 주소를 가지고 있으므로 10이 출력된다): "+c2.getSpeed());
        
        
    }
}
class Car {
    private int speed;
    private String gear;
    public int getSpeed() {
        return speed;
    }
    public void setSpeed(int speed) {
        this.speed = speed;
    }
    public String getGear() {
        return gear;
    }
    public void setGear(String gear) {
        this.gear = gear;
    }
}
cs

 

출력

 

 

그림으로 얕은 복사와 깊은 복사에 대해서 알아보겠습니다

 

●얕은 복사(주소를 복사한다)

 

얕은 복사 전의 그림

 

얕은 복사 후의 그림

 

 

가지고 있는 주소 값이 같기 때문에 c1.Speed의 값을 변경하면 c2.speed의 값도 바뀐다

 

●깊은 복사(값을 복사한다)

 

깊은 복사 전의 그림

 

깊은 복사 후의 그림

주소의 값이 같게 되면 스택 영역의 참조변수를 통해서 주소 값이 같은 다른 참조변수의 힙영역도 변경 시킬 수 있습니다

 

설명이 부족하시진 않으셨나요? jswoo030@gmail.com 으로 질문해주시면 빠른 답변을 받으실 수 있습니다

 

여러분의 자바 실력이 향상되시길 바랍니다

'Java 강의' 카테고리의 다른 글

자바 객체 / 클래스  (0) 2017.09.29
자바 함수 / java method  (0) 2017.09.29
자바 for each 구문  (0) 2017.09.27
자바 break; continue;  (0) 2017.09.27
반복문으로 *을 출력하는 예제  (0) 2017.09.26

댓글