2014년 2월 19일 수요일

25. [닷넷,C#강좌](Object Clone)깊은 복사(Deep Copy), 얕은 복사(Shallow Copy),C#닷넷객체복제 객체를 복제하는 방법은 얕은복사(Shallow Copy) 깊은복사(Deep Copy)가 있다. 어떤 객체가 그안에 다른 객체를 포함하고 있다고 했을 때 일반적인 얕은 복사 방식으로는 내부에 포함된 객체는 참조만 복제가 된다. 그러므로 내부에 참조된 객체의 값을 확실히 복사하기 위해서는 깊은복사라고 하여 일일이 값을 복사해 줘야 한다. 닷넷 프레임워크 Object 클래스의 MemberwiseClone 메서드를 이용하면 얕은복제를 편하게 할 수 있다. 아래 예제는 간단히 얕은 복사를 구현한 것이다. Onj클래스안에 OracleJava라는 클래스를 포함하고 있다. 실습하면서 얕은복사를 이해해 보자. using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication2 { class Onj { public string name { get; set; } public OracleJava oraclejava { get; set; } public object ShallowCopy() { return this.MemberwiseClone(); } } class OracleJava { public string name { get; set; } } class Test { static void Main(string[] args) { //원본 Onj onj1 = new Onj(); onj1.name = "오엔제이"; onj1.oraclejava = new OracleJava(); onj1.oraclejava.name = "오라클자바커뮤니티"; //얕은 복사 Onj onj2 = (Onj)onj1.ShallowCopy(); onj2.oraclejava.name = "ORACLEJAVANEW.KR"; //두 객체 비교 - onj1, onj2 WriteLine(onj1); WriteLine(onj2); } static void WriteLine(Onj onj) { Console.WriteLine(String.Format("이름:{0},이름2:{1}", onj.name, onj.oraclejava.name)); } } } [결과] 이름:오엔제이,이름2:ORACLEJAVANEW.KR 이름:오엔제이,이름2:ORACLEJAVANEW.KR 이번에는 깊은 복사에 대해 알아보자. 객체가 참조타입의 멤버를 포함할 경우 참조 값의 복사가 아닌 참조된 객체 자체가 복제되는 것을 깊은 복사(Deep Copy)라고 한다. 이전예제의 onj1, onj2 객체가 완전히 다른 객체가 되도록 하는 것이다. ICloneable 인터페이스 닷넷 프레임웍에서는 이와 같이 깊은 복사를 위해 ICloneable 인터페이스를 제공하는데 단 하나의 메서드, Clone 메서드가 정의되어 있다. (프레임웍 내의 클래스라이브러리에 수많은 클래스들이 이 인터페이스를 구현하여 실제 객체 복사를 지원한다) using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication2 { class Onj : ICloneable { public string name { get; set; } public OracleJava oraclejava { get; set; } public object Clone() { Onj onj = new Onj(); onj.name = this.name; onj.oraclejava = new OracleJava(); onj.oraclejava.name = this.oraclejava.name; return onj; } } class OracleJava { public string name { get; set; } } class Test { static void Main(string[] args) { //원본 Onj onj1 = new Onj(); onj1.name = "오엔제이"; onj1.oraclejava = new OracleJava(); onj1.oraclejava.name = "오라클자바커뮤니티"; //깊은 복사 Onj onj2 = (Onj)onj1.Clone(); onj2.oraclejava.name = "oraclejavanew.kr"; //두 객체 비교 - onj1, onj2에서 OracleJava는 값이전달되는것이 아니라 참조가 전달 WriteLine(onj1); WriteLine(onj2); } static void WriteLine(Onj onj) { Console.WriteLine(String.Format("이름:{0},이름2:{1}", onj.name, onj.oraclejava.name)); } } } [결과] 이름:오엔제이,이름2:오라클자바커뮤니티 이름:오엔제이,이름2:oraclejavanew.kr [출처] 오라클자바커뮤니티 - http://www.oraclejavanew.kr/bbs/board.php?bo_table=LecCsharp&wr_id=152 자바 오라클/빅데이터 아이폰/안드로이드 닷넷/WPF 표준웹/HTML5 채용/취업무료교육 초보자코스 [기업100%환급]Spring ,MyBatis,Hibernate실무과정 총 5일 40시간 02-24 [기업100%환급]자바기초에서 JDBC, Servlet/JSP까지 총 5일 40시간 03-03 Spring3.X, MyBatis, Hibernate실무과정 총 12일 36시간 03-03 자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지 총 24일 72시간 03-14 [주말저녁]자바기초에서JSP,Servlet,Ajax,jQUERY,스프링,마이바티스,하이버네이트 총 18일 72시간 02-22 자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지 총 10일 70시간 03-01 Spring3.X, MyBatis, Hibernate실무과정 총 5일 35시간 03-09

25. [닷넷,C#강좌](Object  Clone)깊은 복사(Deep Copy), 얕은 복사(Shallow Copy),C#닷넷객체복제

객체를 복제하는 방법은 얕은복사(Shallow Copy) 깊은복사(Deep Copy)가 있다. 어떤 객체가 그안에 다른 객체를 포함하고 있다고 했을 때 일반적인 얕은 복사 방식으로는 내부에 포함된 객체는 참조만 복제가 된다. 그러므로 내부에 참조된 객체의 값을 확실히 복사하기 위해서는 깊은복사라고 하여 일일이 값을 복사해 줘야 한다.

닷넷 프레임워크 Object 클래스의 MemberwiseClone 메서드를 이용하면 얕은복제를 편하게 할 수 있다.

아래 예제는 간단히 얕은 복사를 구현한 것이다. Onj클래스안에 OracleJava라는 클래스를 포함하고 있다. 실습하면서 얕은복사를 이해해 보자.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication2
{
    class Onj
    {
        public string name
        {
            get;
            set;
        }
        public OracleJava oraclejava
        {
            get;
            set;
        }
        public object ShallowCopy()
        {
            return this.MemberwiseClone();
        }
    }
    class OracleJava
    {
        public string name
        {
            get;   set;
        }
        
    }
    class Test
    {
        static void Main(string[] args)
        {
            //원본
            Onj onj1 = new Onj();
            onj1.name = "오엔제이";
            onj1.oraclejava = new OracleJava();
            onj1.oraclejava.name = "오라클자바커뮤니티";
            //얕은 복사
            Onj onj2 = (Onj)onj1.ShallowCopy();
            onj2.oraclejava.name = "ORACLEJAVANEW.KR";
            //두 객체 비교 - onj1, onj2
            WriteLine(onj1);
            WriteLine(onj2);
        }
        static void WriteLine(Onj onj)
        {
            Console.WriteLine(String.Format("이름:{0},이름2:{1}", onj.name, onj.oraclejava.name));
        }
    }
}

[결과]

이름:오엔제이,이름2:ORACLEJAVANEW.KR
이름:오엔제이,이름2:ORACLEJAVANEW.KR







이번에는 깊은 복사에 대해 알아보자.

객체가 참조타입의 멤버를 포함할 경우 참조 값의 복사가 아닌 참조된 객체 자체가 복제되는 것을 깊은 복사(Deep Copy)라고 한다. 이전예제의 onj1, onj2 객체가 완전히 다른 객체가 되도록 하는 것이다.

ICloneable 인터페이스

닷넷 프레임웍에서는 이와 같이 깊은 복사를 위해 ICloneable 인터페이스를 제공하는데 단 하나의 메서드, Clone 메서드가 정의되어 있다.
(프레임웍 내의 클래스라이브러리에 수많은 클래스들이 이 인터페이스를 구현하여 실제 객체 복사를 지원한다)

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;



namespace ConsoleApplication2
{

    class Onj : ICloneable
    {

        public string name
        {
            get;
            set;
        }

        public OracleJava oraclejava
        {
            get;
            set;
        }

        public object Clone()
        {
            Onj onj = new Onj();
            onj.name = this.name;
            onj.oraclejava = new OracleJava();
            onj.oraclejava.name = this.oraclejava.name;
            return onj;
        }
    }

    class OracleJava
    {

        public string name
        {
            get;
            set;
        }        
    }

    class Test
    {
        static void Main(string[] args)        {
            //원본
            Onj onj1 = new Onj();
            onj1.name = "오엔제이";
            onj1.oraclejava = new OracleJava();
            onj1.oraclejava.name = "오라클자바커뮤니티";

            //깊은 복사
            Onj onj2 = (Onj)onj1.Clone();
            onj2.oraclejava.name = "oraclejavanew.kr";

            //두 객체 비교 - onj1, onj2에서 OracleJava는 값이전달되는것이 아니라 참조가 전달
            WriteLine(onj1);
            WriteLine(onj2);
        }

        static void WriteLine(Onj onj)
        {
            Console.WriteLine(String.Format("이름:{0},이름2:{1}", onj.name, onj.oraclejava.name));
        }
    }

}

[결과]
이름:오엔제이,이름2:오라클자바커뮤니티
이름:오엔제이,이름2:oraclejavanew.kr

댓글 없음:

댓글 쓰기