본문 바로가기

📚Study Note/JAVA

[ JAVA ] 배열의 복사 - 얕은복사와 깊은복사 (주소값 복사와 데이터복사)

     마치 이런 것과 같다. 우리가 팀플을 한다. 내가 PPT의 원본을 가지고 있다고 할 때 그것을 팀원들과 공유하기 위해서 나는 클라우드 계정에 올려 팀원들에게 '이리 들어와서 봐' 라고 할 수 있고,  또는 파일의 원본을 팀원들에게 보낼 수 있다.  클라우드 계정에 올리는 것이 얕은 복사이고 직접 원본을 보내는 것이 데이터복사이다. 얕은 복사의 경우 내가 작업하는 내용이 바로바로 팀원들에게 보인다. 원본을 직접 보내면 그것은 이제 내 손을 떠난 아예 똑같은 복사본이다. 팀원들이 어떻게 고치든 그것은 이제 내 파일이 아니다. 

 

 ※ 배열 변수의 복사는 데이터 복사, 주소값 복사 두 가지 형태가 존재한다.
 주소값 복사(얕은 복사)→

원본을 수정하면 복사본에 영향을 미치게 되는 복사 방법
배열 뿐 아니라 모든 참조형 데이터에 해당하는 복사
 
 
 
 데이터 복사(깊은 복사)→

실제 요소로 들어있는 값에 대한 복사로
원본을 수정해도 복사본에 영향을 미치지 않는 복사 방법

 

 

public class Test097
{
	public static void main(String[] args)
	{
		int[] nums = {10, 20, 30, 40, 50};              // -- 배열 원본
		int[] copys;									// -- 복사본으로 만들 배열
		int temp;										// -- 실습진행(테스트)을 위한 임시 변수


		// check!! 
		copys = nums; //배열에 배열을 대입하겠다       // -- 복사

		temp = nums[0]; // nums배열의 첫번째 값 10을 넣겠다.


		nums[0] = 1500; //temp에 10을 넣고 10을 다시 1500으로 바꿨을 때 어떻게 될까?

		for (int i=0; i<copys.length;  i++)
		{
			System.out.printf("%d\t", copys[i]);
		}
		System.out.println();
/*
1500    20      30      40      50
계속하려면 아무 키나 누르십시오 . . .

*/ 

		System.out.println("temp : " + temp); //-==>>temp : 10  temp는 1500으로 바뀌지 않고 여전히 10이다. 
		
		
    }
}

 

 

 

 

 

 

 

public class Test098
{
	public static void main(String[] args)
	{
		int[] nums = {10 , 20, 30, 40, 50};
		int[] copy1 =nums;               //-- 얕은 의미의 배열 복사 수행(주소값 복사)
		

		int[] copy2 = copyArray(nums);    //--깊은 의미의 배열 복사 수행(사용자 정의 메소드 호출)


		int [] copy3 = (int[])nums.clone(); // -- 깊은 의미의 배열 복사 수행
										   // 자바가 제공하는 클론 메소드이다 
		// 원본 배열의 요소 수정 발생
		nums[1] = 20000;                   //--원본 배열 1번째 요소 20 → 20000

		// copy1 배열 전체 요소 출력
		for (int i=0; i<copy1.length; i++)
		{
			System.out.print(copy1[i] + " ");

		}System.out.println();
		//--==>> 10 20000 30 40 50

		for (int i=0; i<copy2.length; i++)
		{
			System.out.print(copy2[i] + " ");

		}System.out.println();
		//--==>> 10 20 30 40 50

		for (int i=0; i<copy3.length; i++)
		{
			System.out.print(copy3[i] + " ");

		}System.out.println();
		//-==>> 10 20 30 40 50

	}
	public static int[] copyArray( int[] os)
	{
		//os 방 이 몇 개이냐에 따라 똑같이 만드는 메소드

		int[] temp = new int[os.length];
		//즉 매개변수로 넘겨받은 배열, 즉 원본 배열 만큼의 배열방(메모리공간)을 
        //확보한 복사할 배열방을 생성하겠다.

		//각각의 원본 배열(os)에 담겨있는 요소들을 복사 배열 (temp)에 담아내기
		for (int i=0; i<os.length; i++)
		{
			temp[i] = os[i];
			
		}
		// 복사한 배열 반환
		return temp;

	}

}