프로그래밍 언어/JAVA

JAVA) 기본 배열의 선언, 출력, 추가, 변경, 삭제, 찾기

luana_eun 2022. 2. 24. 11:51
728x90

1. 배열의 저장 공간

메모리의 Heap영역안에 배열을 저장할 공간을 할당받는다.

다른 int, double 등 기본 데이터타입은 변수가 그 데이터 자체를 저장하고있지만,

배열은 변수가 배열이 저장된 주소를 가리킨다. 

 

따라서 배열을 출력하면 값이 아니라 이상한값이 나온다. 

int a = 10;
int arr3[] = { 1, 2 };

System.out.println(a);		// 10
System.out.println(arr3);	// [I@6f2b958e

분명 배열에 {1, 2}를 넣었는데 출력해보니 다른게 나온다. 

즉, 변수에는 배열이 저장된 장소의 주소값이 들어있는것이다. 

 

 

 

 

2. 배열 선언

자바의 기본 배열은 만들때 크기를 지정해야한다. 

1) 선언만

   선언만 하면 아직 메모리에 저장할 공간이 생기기 전이다. 

int[] arr1;

2) 선언 후 크기 지정

   변수명 = new 데이터타입[크기];

   new연산자를 통해 메모리에 저장할 공간을 할당받는다. 

int[] arr1;
arr1 = new int[5];

3) 선언과 크기 기정 동시에

  데이터타입[] 변수명 = new 데이터타입[배열크기];

int[] arr1 = new int[5];

4) 선언과 데이터 바로 넣기

int[] arr1 = { 1, 2, 3, 4, 5 };

 

 

 

 

3. 배열 전체 출력

1) 반복문으로

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

 

2) 한번에 전체 출력: Arrays클래스의 toString()메서드 활용

System.out.println("arr1: " + Arrays.toString(arr1));

// 결과: arr1: [1, 2, 3, 4, 5]

 

 

 

 

4. 값 추가

자바의 기본 배열은 미리 크기를 지정해야한다고 했다. 

따라서 자리가 남아있는 경우에만 값을 넣을 수 있고, 그 이상으로 넣고싶으면 새로운 배열을 선언해야한다. 

 

만약 아래와 같이 arr배열에 1,2, 를 넣어 크기가 2인 배열을 선언하고 인덱스 2자리에 3을 추가하려고하면

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

java.lang.ArrayIndexOutOfBoundsException: Index 2 out of bounds for length 2 이와같은 오류가 난다. 

추가하려는 값이 배열의 인덱스를 넘어갔다는 오류인데, 

인덱스는 0부터 시작하고 인덱스 2자리가 들어갈 자리가 없기 때문이다. 

따라서 이때는 배열을 새로 선언해야한다. 

 

1) 인덱스로 해당 위치에 넣기(자리가 있을 경우)

int[] arr = new int[5];
System.out.println(Arrays.toString(arr3));	// [0, 0, 0, 0, 0]
arr3[2] = 3;	// 인덱스 3자리에 3이라는 값 추가
System.out.println(Arrays.toString(arr3));	// [0, 0, 3, 0, 0]

2) 자리가 다 찼으면 새로운 배열 생성

int arr = {1, 2};
System.out.println(Arrays.toString(arr));	// [1, 2]

arr = new int[] {1, 2, 3};		// 새로운 값 3추가
System.out.println(Arrays.toString(arr));	// [1, 2, 3]

값을 추가하려했을 뿐인데 new연산자를 통해 새로운 배열을 생성해야 한다. 

기존의 배열이 변경된 것이 아니라 새로운 배열을 생성했다. 

 

어 근데 자바에서는 변수명이 중복되면 안되는데, 변수명은 똑같은데 새로운 배열이라고??

맨위에 [1번 배열의 저장공간]을 보면, 변수는 배열의 주소를 저장한다고 했다.

실제 배열은 새로 생성된 것이고, 변수가 가르키는 주소가 변하게되어 변수명은 그대로 쓰는것이다.

=> 새로운 배열이 생성되었고, 변수가 가리키는 주소가 바뀐다. 

 

그럼 새로운게 생성됐으면, 기존 배열은 어떻게 되는가?

C언어의 경우, 개발자가 기존배열은 처리하는 작업을 직접해야해서

                  까먹고 처리를 안하면 안쓰는데도 공간을 차지하여 자원이 낭비될 수 있다. 

하지만 자바는 알아서 처리해주기 때문에 신경쓸 필요가 없다😊

 

 

 

 

 

5. 값 변경

인덱스로 접근해서 변경

int[] arr = {1, 2, 3};
System.out.println(Arrays.toString(arr));	// [1, 2, 3]

arr[0] = 0;	// 0의자리에 1을 0으로 변경
System.out.println(Arrays.toString(arr));	// [0, 2, 3]

 

 

 

 

6. 해당 요소 삭제

ArrayList가 아닌 기본배열에서는 사실상 삭제는 할 수 없다. 

삭제가 아닌 0으로 초기화 또는 null값을 넣어야한다. 

null값을 넣으면 배열을 읽을 때 NullPointerException 에러가 나므로 0으로 초기화하는것이 좋다. 

 

 

 

 

7. 찾기

1) 해당 값이 있는지 없는지 여부

   >> 문자열: Arrays.stream(배열).anyMatch(특정 값::equals);

String[] srr = {"가", "나", "다"};

System.out.println(Arrays.stream(srr).anyMatch("가"::equals));	// true
System.out.println(Arrays.stream(srr).anyMatch("차"::equals));	// false

   >> 숫자: IntStream.of(배열).anyMatch(x -> x == 특정 숫자);

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

System.out.println(IntStream.of(arr).anyMatch(x -> x == 2));	// true
System.out.println(IntStream.of(arr).anyMatch(x -> x == 5));	// false

위 두개는 자바 8버전 이상부터 사용 가능하고, 그 이하는 아래의 방법을 써야한다. 

Arrays.asList(배열).contains(특정 값);

 

 

2) 해당 값의 위치 찾기(문자열)

String[] srr = {"가", "나", "다"};

System.out.println("인덱스 번호: " + Arrays.asList(srr).indexOf("다"));	// 2

 

728x90