Array 크기 변경하기

김운채·2023년 5월 11일
0

TIL

목록 보기
6/22

배열(Array)

배열은 인덱스를 이용해서 자료형이 같은 여러개의 데이터를 한번에 관리하는 것이다.

배열의 특징

① 배열은 같은 타입의 데이터만 저장할 수 있다.

int 배열은 int 값만 저장 가능하고, String 배열은 문자열만 저장한다.
또한 선언과 동시에 저장할 수 있는 타입이 결정된다. 만약 다른 타입의 값을 저장하려고 하면 타입 불일치(Type mismatch)컴파일 에러가 발생한다.

② 한 번 생성된 배열은 길이를 늘리거나 줄일 수 없다.

🤷‍♀️ 왜 크기를 고정해놓았을까?
크기가 고정되어있고, 참조를 위한 추가적인 메모리 할당이 없기 때문에 작고 가볍고 단순하다.
크기를 고정해서 인덱스를 부여하므로, 검색이 빠르고 효율적이다.

배열의 선언

두가지로 선언이 가능하다.

1) 타입[] 변수;

int[] intArray;
double[] doubleArray;
String[] strArray;

2) 타입 변수[];

int intArray[];
double doubleArray[];
String strArray[];

배열의 메모리 크기

배열은 구성하는 데이터의 자료형에 따라서 배열의 메모리 크기가 결정된다.

배열 변수는 참조 변수에 속한다.

🙋‍♀️ 엇? 참조변수? 혹시 힙영역? 했다면 정답이다.

배열도 객체이므로 힙 영역에 생성되고 배열 변수는 힙 영역의 배열 객체를 참조한다.
만일 참조할 배열 객체가 없다면, 배열 변수는 null 값으로 초기화될 수 있다.

int[] intArray = new int[5];

1차원 메모리 구조인 배열이다.

int는 4byte 이므로 요놈을 5개 가지고 있으니 배열은 20 byte 이다.
int는 1byte 4개이니, 총 1byte * 20 인것이당

그럼 2차원 배열 메모리구조는 어떨까?

int[][] arr = {{0,1, 2}, {3, 4}};

세로형 1차원배열이 가로형 1차원 배열을 참조하고 있다고 이해하면 쉬울것이다.

배열의 크기 변경

ㄱ나니? 아까 배열의 크기는 고정크기라고 했다. 배열은 선언과 동시에 고정된 크기를 가지므로 배열의 크기를 직접적으로 변경하는 것은 불가능하며, Java에서도 배열의 크기를 변경하는 기능을 제공하지 않는다.

하지만, 배열을 생성하고 복사하여 배열의 크기가 변경된 것처럼 동작하도록 소스 코드를 구현할 수 있다.

반복문을 돌려 하나씩 복사하는 방법도 있지만 이것 이외에도 두가지의 변경방법이 있다.

1. Arrays 클래스의 copyOf 메서드

Arrays 클래스에서 제공하는 copyOf() 메서드를 사용하여 기존 배열에서 특정 크기(데이터의 개수)로 설정되는 새로운 배열을 생성 후 기존 배열에 할당하는 방법이다.

public static <T> T[] copyOf(T[] original, int newLength)

파라미터로 받은 original 배열을 복사해서, 새로운 배열을 만들어서 리턴한다.
새로운 배열의 크기를 int newLength로 넣어준다.

newLength가 기존 배열의 크기보다 큰 경우, 남은 공간을 int 타입은 0으로 할당하며, boolean 타입은 false를, String / 참조 타입은 null로 할당한다.

public class MainForm {
  public static String[] setSizeStringArray(String[] srcArray, int size) {
    String[] newArray = Arrays.copyOf(srcArray, size);
    return newArray;
  }

  public static void main(String args[]) {
    String[] stringArray = {"One", "Two", "Three"};
    System.out.println("String 타입의 배열의 크기 변경 전: " + Arrays.toString(stringArray));

    stringArray = setSizeStringArray(stringArray, 6);
    System.out.println("String 타입의 배열의 크기 6으로 변경 후: " + Arrays.toString(stringArray));
  }
}
String 타입의 배열의 크기 변경 전: [One, Two, Three]
String 타입의 배열의 크기 6으로 변경 후: [One, Two, Three, null, null, null]

2. System 클래스의 arraycopy메서드

arraycopy() 메서드는 5개의 매개변수(파라미터)를 가진다.

public static native void arraycopy(Object src,  int srcPos,Object dest, int destPos,int length);
  • Object src : 원본 배열
  • int srcPos : 원본배열에서 데이터를 읽을 시작 인덱스
  • Object dest : 새로운 배열
  • int destPos : 새 배열의 붙여넣을 시작 인덱스
  • int length : 복사할 개수

원본 배열의 길이보다 큰 값이 전달되는 경우, ArrayIndexOutOfBoundsException이 발생한다.

copyOf() 메서드와 마찬가지로 int 타입은 추가된 공간을 0, boolean 타입은 추가된 공간을 false, String 타입은 추가된 공간을 null로 할당한다.

0개의 댓글