의문
알고리즘 문제를 풀다가
입력으로 위 그림과 같은 이차원배열이 주어졌다.
파이썬에선 자주 보는 형태인데
어? 자바에서도 저렇게 받을 수 있던가 ???라는 의문이 생겼다.
보통 자바에서 이차원 배열을 초기화하는 방식이
int a [][] = new int [2][3];
이런식이라
모든 배열의 크기가 항상 동일해야 한다. 라는 고정관념이 생겨있었다. (아마 c에서 배운 내용이 계속 남아 있던듯..)
이차원 배열의 구조
사실 이것도 좀만 생각해보면 당연한 것이다.
int a [][] = new int [2][3]; 의 경우도 사실은
이런 형태로 바로 초기화를 할 뿐이고
a는 a[0]이란 배열과 a[1]이란 배열의 주소 값을 저장하는 배열 일 뿐이니 (정확히는 참조변수의 해시코드)
굳이 a에 저장하는 배열의 크기가 모두 같을 필요는 없는 것이다.
예를 들어
위 그림같이
int a [][] = new int [2][3];
이렇게 초기화를 했어도
a[1] 에 새로운 크기가 다른 배열을 붙이는 것도 가능하다.
그러면 연속된 주소는 풀리는 건가?
처음에
int a [][] = new int [2][3]; 이렇게 초기화를 했으면 배열 주소가 연속 되어 있지 않나?
거기에 다른 배열을 붙이면 안 이어진 상태가 되려나??
라는 생각을 했는데
결과적으로 배열과 배열은 애초에 연속되게 주어지지 않았을 것 같다.
자바는 가비지 컬렉션이 계속해서 heap구역을 청소하고 정리하는데
이 과정에서 객체의 주소값은 매번 바뀔 수 있어 주소값이라는 개념자체에 큰 의미를 두지 않는다고 한다.
위 그림도 사실 c에서 배열을 저장하는 data영역에서의 그림이니
heap영역에 저장하는 자바와는 다른게 맞을 것이다.
그래도 처음 초기화할 땐 연속하지는 않는지 궁금해서
배열의 주소값을 구하는 법을 찾아보고 싶었는데
다른 사이트들에서 반응이 주소값을 왜? 뭐하러 굳이? 정도의 반응이라 찾을 수 없었다.
http://daplus.net/java-java-변수의-메모리-주소/
[java] Java 변수의 메모리 주소 - 리뷰나라
아래 그림을 참조하십시오. new키워드를 사용하여 java에서 객체를 만들면 OS에서 메모리 주소를 얻습니다. 우리가 쓸 때 out.println(objName)“특별한”문자열을 출력으로 볼 수 있습니다. 내 질문은 :
daplus.net
그나마 찾은 정보인데
printAddresses 함수가 있어서 써보려했지만 에러가 떠서 실패했고
자바에서 객체를 그냥 출력했을때 나오는 이상한 String값( 해시 코드 ) 은 주소 값이 아니라는 것은 알 수 있었다.
결론
주소값 관련된 것은 찝찝하게 끝나긴 했는데
원래 목적의 결론은
이차원 배열에 각 배열의 크기는 달라도 된다! 땅땅땅
'개발 이모저모 > 뻘 짓 연구' 카테고리의 다른 글
[Java] String은 특별하다. (0) | 2021.10.22 |
---|---|
[Java] Priority Queue 들여다 보기 (1) | 2021.10.14 |
[JAVA] String도 Object 인데 왜 equals 함수로 값 비교가 가능할까? (1) | 2021.08.15 |