Java에서 객체를 복사하는 방법은 무엇입니까?

⭐칼럼 소개

본 칼럼에서는 면접 질문, JAVA 숙련도 소개 등 JAVA에 관한 다양한 질문을 지속적으로 업데이트할 예정입니다.

업데이트 속도는 하루 3~5개 기사로 유지됩니다.

여기에 이미지 설명을 삽입하세요.

Java에서 객체를 복사하는 방법은 무엇입니까?

Java 언어에서는 객체를 복사해야 할 때 얕은 복사라는 두 가지 유형의 복사본이 있습니다.

딥 카피로. 얕은 복사는 원본 개체의 주소만 복사하므로 원본 개체의 값이 변경되면

을 클릭하면 복사된 개체의 값도 변경됩니다. Deep Copy는 원본 객체의 모든 값을 복사하므로

원본 개체의 값이 변경되더라도 복사된 개체의 값은 변경되지 않습니다.

여기에 이미지 설명을 삽입하세요.

1. 얕은 복사 clone()

Java에서 객체 복사는 객체의 모든 속성(멤버 변수)을 동일한 클래스 유형의 다른 객체에 복사하는 것을 의미합니다.

예를 들어, 객체 A와 객체 B는 모두 클래스 S에 속하며 속성 a와 b를 갖습니다. 그런 다음 객체 A를 복사하여 객체 B에 할당합니다.

그건:

B.b = A.a;
B.b = A.a;

데이터 유형이 기본 데이터 유형인 멤버 변수의 경우 얕은 복사는 값을 직접 전송합니다. 즉, 특성을 새 개체에 복사합니다. 두 개의 서로 다른 데이터이기 때문에 한 개체의 멤버 변수 값을 수정해도 다른 개체가 복사한 데이터에는 영향을 미치지 않습니다.
데이터 유형이 참조 유형인 멤버 변수의 경우(예: 멤버 변수가 배열, 특정 클래스의 객체 등) 얕은 복사본은 참조를 전송합니다. 즉, 참조 포인터(메모리 주소)를 멤버 변수의 새 개체에 추가합니다. 실제로 두 개체의 멤버 변수는 동일한 인스턴스를 가리키기 때문입니다. 이 경우 한 개체의 멤버 변수를 수정하면 다른 개체의 멤버 변수 값에 영향을 미칩니다.

2. 딥 카피

객체의 모든 기본 데이터형의 멤버변수 값을 복사해야 할 뿐만 아니라, 참조데이터형의 모든 멤버변수에 대한 저장공간을 신청하고, 각 참조데이터가 참조하는 객체를 복사해야 한다 개체가 도달할 수 있는 모든 개체를 알 때까지 멤버 변수를 입력합니다. . 즉, 객체의 전체 복사를 위해서는 객체 그래프 전체를 복사해야 하는데, 간단히 말해서 딥 복사는 해당 데이터 유형의 멤버 변수를 참조하는 객체 그래프의 모든 객체에 대한 메모리 공간을 열어주는 반면, 얕은 복사는 객체 그래프의 멤버 변수만 전송하는 것입니다. 새로운 객체는 참조 데이터 유형에 대한 메모리 공간을 생성하지 않습니다.

3. 직렬 복제(전체 복사)

직렬화는 스트림에 객체를 쓰는 프로세스입니다. 스트림에 기록된 객체는 원본 객체의 복사본이며 원본 객체는 여전히 메모리에 존재합니다. 직렬화를 통한 복사는 개체 자체뿐만 아니라 개체가 참조하는 구성원 개체도 복사할 수 있으므로 직렬화를 통해 개체를 스트림에 쓴 다음 스트림에서 읽어오는 방식으로 깊은 복사가 가능합니다. 직렬화된 객체의 클래스는 직렬화 가능 인터페이스를 구현해야 하며, 그렇지 않으면 직렬화 작업을 구현할 수 없다는 점에 유의해야 합니다.

Guess you like

Origin blog.csdn.net/weixin_50843918/article/details/132889914