자바 의 심도 있 는 복사 문 제 를 탐구 하 다.

머리말
복사 라 는 단 어 는 모두 가 잘 알 고 있 을 것 이다.업무 중 에 서 류 를 복사 해서 복사 해 야 한다.복사 의 장점 도 뚜렷 하 다.새로 만 드 는 것 에 비해 많은 작업량 을 절약 할 수 있다.자바 에 도 복사 라 는 개념 이 존재 하고 복사 의 의미 도 생 성 대상 의 비용 을 절약 할 수 있다.Object유형 중 한 가지 방법clone()이 있 는데 구체 적 인 방법 은 다음 과 같다.

protected native Object clone() throws CloneNotSupportedException;
1.이 방법 은protected으로 수식 되 어 있 으 며,자바 의 모든 종 류 는 기본적으로 계승Object류 이 며,과부하 후의clone()방법 은 다른 종 류 를 정상적으로 호출 할 수 있 도록 수정자public로 바 꿔 야 합 니 다.
2.이 방법 은native방법 으로native에 의 해 수식 되 는 방법 은 실제 적 으로 비 자바 코드 로 이 루어 진 것 으로 효율 은 일반 자바 방법 보다 높다.
3.이 방법의 반환 치 는Object대상 이기 때문에 우 리 는 우리 가 필요 로 하 는 유형 으로 강하 게 전환 해 야 한다.
4.이 방법 은 복사 가 지원 되 지 않 는 다 는 뜻 으로CloneNotSupportedException인 터 페 이 스 를 표시 해 야 합 니 다.이런 종류의 복사 가 지원 되 는 것 입 니 다.
프레젠테이션 의 편 의 를 위해 우 리 는 두 개의 실체 류CloneableDept를 신 설 했 는데 그 중에서UserUser에 의존 했다.실체 류 코드 는 다음 과 같다.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='시장 부'}}
그 밖 에 반 서열 화 를 이용 하여 깊 은 복 사 를 실현 할 수 있다.먼저 대상 을 바이트 흐름 으로 서열 화한 다음 에 바이트 흐름 서열 을 대상 으로 하면 새로운 대상 이 생 길 수 있다.
이상 은 자바 의 깊이 있 는 복사 문 제 를 연구 하 는 상세 한 내용 입 니 다.자바 의 깊이 있 는 복사 에 관 한 자 료 는 우리 의 다른 관련 글 에 관심 을 가 져 주 십시오!

좋은 웹페이지 즐겨찾기