- [Error Note] 22. 얕은 복사 오류2024년 05월 10일
- Song hyun
- 작성자
- 2024.05.10.:11
728x90반응형[Error Note] 22. 얕은 복사 오류
"얕은 복사"라는 개념에 대해 공부하던 도중, 알게 된 오류에 대해 이야기해보고자 한다.
아래의 코드를 읽어보자.
Type mismatch : cannot convert from element type Object to Integer
해당 메세지를 읽어보면 Object 타입의 변수를 Integer 타입(=정수형, int)로 변환할 수 없다는 뜻임을 알 수 있다.
변수 list는 ArrayList라는 자료구조를 가지고 있지만, 어떤 형태의 요소를 받을 것인지는 정의되지 않았다.
이럴 때 JVM은 기본 형태를 최상위 클래스인 Object로 선언하게 된다.
즉, 아래의 코드에서 list는 object 타입의 ArrayList인 셈이다.
아래의 코드를 살펴보자.
현재 list는 int형의 ArrayList로 정의되어, Integer(int)형의 요소들을 받게 되어 있다.
list를 출력하면 3,10이 출력되는 것을 보아 현재 list는 두개의 요소만을 지니고 있다.
그리고 변수 num이 list로 초기화 된 상태이다.
이후 list에 1000이라는 요소를 더했다.
정리해보자면
nums=list(요소 추가 전)=[3,10]
list=[3,10,1000]인 셈이다.
그런데 왜 nums를 출력했을 때 1000이라는 요소도 함께 출력되었을까?
이는 바로 얕은 복사(Shallow Copy)라는 개념이 nums에게 적용되었기 때문이다.
자바에는 얕은 복사(shallow copy)와 깊은 복사(Deep Copy)라는 개념이 있다.
실존하는 집이 한 채 있다고 가정해보자.
(1) 만약 얕은 복사를 하게 된다면, 집으로 향하는 지도를 복사하게 된다.
즉, 실존하는 집이 아닌 집으로의 주소값이 복사되는 것이다.
해당 지도에 택배를 보내게 된다면 어떻게 될까?
지도가 아닌, 지도가 가리키는 원본 집으로 물건이 배달될 것이다.
(2) 깊은 복사를 하게 된다면, 집 그 자체를 복사하게 된다.
집 안의 물건, 인테리어 등 집을 구성하는 요소들을 모두, 그대로 복사하게 된다.
즉, 깊은 복사를 한 객체에 물건을 보내게 된다면,
새로 복사된 집으로 물건이 보내질 것이다.
위의 개념을 앞의 코드에 적용해 생각해보자.
nums는 초기화 후, list에 추가된 요소들도 지니고 있었다.
만약 깊은 복사가 진행되었다면 nums에는 [3,10]의 요소만 있었을 것이다.
즉 nums는 list의 주소값을 복사, 얕은 복사를 한 객체라는 점을 알 수 있다.
객체를 복사할 때 신경써서 사용하자!
728x90반응형'Error Note' 카테고리의 다른 글
다음글이전글이전 글이 없습니다.댓글