[Java] 인덱스로 데이터 가져올수 있는 원리, 얕은복사, 깊은복사 차이와 방법

    [배열 객체 생성 방법]

    배열은 같은 타입의 데이터를 연속된 공간으로 나열하고, 각 데이터에 인덱스를 부여해 놓은 자료구조 이다.

     

    배열 생성할때 값을 초기화 할수 있는데 첫번째 방식으로 scores1은 new int[]  뒤에 값들이 놓여져 있고 scores2는 값들로만 초기화를 하였고 3번째는 배열 변수를 선언하고 값으로만 초기화 하려고했는데 에러가 발생하였다.

    scores2가 되는걸로 보아서 아마 컴파일러딴에서 변수 앞에 자료형이 있으면 자동으로 뒤에 new int[] 가 붙게 하는것 같다.

     

    스택에 생성된 scores1의 값은 인덱스를 통해 각 값을 가져올 수 있다. scroes1[2] 은 87를 가져온다. 그럼 어떻게 값을 가

    져올 수 있을까? 저장된 메모리 구조를 보면 이해 된다.

    [인덱스로 데이터를 가져올 수 있는 이유]

    스택안에 있는arr는 scores1이다 그 안에 heap사이즈에 생성된 배열주소의 첫번째 인덱스만 주소를 가져오고 힙사이즈 안에있는 배열은 주소가 4씩 차이가 난다. 4가 차이나는 이유는 int는 4byte이기 때문이다 즉 첫번째 인덱스만 스택에 가지고있고 인덱스 2번의 주소를 가져올때는 int가 4byte이니 4000 + 8이 붙어 4008의 주소값을 가져오기 때문에 인덱스로 데이터를 가져올 수 있는것이다.   만약에 char 형 배열이였으면 char는 2byte이니 2번째 인덱스는 처음 주소값 + 4가 되어 4004의 주소값을 참조했을 것이다.

     

     

    [2차원 배열 메모리 사용구조]

    2차원 배열은 new [행][열] 로 만들어 진다  행은 힙영역에서 행 개수에 맞게 배열이 생성되고 각 인덱스에는 힙 영역에 생성된 열의 배열의 주소가 있다.

     

     

    [배열 복사 2가지 유형(얕은복사, 깊은복사)]

    배열을 복사하려고 했을때 흔히 아래처럼 대입 연산자로 복사하려고 했을 것이다. 이거는 단순히 oldIntArray의 힙영역에 있는 배열의 주소값을 newIntArray에 복사해준것이다. 그러므로 같은 힙영역에 있는 배열 객체를 공유하기 때문에 한쪽에서만 변경해도 참조되는 old와 new가 아래처럼 둘다 변경된다. 이것을 얕은복사(shallow copy) 라고 한다.

    int[] oldIntArray = new int[]{83, 90, 87, 24, 95};
    int[] newIntArray = oldIntArray;
    
    oldIntArray[0] = 10;
    System.out.println(oldIntArray[0]); //10
    System.out.println(newIntArray[0]); //10

     

    진짜로 값만을 복사하고 싶으면 힙영역에 새로운 객체를 만들어서 그 힙영역에 있는 배열에 복사하고 싶은 배열의 값을 넣어줘야 한다. 이것을 일명 깊은복사(deep copy)라고 한다.

     

    [딥카피 Sytem.arraycopy() 함수 사용법]

    딥카피는 System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length) 함수를 사용하면 된다. 

    src는 복사할 원본배열, srcPos는 복사할 원본배열에서 복사 시작 인덱스, dest는 새배열, destPos는 새배열의 몇번째 인덱스부터 복사할것인지이고 length는 복사할 개수이다.   

    String[] oldStrArray = {"java", "array", "copy"};
    
    String[] newStrArray = new String[5];
    
    System.arraycopy(oldStrArray, 0, newStrArray, 0, oldStrArray.length);
    
    for (String str : newStrArray) {
    	System.out.println(str); //{"java", "array", "copy", null, null}
    }

     

    참고 : 혼자 공부하는 자바 / 신용권  https://www.yes24.com/Product/Goods/74269939  

    참고 : https://www.pepcoding.com/resources/online-java-foundation/function-and-arrays/arrays_memory_management/topic

    댓글

    Designed by JB FACTORY