프로그래밍 언어/JAVA(자바)

[자바/java] 이차원 배열 클론, Clone(), Object.Clone()

냠냠:) 2020. 9. 9. 17:42

이차원 배열을 clone시키다 발생한 에러 해결방법을 공유하고자 글을 씁니다.

 

Clone ?

clone()은 Object클래스에 정의돼있다.

 

생성된 객체와 같은 값을 가진 복사본의 인스턴스를 생성하는 일을 한다.

개인적으로는 원래의 객체 값을 다시 사용하고 싶거나 일시적인 연산을 위해 사용한 적이 있다

 

clone()를 객체를 사용하기 위해서는 해당 객체에 Cloneable이라고 하는 인터페이스 구현체를 implements 해줘야 한다.

 

기본형에 대해서는 값 복사가 이뤄지지만, 사용자 클래스의 객체맴버에 대한 완전한 값 복사는 지원하지 않는다. 얕은 복사라고도 하는데, 주소복사가 이뤄지기 때문에 복사본의 객체에 참조형 맴버변수가 존재한다면, 원본 객체에도 영향을 미친다.

 

실제로 이를 코드 구현 중 맞닥뜨렸으며, 이를 해결하는 과정을 작성해보겠다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
    public static void main(String args[]) {
        int[][] basic = {
                {1,2,3},
                {3,4,5},
                {6,7,8}
        };
        
        int[][] ref = basic.clone();
        ref[0][0= 100;
        
        System.out.println(basic[0][0+"  < - > "+ ref[0][0]);
        
    }
cs
/*출력*/
100  < - > 100

위와 같이 분명 클론을 하고 ref 값을 바꿨는데 basic의 값이 바뀌었다. 즉, 주소가 복사되는 얕은 복사에 해당한다.

1차원 배열은 clone을 하면 깊은 복사가 된다. 주소랑 값의 복사가 이뤄진다.

 

 

[해결 방법]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    public static void main(String args[]) {
        int[][] basic = {
                {1,2,3},
                {3,4,5},
                {6,7,8}
        };
        
        int[][] ref = new int[basic.length][basic.length];
        
        for(int i = 0; i < ref.length; i++) {
            ref[i] = basic[i].clone();
        }
        ref[0][0= 100;
        
        System.out.println(basic[0][0+"  < - > "+ ref[0][0]);
    }
cs
/*출력*/
1  < - > 100

1차원 배열들을 clone 해서 ref에 넣어주면 된다.

 

자바 입문 책에 있던 내용이었지만, 시간이 지나서 잊혀졌다. 다시 상기시키며 자주 보고 복습해야겠다.

반응형