이 문서에서 내에서 무료 Java8 물론,나 논의 될 것입니다 사이의 차이는 깊고 얕은 복사합니다. 여기에서 슬라이드와 문서를 PDF 로 다운로드할 수 있습니다.복사본이란 무엇입니까?시작하려면 Java 의 사본이 무엇인지 강조하고 싶습니다. 먼저 참조 사본과 객체 사본을 구분할 수 있습니다. 이름에서 알 수 있듯이 참조 사본은 객체를 가리키는 참조 변수의 복사본을 만듭니다., 는 경우 우리는 자동차로 이 변수를 가리키고 우리에게 참조 복사,우리는 지금 두 가지 이 변수이지만,아직도 하나의 객체입니다.
예제 1
개체 복사본 복사본을 만들의 개체. 그렇다면 우리는 다시 복사한 우리의 자동차체,우리는 복사본을 만들의 개체뿐만 아니라,둘째 참조 변수를 참조하는 복사한 객체입니다.
예제 2
객체는 무엇입니까?,
깊은 사본과 얕은 사본은 모두 객체 사본의 유형이지만 실제로 객체는 무엇입니까? 자주 할 때,우리는 이야기에 대한 개체,우리는 그것을 하나의 단위로는 될 수 없는 좀 더 세분화,다음과 같은 겸손한 커피 콩. 그러나 그것은 지나치게 단순화되었습니다.
를 들어 3
말하는 사람은 개체입니다. 우리의 사람 객체는 사실 예제 4 에서 볼 수 있듯이 다른 객체로 구성됩니다. 우리 사람은 이름 객체와 주소 객체를 포함합니다., 이름은 차례로 FirstName 과 LastName 객체를 포함하며 Address 객체는 Street 객체와 City 객체로 구성됩니다. 그래서이 기사에서 사람에 대해 이야기 할 때 실제로이 전체 객체 네트워크에 대해 이야기하고 있습니다.
를 들어 4
그럼 왜 우리에 복사하려는 이 사람은 어떨까요? 일반적으로 복제품이라고하는 객체 사본은 원래 객체를 유지하면서 객체를 수정하거나 이동하려는 경우 생성됩니다. 다른 기사에서 배울 수 있는 개체를 복사 하는 많은 다른 방법이 있다., 이 문서에서 우리는 구체적으로 우리의 복사본을 만들 복사 생성자를 사용 하 여 있을 거 야.
얕은 복사
먼저 얕은 복사본에 대해 이야기하겠습니다. 객체의 얕은 사본은’주’객체를 복사하지만 내부 객체는 복사하지 않습니다. ‘내부 객체’는 원래 객체와 복사본간에 공유됩니다. 예를 들어,우리 사람 객체에서 두 번째 사람을 만들지 만 두 객체는 동일한 이름과 주소 객체를 공유합니다.
코딩 예제를 살펴 보겠습니다. 예제 5 에서는 이름과 주소 객체가 포함 된 클래스 사람이 있습니다., 복사 생성자는 originalPerson 객체를 가져 와서 참조 변수를 복사합니다.
예제 5
얕은 사본의 문제점은 두 객체가 독립적이지 않다는 것입니다. 한 사람의 이름 개체를 수정하면 변경 사항이 다른 사람 개체에 반영됩니다.이것을 예제에 적용 해 보겠습니다. 말로는 우리가 사람이 객체 참조를 변수의 어머니;그런 다음 우리는 복사본을 만들의 어머니를 만들고,두 번째 사람,아들입니다. 나중에 코드에서 아들이 자신의 주소 객체를 수정하여 moveOut()을 시도하면 어머니는 그와 함께 움직입니다!,
Person mother = new Person(new Name(…), new Address(…));Person son = new Person(mother);son.moveOut(new Street(…), new City(…));
예 6
이 발생하기 때문에 우리의 어머니와 아들 개체가 공유하는 동일한 주소체,당신이 볼 수있는 도시에서 예 7. 하나의 객체에서 주소를 변경하면 둘 다 변경됩니다!
예 7
깊은 복사
과는 달리 얕은 복사,깊은 복사가 완전히 독립적인 복의 개체입니다. 우리가 우리의 사람 객체를 복사한다면,우리는 전체 객체 구조를 복사 할 것입니다.,
를 들어 8
에 변화를 주는 객체의 한 사람이 있지 않을 것에 반영하는 다른 개체로 볼 수 있습으로 다이어그램에서 예 8. 예제 9 의 코드를 살펴보면 Person 객체에 복사 생성자를 사용하는 것뿐만 아니라 내부 객체에도 복사 생성자를 활용하고 있음을 알 수 있습니다.
예 9
를 사용하여 이 깊은 복사,우리는 다시 시도 할 수 있습니다 어머니를 아들 예를 들어 6. 이제 아들은 성공적으로 이사 할 수있게되었습니다!,
그러나 그것은 이야기의 끝이 아닙니다. 진정한 딥 복사본을 만들려면 기본 유형과”불변량”만 남을 때까지 Person 객체의 중첩 된 요소를 모두 계속 복사해야합니다. 보자에서 스트리트 등을 자세히 설명하기 위해 이다.
예 10
트 객체를 구성하는 두 개의 인스턴스의 변수 문자열 이름과 int 번호입니다. int number 는 객체가 아닌 원시 값입니다. 공유 할 수없는 단순한 값이므로 두 번째 인스턴스 변수를 생성하여 자동으로 독립적 인 복사본을 만듭니다., 문자열은 불변입니다. 요컨대,불변은 일단 생성되면 다시 변경할 수없는 객체입니다. 따라서,당신은 그것의 깊은 복사본을 만들 필요없이 그것을 공유 할 수있다.
결론
을 체결하고 일부에 대해 이야기 코딩 기술은 우리에 사용되는 우리의 어머니 아들은 예입니다. 깊은 사본이 주소 객체와 같은 객체의 내부 세부 사항을 변경하게한다고해서 그렇게해야한다는 의미는 아닙니다., 이렇게 하면 줄이드,품질 만들 것 같은 사람 등에 더 깨지기 쉬운 변화될 때마다 주는 등 변화해야 할 것입(잠재적으로)변경 사항을 적용합니다 사람이 있습니다. 는 경우,예를 들어,주소 등 더 이상 포함하는 개체는 거리,우리는 우리를 변경하는 특징:*매우 간단한 조작-선박()메소드는 사람 클래스에서 상단의 변화는 우리가 이미 만들어 주는 클래스입니다.
에서 예 6 의 이 문서에서만 사용하도록 선택한 새로운 스트리트와 도시는 개체를 더 잘 설명하기 위한 차이는 얕고 깊은 복사합니다., 대신,나는 추천에 할당하는 새로운 주소로체 대신,효과적으로 변환을 하이브리드의 얕고 깊은 복사에서 볼 수 있듯이 예 10:
Person mother = new Person(new Name(…), new Address(…));Person son = new Person(mother);son.moveOut(new Address(...));
예 11
에서 객체지향적 용어로,이를 위반 캡슐에 넣기,따라서 피해야한다. 캡슐화는 객체 지향 프로그래밍의 가장 중요한 측면 중 하나입니다. 이 경우 Person 클래스의 주소 객체의 내부 세부 정보에 액세스하여 캡슐화를 위반했습니다., 이는 해악을 우리의 코드를 가지고 있기 때문에 우리는 지금 얽혀있는 사람 등에서 주소스 그리고 만약 우리가 변화를 주는 등 선을 해칠 수 있는 사람이스 위에서 설명한 바와 같이. 하는 동안 당신은 분명히 필요한 상호 연결의 다양한 클래스를 코딩,프로젝트에 연결할 때마다 두 개의 클래스,분석해야 하는 비용과 혜택을 제공합니다.피>