자바 의 심도 있 는 복사 문 제 를 탐구 하 다.
복사 라 는 단 어 는 모두 가 잘 알 고 있 을 것 이다.업무 중 에 서 류 를 복사 해서 복사 해 야 한다.복사 의 장점 도 뚜렷 하 다.새로 만 드 는 것 에 비해 많은 작업량 을 절약 할 수 있다.자바 에 도 복사 라 는 개념 이 존재 하고 복사 의 의미 도 생 성 대상 의 비용 을 절약 할 수 있다.
Object
유형 중 한 가지 방법clone()
이 있 는데 구체 적 인 방법 은 다음 과 같다.
protected native Object clone() throws CloneNotSupportedException;
1.이 방법 은protected
으로 수식 되 어 있 으 며,자바 의 모든 종 류 는 기본적으로 계승Object
류 이 며,과부하 후의clone()
방법 은 다른 종 류 를 정상적으로 호출 할 수 있 도록 수정자public
로 바 꿔 야 합 니 다.2.이 방법 은
native
방법 으로native
에 의 해 수식 되 는 방법 은 실제 적 으로 비 자바 코드 로 이 루어 진 것 으로 효율 은 일반 자바 방법 보다 높다.3.이 방법의 반환 치 는
Object
대상 이기 때문에 우 리 는 우리 가 필요 로 하 는 유형 으로 강하 게 전환 해 야 한다.4.이 방법 은 복사 가 지원 되 지 않 는 다 는 뜻 으로
CloneNotSupportedException
인 터 페 이 스 를 표시 해 야 합 니 다.이런 종류의 복사 가 지원 되 는 것 입 니 다.프레젠테이션 의 편 의 를 위해 우 리 는 두 개의 실체 류
Cloneable
와Dept
를 신 설 했 는데 그 중에서User
는User
에 의존 했다.실체 류 코드 는 다음 과 같다.Dept
종류:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Dept {
private int deptNo;
private String name;
}
Dept
종류:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private int age;
private String name;
private Dept dept;
}
2.얕 은 복사기본 유형의 속성 에 대해 얕 은 복사 본 은 속성 값 을 새로운 대상 에 게 복사 하고 인용 유형의 속성 에 대해 얕 은 복사 본 은 인용 을 새로운 대상 에 게 복사 합 니 다.예 를 들 어
User
,String
와 같은 인용 유형 은 모두 변 하지 않 는 것 이 아니 라 복사 할 때 새로운 메모리 공간 을 만들어 값 을 저장 하고 새로운 인용 을 새로운 메모리 공간 으로 가리킨다.가 변 하지 않 는 유형 은 특수 한 인용 유형 입 니 다.우 리 는 우선 이러한Integer
유형의 응용 도 복사 값 이 라 고 생각 합 니 다.얕 은 복사 기능 실현
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Cloneable{
private int age;
private String name;
private Dept dept;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
어떻게 우리 의 결론 을 검증 합 니까?먼저 복 사 된 대상 과 원래 대상 이 같 는 지 비교 하고,다 르 지 않 으 면 새로 복 사 된 대상 임 을 설명 한다.그 다음 에 복사 대상 의 기본 유형 속성 을 수정 합 니 다.만약 에 원래 대상 의 이 속성 이 수정 되면 기본 유형의 속성 이 같은 것 임 을 설명 합 니 다.마지막 으로 복사 대상 의 인용 유형 대상 즉final
속성 을 수정 합 니 다.만약 에 원래 대상 의 이 속성 이 바 뀌 었 다 면 인용 유형의 속성 이 같은 것 임 을 설명 합 니 다.테스트 원 리 를 분명히 한 후에 우 리 는 테스트 코드 를 써 서 우리 의 결론 을 검증 했다.
public static void main(String[] args) throws Exception{
Dept dept = new Dept(12, " ");
User user = new User(18, "Java ", dept);
User user1 = (User)user.clone();
System.out.println(user == user1);
System.out.println();
user1.setAge(20);
System.out.println(user);
System.out.println(user1);
System.out.println();
dept.setName(" ");
System.out.println(user);
System.out.println(user1);
}
위의 코드 의 운행 결 과 는 다음 과 같다.false
User{age=18,name='Java',dept=Dept{deptNo=12,name='시장 부'}}
User{age=20,name='Java',dept=Dept{deptNo=12,name='시장 부'}}
User{age=18,name='Java',dept=Dept{deptNo=12,name='연구개 발 부'}}
User{age=20,name='Java',dept=Dept{deptNo=12,name='연구개 발 부'}}
3.딥 카피
얕 은 복사 에 비해 깊 은 복사 본 은 기본 유형의 속성 을 복사 하 는 것 외 에 인용 유형의 속성 도 복사 합 니 다.
딥 복사 기능 구현
복사
Dept
할 때user
중의user
속성 을 동시에 복사 합 니 다.dept
종류:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Dept implements Cloneable {
private int deptNo;
private String name;
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
dept
종류:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Cloneable{
private int age;
private String name;
private Dept dept;
@Override
protected Object clone() throws CloneNotSupportedException {
User user = (User) super.clone();
user.dept =(Dept) dept.clone();
return user;
}
}
얕 은 복사 테스트 코드 를 사용 하여 계속 테스트 합 니 다.실행 결 과 는 다음 과 같 습 니 다.false
User{age=18,name='Java 여행',dept=Dept{deptNo=12,name='시장 부'}}
User{age=20,name='Java 여행',dept=Dept{deptNo=12,name='시장 부'}}
User{age=18,name='Java 여행',dept=Dept{deptNo=12,name='연구개 발 부'}}
User{age=20,name='Java 여행',dept=Dept{deptNo=12,name='시장 부'}}
그 밖 에 반 서열 화 를 이용 하여 깊 은 복 사 를 실현 할 수 있다.먼저 대상 을 바이트 흐름 으로 서열 화한 다음 에 바이트 흐름 서열 을 대상 으로 하면 새로운 대상 이 생 길 수 있다.
이상 은 자바 의 깊이 있 는 복사 문 제 를 연구 하 는 상세 한 내용 입 니 다.자바 의 깊이 있 는 복사 에 관 한 자 료 는 우리 의 다른 관련 글 에 관심 을 가 져 주 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.