SSISO Community

시소당

배열의 복사

일반적인  객체처럼  배열  또한  복사가  되지  않습니다.  그래서  자바에서  배열을  복사하기  위한  방법을  몇  가지  제시하고  있습니다.  물론,  우리는  아직  객체  복사라는  것을  배우지  않았습니다.  객체  복사는  10장의  Object의  clone메서드에서  배우게  될  것입니다.  우선적으로  여기서는  배열의  복사라는  것을  배워  보도록  하겠습니다.

  

배열복사는  System.arraycopy를  이용하는  방법과  배열  자체의  clone메서드를  이용하는  방법으로  나눌  수  있습니다.  이  두  방법에  대한  예를  살펴  보도록  하겠습니다.

  

배열을  복사하는  방법

n                  System.arraycopy를  이용하는  방법

n                  배열  자체의  clone메서드를  이용하는  방법

  

일단  System.arraycopy메서드부터  살펴  보도록  하죠.

  

System.arraycopy메서드  세부사항

public  static  void  arraycopy(Object  src,                  /*원본배열.*/
                                                          int  src_position,      /*원본배열의  시작위치*/
                                                          Object  dst,                /*복사할  배열*/
                                                          int  dst_position,      /*  복사할  배열의  시작위치  */
                                                              int  length)                /*복사할  개수.*/  

특별한  것은  없습니다.  src는  원본  배열이고  src_position은  원본의  어디서부터  복사를  시작할  것인지를  결정해  줍니다.  그리고  dst는  복사하려고  하는  배열이며  dst_position은  복사할  배열의  첫  위치를  말합니다.  마지막으로  length는  복사하려고  하는  배열의  개수를  정해주면  시작위치부터  복사할  개수만큼  배열을  복사하게  됩니다.  위의  메서드를  이용한  예를  만들어  보도록  하겠습니다.  

ArrayTest.java  (System.arraycopy메서드를  테스트하기  위한  예제)
public  class  ArrayTest{
                          public  static  void  main(String[]  args){
                                                      int[]  mydream    =  new  int[]{5,  4,  6,  9,  7,  9};
                                                      int[]  mytarget  =  {100,  200,  300,  400,  500,  600,700};
                                                      System.arraycopy(mydream,  2,  mytarget,  3,  4);
                                                      for(int  i=0;  i<mytarget.length;  i++){
                                                                                System.out.println("mytarget["+i+"]:"  +  mytarget[i]);
                                                      }
                          }

}

C:\examples\6.  Array>javac  ArrayTest.java
C:\examples\6.  Array>java  ArrayTest
mytarget[0]:100
mytarget[1]:200
mytarget[2]:300
mytarget[3]:6
mytarget[4]:9
mytarget[5]:7
mytarget[6]:9  

위의  예에서  배열의  복사라는  측면에서,  arraycopy메서드의  사용방법을  정확하게  볼  수  있습니다.  그리고  배열의  선언과  초기화를  동시에  하는  2가지  방법적인  측면에서도  이  예제를  관찰해  보시기  바랍니다.  

배열  선언과  초기화를  동시에  하는  방법
n                int[]  mydream    =  new  int[]{5,  4,  6,  9,  7,  9};
n                int[]  mytarget  =  {100,  200,  300,  400,  500,  600,700};  

이  예제에서  하나  더  여러분에게  강조하고  싶은  것이  있다면  배열의  전체  개수를  알고자할  때  배열의  length멤버필드를  이용하면  된다는  것입니다.  

    배열의  개수를  알고자  할  때
n                  mydream.length
n                  mytarget.length  

배열에  length필드는  배열의  전체  개수를  담고  있습니다.  그리고  배열에  점(.)찍고  사용할  수  있는  것은  배열이  객체라는  것을  말해  주는  부분입니다.  

최종적으로  mydream의  2번째(0,1,2번째)부터  4개를  복사하는데  mytarget의  3번?(0,1,2,3번째)부터  4개를  복사하라는  명령을  수행하게  됩니다.  이  명령은  다음과  같습니다.  

n                  System.arraycopy(mydream,  2,  mytarget,  3,  4);  

결과를  잘  살펴  보시기  바랍니다.  mydream의  2번째(0,1,2)  요소부터  4개가  복사  되었을  것입니다.  그리고  mytarget에서는  3번째(0,1,2,3)부터  복사가  이루어지고  있을  것입니다.  

다음으로  clone을  이용한  배열  복사방법을  알아  보도록  하겠습니다.

ArrayCloneTest.java
public  class  ArrayCloneTest{
                          public  static  void  main(String[]  args){
                                                      int[]  mydream    =  new  int[]{5,  4,  6,  9,  7,  9};
                                                      int[]  mytarget  =  (int[])mydream.clone();                                                    

                                                      for(int  i=0;  i<mytarget.length;  i++){
                                                                                System.out.println("mytarget["+i+"]:"  +  mytarget[i]);
                                                      }
                          }
}

C:\examples\6.  Array>javac  ArrayCloneTest.java
C:\examples\6.  Array>java  ArrayCloneTest
mytarget[0]:5
mytarget[1]:4
mytarget[2]:6
mytarget[3]:9
mytarget[4]:7
mytarget[5]:9  

배열  객체에서  clone()  메서드를  이용하여  객체를  복사할  수  있습니다.  clone메서드는  메모리를  복사하여  Object형의  객체를  리턴하고  있습니다.  외부에서는  변수를  선언하여  받기만하면  되는  것이지요.  하지만  clone메서드가  Object형을  리턴하고  있기  때문에  int[]형의  데이터  타입으로  다운캐스팅을  해서  배열의  형태로  만들어  주어야  합니다.  

n                  int[]  mytarget  =  (int[])mydream.clone();  

이  한줄이  clone메서드를  사용하는  전부입니다.  mydream을  복사하면  당연히  int[]이  되지만  clone자체가  Object형을  리턴하기  때문에  여러분이  직접  강제적으로  다운캐스팅을  해주어야  합니다.  그리고,  만약  잘못된  다운캐스팅을  한다면  실행시에  멋진  에러를  만나게  될  것입니다.  반드시  다운캐스팅할  때에는  원래의  형으로  다운캐스팅해주어야  합니다.  자바의  철칙과  같죠.  물론  다른  언어에서도  마찬가지입니다.

출처  :  http://www.jabook.org/jabook/jabook05/10000_10000_37500__10000_10000_37500.html

653 view

4.0 stars