[자바] 깊은 복사와 얕은 복사의 이해 - java 데이터 복사
자바 프로그램을 개발시
한번의 트랜잭션을 통해 데이터를 가져온 후
자바에서 데이터를 가공하여
여럿 유형의 데이터 구조를가지고 있는 리포트를 만들어 보려고 한적이 있습니다.
당시에는 얕은 복사와 깊은 복사에 대한 개념을 잘 알지 못하여
밑의 소스코드 처럼 특정 데이터를 가져 온 후
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)
다음 포스트가 궁금하시다면
↓↓↓ 아래 링크를 클릭해주세요. ↓↓↓↓
'공감'버튼 및 '좋아요'는 글쓴이에게 큰 힘이 됩니다!
'IT > JAVA' 카테고리의 다른 글
자바 Map<String,String>을 다른 Map 키값으로 사용한다면 (0) | 2018.05.30 |
---|---|
[자바] java method timeout - 메서드 타임 아웃 걸기 (0) | 2018.04.17 |
[자바 패턴] 싱글톤패턴의 이해(java singleton) (0) | 2018.04.17 |
[JAVA] 자바로 csv파일 만들기(라이브러리 X) (3) | 2018.01.26 |
class 및 jar 파일이 디컴파일러가 안될때(리눅스에서 사용 방법) (0) | 2018.01.06 |