210809

Joy·2022년 2월 16일
0

JAVA

목록 보기
9/22

배열

  • 배열(Array)

같은 자료형이 변수를 하나의 묶음으로 다루는 것

배열은 저장된 값마다 인덱스 번호0부터 시작하여 설정



  • 배열 선언과 할당

배열은 선언하고 바로 초기화를 해주는 것이 아닌, 할당을 해주어야 한다.

  • 배열 선언(대괄호 붙이기)

(1) 자료형[ ] 배열명;
(2) 자료형 배열명[ ];

  • 배열 할당

(1)자료형[ ] 배열명 = new 자료형[배열크기];
(2) 자료형 배열명[ ] = new 자료형[배열크기];

ex) int[ ]  arr = new int[3];
    int  arr[ ] = new int[3];

*배열은 할당이 되면 그 크기가 fix가 되므로 배열의 크기는 할당된 뒤로는 바뀔 수 없다.

  • 배열 저장구조

배열은 참조변수로 Heap영역에 할당되며 배열 공간의 주소를 저장한다.

배열 공간의 주소를 이용해 인덱스를 참조하는 방식으로 값을 처리한다.

메모리는 효율적인 관리를 위해서 Stack, Heap, Static 영역으로 나뉘어 저장이 이루어진다.
일반적인 변수들은 Stack 영역에 저장이 되고, new 연산자에 의해서 할당된 내용은 Heap영역에 저장이 된다.
arr이라고 하는 이름을 가진 배열의 주소 값을 참조할 수 있는 참조변수는 Stack 영역에 저장
new 연산자에 의해 할당된 int0 4개 크기의 배열은 Heap 영역에 저장
Heap 영역에 할당된 주소 값이 1234 번지라면 그 값이 arr이라고 하는 이름의 참조변수에 똑같이 저장이 되어서
index를 참고하여 각각의 값에 접근할 수 있게 되는 것

  • 배열 초기화
  • 인덱스를 이용한 초기화

각각의 인덱스에 직접적으로 대입하는 방법

알아보기는 쉬우나 구현하는데 귀찮음

ex) arr[0] = 1;
    arr[1] = 2;
  • for문을 이용한 초기화

*index가 순차적으로 증가함에 따라 초기화할 리터럴 값이 규칙적이라면 반복문을 통해 배열 초기화 가능

ex) for(int i = 0; i < arr.length; i++) {
          arr[i] = i;
    }

*배열의 길이를 알고 싶다면 arr(=대열명).length 활용

  • 선언과 동시에 초기화

중괄호를 이용해 직접적으로 리터럴을 나열해서 초기화해주는 방법

ex) int[ ] arr = {1, 2, 3, 4, 5};
    int[ ] arr = new int[ ] {1, 2, 3, 4, 5};
    String fruit[ ] = {"사과", "포도", "참외"};

  • 배열 복사
  • 얕은 복사

객체의 주소 값만 가져와 참조형 변수에 저장하고 하나의 객체를 두 변수가 참조하는 것

ex) int[ ]  arr1 = new int[4];
    int[ ]  arr2 = arr1;

  • 깊은 복사

새로운 배열 객체를 생성하여 기존 배열의 데이터를 복사하는 것

ex) //for문을 이용한 복사
    for(int i = 0; i < arr1.length; i++) {
                 arr2[i] = arr1[i];
    }

    //arraycopy 사용(지정된 범위의 값을 한 번에 통째로 복사하는 방법. 배열을 보다 간단하고 빠르게 복사 가능)
    System.arraycopy(arr1, 0, arr2, 0, arr1.length);
    //-> arr1, 0(=from) 에서부터 arr2, 0(=to) 까지 arr1.length의 길이만큼 통째로 복사하겠다.

    //Arrays 라는 객체 사용(배열을 보다 쉽게 사용할 수 있음)
    arr2 = Arrays.copyOf(arr1, arr1.length);
    //-> arr2에 arr1을 arr1의 길이(=arr1.length)만큼 복사해서 대입하겠다.

    //clone method 활용(객체의 복제품을 만들어 주는, 배열을 복사할 때 제일 간편한 방법. but 추후에 다른 객체를 복사할 때 문제가 발생할 수 있음)
    arr2 = arr1.clone();

Heap 영역에 2개의 객체 존재(arr1 주소 값 : 1234, arr2 주소값 : 5678)
2개는 서로 다른 주소를 참조하고 있음
arr1의 데이터를 arr2로 복사하려는 상황

  • 얕은 복사 test

  • 깊은 복사 test
  • for문 이용

  • arraycopy() 이용

  • Arrays.copyOf() 이용

profile
👻

0개의 댓글