오늘 문제 풀이를 하면서 2차원 배열을 사용할 일이 있었는데, 문득 2차원 배열이 '열'을 초기화하지 않고도 사용할 수 있는 이유가 궁금해졌다. 아직 이 의문이 완전히 해소된건 아니지만, GPT와의 열띤 토론으로 도출해낸 나만의 생각을 정리해본다.
어디까지나 추측이라 흐지부지 끝남 주의..
오류 정정은 언제나 환영이다!!! 제발...
일단 JAVA에서는 2차원 배열을 선언할 때, '행'의 개수만 초기화해도 된다.
// 행의 개수만 지정하여 2차원 배열 선언
int[][] array = new int[3][];
// 각 행의 열의 개수를 개별적으로 초기화
array[0] = new int[4]; // 첫 번째 행에 4개의 열 할당
array[1] = new int[5]; // 두 번째 행에 5개의 열 할당
array[2] = new int[6]; // 세 번째 행에 6개의 열 할당
여기서 놀랐던게 2차원 배열은 각 행마다 다른 길이의 배열을 가질 수 있는 가변 배열(Jagged Array)을 생성할 수 있다는 것이었다. 이것은 2차원 배열의 '열'이 나중에 초기화될 수 있기 때문이다.
즉, int[3][]의 선언이 실제로는 길이가 3인 int[] 배열을 만들고, 각 요소는 null로 초기화된다는 것이다.
그리고 '초기화되지 않은 열들은 null로 초기화된다.' 라는 이 설명이 GPT와의 열띤 토론의 시발점이 되었다.
왜 2차원 배열의 '열'은 개수를 명시해주지 않아도 되는걸까?
지금부터는 개인적으로 도출해낸 결론이기 때문에 정답이 아닐 수도 있다.
혹시라도 잘못된 부분이 있다면 고쳐주실 천사를 기다리고 있다.
일단, 배열은 참조형(Reference Type)이다. 따라서 배열의 기본값은 null이다.
실제로 실험해보면 null값이 나온다.
class Main{
static int[] b;
public static void main(String[] args) {
System.out.println(b);
}
}
하지만 이 1차원 배열을 지역변수로 선언하고 초기화 없이 변수값을 출력하려고 하면 '초기화가 되지 않았다.' 라는 컴파일 에러가 뜬다.
근데 또 출력만 안하면 선언은 가능하다.
일단 여기서 컴파일 에러가 뜬 이유는 int[] b가 지역 변수로 선었되었기 때문이다.
그러면 지역변수를 꼭 초기화해야하는 이유가 뭘까?
GPT에게 물어봤더니 다음과 같은 답변을 줬다.
그래서 이런 의문이 생겼다.
"지역변수가 필수적으로 초기화 기능이 개발자의 실수 방지와 잠재적 오류 방지 장치라면, 만약 '지역변수가 초기화 되어야한다고 설계되어 있지 않으면' int[] b를 System.out.println(b); 로 출력했을때 null값이 나오나, 아니면 C언어와 똑같이 쓰레기 값이 들어갈까 ?"
GPT의 답변은 아래와 같다.
자바의 2차원 배열은 '배열의 배열'이다. 즉, int[ ][ ]는 int[ ]가 객체로 들어간 1차원 배열이다. int[ ][ ]의 '행'에는 2차원 배열 내부에 객체로 존재하는 int[ ]의 참조값이 들어있을 것이다. 그리고 아직 초기화 되지 않은 1차원 배열이 null값을 가지듯이 2차원 배열 내부에 객체로 존재하는 int[ ]역시 null 값을 가지는 것.
그리고 지역변수로 선언된 2차원 배열 내부에 객체로 존재하는 int[ ]가 초기화 되지 않았음에도 불구하고 컴파일에러가 뜨지 않는 이유는 아마 자바가 유연성 제공을 위해 어느정도 허용해주기 때문이 아닐까싶다.
'TIL > JAVA' 카테고리의 다른 글
[TIL] 캡슐화와 Getter, Setter(JAVA) (0) | 2024.11.13 |
---|---|
[TIL] JAVA에서 0.1을 100번 더하면 왜 10이 아닐까? (JAVA) (0) | 2024.11.11 |
[TIL] 최대공약수(GCD)와 최소공배수(LCM) 효율적으로 구하기 (JAVA) (0) | 2024.11.08 |
[TIL] 인터페이스 - 다중 상속 (JAVA) (0) | 2024.10.30 |
[TIL] static 메서드에서 인스턴스 기능을 사용할 수 없는 이유 (0) | 2024.10.29 |