Memo/짧은 메모

String 배열의 초기값과 가변 배열(NullPointerException)

생각없이 해도 생각보다 좋다. 2022. 9. 27. 20:54

>초기값

: String 배열 생성 시, 값을 지정해주지 않으면 모든 값은 null을 할당한다.

String[][] output1 = new String[3][];
System.out.printf("output1 : %s%n", Arrays.toString(output1));
//Array.toString(arr)은 참조변수인 배열을 주소값이 아닌 진짜값을 나타내기 위함.

String[][] output2 = new String[3][2];
System.out.printf("output2 : %s%n", Arrays.deepToString(output2));
//Arrays.deepToString(arr)은  이중 배열을 주소값이 아닌 진짜값을 나타내기 위함.

/*
output1 : [null, null, null]
output2 : [[null, null], [null, null], [null, null]]
*/

>발생했던 문제

: for문을 통해 (이차원 배열 -> 이차원 배열)을 복사하는 과정에서  복사받는 이차원 배열의 길이를 선언하지 않았음.

: 2차원 배열은 가변 배열이기 때문에 2차원 배열의 '열'에 해당하는 두번째 길이 부분은 선언하지 않아도 된다고 생각했음.

: 가변 배열을 제대로 이해하지 못했기에 생긴 문제

String[][] temp = new String[arr.length][]; //에러 원인

for(int i=0; i<arr.length; i++){
	for(int j=0; j<arr[i].length; j++){
		temp[i][j] = arr[i][j]; //NullPointerException 발생
	}
}

>가변 배열

: 2차원 이상의 배열을 선언할 때, 처음 길이는 필수로 선언하되 나머지 길이는 자유롭게 설정 가능하다.

: 모든 2차원 이상의 배열은 가변 배열로 선언될 시, 모든 요소가 null을 할당한다.

: 가변 배열의 요소를 넣기 위해서는 요소를 넣을 공간의 길이를 부여하는 것이 먼저다.

: 아래 코드처럼 꼭 길이를 먼저 부여해줘야 값을 할당할 수 있다.

//String[]에는 String[]을 할당하는 것이니, 어찌보면 당연

String[][] output1 = new String[3][]; // 가변 배열
/*
output1 : [null, null, null]
*/
output[0] = "String"; // 에러 발생(NullPointerException)
output[0] = new String[1];
output[0][0] = "String"; //실행 가능

 

'Memo > 짧은 메모' 카테고리의 다른 글

[JAVA] indexOf, contains의 시간복잡도 문제(미해결)  (1) 2022.10.19
MSB, Most Significant Bit  (0) 2022.10.04
정규표현식  (0) 2022.10.03
재귀 함수  (0) 2022.09.24
난수(Random Number) 생성.  (0) 2022.09.05