티스토리 뷰
Object를 일반적인 방법으로 복제를 하는 경우 문제가 발생할 수 있습니다.
아래 예제를 통해 확인해 보겠습니다.
테스트 코드
public class TestClone {
public static void main(String[] args) {
User user1 = new User("test1");
User cUser1 = (User)user1.clone();
cUser1.setName("test2");
System.out.println(user1.toString());
System.out.println(cUser1.toString());
}
public static class User implements Cloneable, Serializable{
private String name;
private Map<String, String> testMap;
public User() {
testMap = new HashMap<>();
}
public User(String name) {
this();
this.setName(name);
}
public void setName(String name) {
this.name = name;
testMap.put("test", name);
}
public Object clone() {
try {
return (User)super.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
@Override
public String toString() {
return "User [name=" + name + ", testMap=" + testMap + "]";
}
}
}
실행 결과
User [name=test1, testMap={test=test2}]
User [name=test2, testMap={test=test2}]
결과를 보면 user1에 Map값이 잘못된걸 확인할 수 있습니다.
레퍼런스 타입인 경우 완전 복제가 되지않습니다.
완전히 복제하기 위해서는 해당 객체를 serialize 한 후 다시 deserialize하는 방법이 있습니다.
직접 개발 할 수도 있지만 apache common에 잘 만들어진 Util이 있으니 그것을 이용하면 될거 같습니다.
dependency
gradle
// https://mvnrepository.com/artifact/org.apache.commons/commons-lang3
compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.8.1'
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.8.1</version></dependency>
변경 코드
import java.io.Serializable;import java.util.HashMap;import java.util.Map;import org.apache.commons.lang3.SerializationUtils;public class TestClone {public static void main(String[] args) {User user2 = new User("test1");User cUser2 = SerializationUtils.clone(user2);cUser2.setName("test2");System.out.println(user2.toString());System.out.println(cUser2.toString());}}
결과
User [name=test1, testMap={test=test1}]
User [name=test2, testMap={test=test2}]
객체 복제할 때 레퍼런스 타입을 이용한다면 주의해야 할 부분입니다.
자바스크립트에서 복제는 간단합니다. 아래처럼 이용하면 됩니다.
function cloneObject(pObj){
return JSON.parse(JSON.stringify(pObj));
}
'리팩토링(스프링기반)' 카테고리의 다른 글
private method의 @Transactional 제거 (0) | 2019.01.08 |
---|---|
Map 전체 내용을 읽을 때 Key, Value를 모두 사용한다면 "entrySet"을 사용하라 (0) | 2019.01.08 |
타입선언은 인터페이스로 하자 (0) | 2019.01.07 |
Java class, method 선언 시 표현 순서 (0) | 2019.01.07 |
로그인 프로세스 개선 (0) | 2019.01.03 |
- Total
- Today
- Yesterday
- spring
- lombok
- 그리드
- thymeleaf
- oracle
- 타임리프
- example
- listToMap
- 예제
- Javascript
- springboot
- 스프링
- 엑셀
- 설정
- cache
- mybatis
- restful서비스
- RESTful
- 메시지
- 스프링부트
- SHEETJS
- Spring Boot
- UI
- mapToList
- sample
- ag grid
- AG-GRID
- java
- 샘플
- REST
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |