일단 시작해보는 블로그

[Java] ArrayList, 참조값 복사와 값 복사 clone() 본문

개발/Java

[Java] ArrayList, 참조값 복사와 값 복사 clone()

Selina Park 2019. 8. 22. 12:42

자료구조나 변수를 복사할 때는 두가지 종류가 있다. 

하나는 참조 값을 할당하는 것 다른 하나는 값을 할당하는 것.

 

참조 값을 할당하는 것을 얕은 복사라고 하고, 값을 할당하는 것을 깊은 복사라고 한다. 무슨 복사인지는 의미없지만 상황에 따라서 쓰이는 경우가 있으니 다음 예제로 익혀봤다.

 

얕은 복사 : 참조 값만 할당 (destination = source)

package data_structure;
import java.util.ArrayList;

class Fruit {
    private String name;
    private int count;

    public String getName(){
        return name;
    }

    public void setName(String name){
        this.name = name;
    }

    public int getCount(){
        return count;
    }

    public void setCount(int count){
        this.count = count;
    }
}

public class ArrayList_copy {
    static ArrayList<Fruit> source = new ArrayList<Fruit>();
    static ArrayList<Fruit> destination = new ArrayList<Fruit>();

    public static void initArrayList(){
        if(null != source){
            source.clear();

            String[] names = new String[] {"apple", "banana", "cherry"};
            for(int i=0; i<names.length; i++){
                Fruit f = new Fruit();
                f.setName(names[i]);
                f.setCount(i+1);
                source.add(f);
            }
        }

        if(null != destination){
            destination.clear();
        }
    }

    public static void printArrayList(){
        System.out.println("==== source result ====");
        for(int i=0; i<source.size(); i++){
            System.out.println("source["+i+"] name : " + source.get(i).getName());
            System.out.println("source["+i+"] count : " + source.get(i).getName());
        }

        System.out.println();

        System.out.println("==== destination result ====");
        for(int i=0; i<destination.size(); i++){
            System.out.println("destination["+i+"] name : " + destination.get(i).getName());
            System.out.println("destination["+i+"] count : " + destination.get(i).getName());
        }
    }

    public static void main(String[] args) {
        initArrayList();

        //얖은 복사, 참조 값만 복사
        destination = source;
        Fruit f = new Fruit();
        f.setName("kiwi");
        f.setCount(4);
        destination.add(f);

        printArrayList();
    }
}

 -> 참조 값을 할당받는 거라서 같은 메모리를 가리키게 되고 당연히 메모리가 변경되면 참조값을 담고 있는 변수 명이 달라도 값은 같이 반영이 된다.

 

 

 

깊은 복사 : 값을 할당

package data_structure;
import java.util.ArrayList;

class Fruit {
    private String name;
    private int count;

    public String getName(){
        return name;
    }

    public void setName(String name){
        this.name = name;
    }

    public int getCount(){
        return count;
    }

    public void setCount(int count){
        this.count = count;
    }
}

public class ArrayList_copy {
    static ArrayList<Fruit> source = new ArrayList<Fruit>();
    static ArrayList<Fruit> destination = new ArrayList<Fruit>();

    public static void initArrayList(){
        if(null != source){
            source.clear();

            String[] names = new String[] {"apple", "banana", "cherry"};
            for(int i=0; i<names.length; i++){
                Fruit f = new Fruit();
                f.setName(names[i]);
                f.setCount(i+1);
                source.add(f);
            }
        }

        if(null != destination){
            destination.clear();
        }
    }

    public static void printArrayList(){
        System.out.println("==== source result ====");
        for(int i=0; i<source.size(); i++){
            System.out.println("source["+i+"] name : " + source.get(i).getName());
            System.out.println("source["+i+"] count : " + source.get(i).getName());
        }

        System.out.println();

        System.out.println("==== destination result ====");
        for(int i=0; i<destination.size(); i++){
            System.out.println("destination["+i+"] name : " + destination.get(i).getName());
            System.out.println("destination["+i+"] count : " + destination.get(i).getName());
        }
    }

    public static void main(String[] args) {
        initArrayList();

        //깊은 복사, 값을 할당
        destination = (ArrayList<Fruit>)source.clone();
        Fruit f = new Fruit();
        f.setName("kiwi");
        f.setCount(4);
        destination.add(f);

        printArrayList();
    }
}

-> 값 자체를 할당하는 것. 그냥 값을 복사한거라서 참조값도 서로 다르고 그냥 값만 같은 상태. 따라서 다른 곳에 추가되던 말던 독립적임.

'개발 > Java' 카테고리의 다른 글

[Java] 정규표현식, Regular Expression  (0) 2019.09.03
[Java] 데이터 타입  (0) 2019.08.23
[Java] indexOf(int ch), substring()  (0) 2019.08.22
[Java] String 다루기 - matches, regex  (0) 2019.08.22
[Java] HashMap  (0) 2019.08.21
Comments