728x90

    자바 프로그램을 개발시

    한번의 트랜잭션을 통해 데이터를 가져온 후 

    자바에서 데이터를 가공하여 

    여럿 유형의 데이터 구조를가지고 있는 리포트를 만들어 보려고 한적이 있습니다.

    당시에는 얕은 복사와 깊은 복사에 대한 개념을 잘 알지 못하여

    밑의 소스코드 처럼 특정 데이터를 가져 온 후

    1. mongo1은 특정 데이터를 db에서 가져왔다고 한다면. mongo2에 복사를 하여 mongo1과는 다른 데이터셋을 만들고 싶었습니다.

    	public static void main(String[] args) {
    
    
    		Dbinfo mongo1 = new Dbinfo();
    
    		mongo1.setInfo("디비정보1");
    
    		mongo1.setCount(50);
    
    		
    
    		Dbinfo mongo2 = mongo1;//얕은복사
    
    		
    
    		mongo2.setInfo("디비정보2");
    
    		mongo2.setCount(100);
    
    		
    
    		System.out.println("mongo1정보 : "+mongo1.getInfo());
    
    		System.out.println("mongo1카운트: "+mongo1.getCount());
    
    		
    
    		System.out.println("mongo2정보 : "+mongo2.getInfo());
    
    		System.out.println("mongo2카운트 : "+mongo2.getCount());
    
    	
    
    		//tobi의 주소값을 app가 가지고 간것이다.
    
    		//얉은 복사입니다.
    
    	}
    
    


    2. 하지만 결과창을 보면..

    mongo1정보 : 디비정보2

    mongo1카운트: 100

    mongo2정보 : 디비정보2

    mongo2카운트 : 100


    위와 같이 mongo1과 mongo2의 데이터가 같이 변했다는 것을 알게 되었고

    Dbinfo mongo2 = mongo1;//얕은복사

    위와 같은 행위는 데이터를 복사하는것이 아니라

    주소값을 복사하는것이라는걸 알게 되었습니다.



    3. 이후 깊은 복사에 대해 알게 되었습니다. 이러한 문제점을 해결하기 위하여

    이미 자바에서는 Copy기능을 넣어두었는데요. Cloneable입니다.

    Dbinfo를 복사를 하기 위해서는

    Cloneable 인터페이스를 상속받아야 copy할수 있습니다.


    public class Dbinfo implements Cloneable{
    	private String info;
    	private int count;
    	
    	public String getInfo() {
    		return info;
    	}
    	public void setInfo(String info) {
    		this.info = info;
    	}
    	public int getCount() {
    		return count;
    	}
    	public void setCount(int count) {
    		this.count = count;
    	}
    	
    	@Override
    	protected Object clone() throws CloneNotSupportedException {
    		return super.clone();
    	}
    	
    }
    


    4. 호출하는 부분에서는 

    public static void main(String[] args) throws CloneNotSupportedException {
    		Dbinfo mongo1 = new Dbinfo();
    		mongo1.setInfo("디비정보1");
    		mongo1.setCount(50);
    		
    		Dbinfo mongo2 = (Dbinfo) mongo1.clone();//깊은복사
    		
    		mongo2.setInfo("디비정보2");
    		mongo2.setCount(100);
    		
    		System.out.println("mongo1정보 : "+mongo1.getInfo());
    		System.out.println("mongo1카운트: "+mongo1.getCount());
    		
    		System.out.println("mongo2정보 : "+mongo2.getInfo());
    		System.out.println("mongo2카운트 : "+mongo2.getCount());
    		
    		
    	}
    


    5. 결과창으로 확인해보면 

    mongo1정보 : 디비정보1

    mongo1카운트: 50

    mongo2정보 : 디비정보2

    mongo2카운트 : 100


    깊은 복사를 통하여 mongo1과 mongo2의 데이터가 

    다르게 들어있는것을 확인 할수 있었습니다.


    지난 포스트가 궁금하시다면 

    ↓ 아래 링크를 클릭해주세요. ↓

    [자바 패턴] 싱글톤패턴의 이해(java singleton)


    다음 포스트가 궁금하시다면 

    ↓ 아래 링크를 클릭해주세요. ↓


    '공감'버튼 및 '좋아요'는 글쓴이에게 큰 힘이 됩니다!

    (클릭)블로그 구독도 부탁드립니다.(네이버이웃 추가)


    Posted by 천상나타