일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- String
- DispatcherServlet
- DesignPattern
- 토비의스프링
- FunctionalInterfaces
- springwebmvc
- java
- 자바
- ORM
- exception
- hibernate
- JPA
- 토비의스프링3.1
- 컴퓨터시스템
- 메이븐
- lambda
- Kotlin for Java Developers
- 링커
- 빌드툴
- IOC
- AutoConfiguration
- Spring
- springboot
- Immutable
- 링킹
- gradle
- 클린코드
- beanfactory
- ApplicationContext
- 프록시
- Today
- Total
엔지니어로 가는 길
Java 배열의 얕은 복사(shallow copy)와 깊은 복사(deep copy) 본문
Shallow copy
얕은 복사(shallow copy)는 객체가 아닌 객체를 참조하는 참조변수(객체의 주소)만 복사한다.
fig3에서는 얕은 복사 방법 세 가지가 보인다.
1. 하나는 Object의 clone() 메소드
(Object의 clone() 메소드를 사용하기 위해서는 대상 클래스에서 clone() 메소드를 오버라이드 해야 하지만 얕은 복사는 객체가 복사되는 것이 아니므로 대상 클래스가 clone() 메소드를 오버라이드 하지 않아도 된다.)
2. 대입연산자 =
3. System의 arraycopy() 메소드(보다 효율적으로 얕은 복사 수행)
얕은 복사를 통해 복사되는 것은 참조변수(객체의 주소)뿐이므로 얕은 복사를 통해 만들어진 copy와 persons는 같은 Person 객체를 가리키고 있다. 따라서 copy에서 Person 객체의 값을 조작한다면 이는 persons의 Person 객체에도 영향을 미친다. 둘은 같은 객체이기 때문이다.
fig6에서 볼 수 있듯, 얕은 복사된 배열에서 두번 째 원소의 name과 age를 변경하였는데 원본 배열의 두번 째 원소에도 변화가 적용되었다.
Deep copy
깊은 복사(deep copy)는 객체를 복사한다. 따라서 참조변수도 다르고 참조변수가 가리키는 객체 또한 (동등할 수는 있어도) 동일하지 않다. (동일성과 동등성의 차이)
SerializationUtils의 clone 메소드를 통해 깊은 복사를 수행할 수 있다. 단, 이때 복사의 대상인 Person 클래스는 Serializable 인터페이스를 구현해야 한다. (그렇다고 따로 구현해야 할 것은 없다.)
만약 Serializable을 구현하지 않은 채로 SerializationUtils의 clone 메소드를 사용하면 NotSerializableException을 만나게 된다.
깊은 복사를 통하면 객체가 복사되므로 깊은 복사를 통해 만들어진 copy와 persons는 같은 다른(동일하지 않은) 객체를 가리키고 있다. 따라서 copy에서 Person 객체의 값을 조작한다고 한들 이는 persons의 Person 객체에 영향을 미치지 않는다. 얕은 복사 뒤에 두 배열은 객체를 통해 연결되어 있는 반면, 깊은 복사 뒤에 두 배열은 아무 연결성이 없다고 생각할 수 있다.
fig12에서 볼 수 있듯, 깊게 복사된 배열에서 두번 째 원소의 name과 age를 변경하였는데도 원본 배열의 두번 째 원소는 그대로이다.
'프로그래밍 > Java' 카테고리의 다른 글
Java Exceptions의 정의와 Exception의 장점 (0) | 2022.11.06 |
---|---|
Java String이 불변(immutable)인 이유 (0) | 2021.11.02 |
자바 문서 빈출 단어 evaluate, expression, statement, block (0) | 2020.11.26 |
자바를 통해 다이나믹 프록시(Dynamic Proxy)를 구현하는 방법 (8) | 2020.10.26 |
자바 프록시와 데코레이터 패턴(Decorator Pattern)에 대해 알아보자 (0) | 2020.10.23 |