의문

알고리즘 문제를 풀다가

입력으로 위 그림과 같은 이차원배열이 주어졌다.

 

파이썬에선 자주 보는 형태인데

어? 자바에서도 저렇게 받을 수 있던가 ???라는 의문이 생겼다.

 

보통 자바에서 이차원 배열을 초기화하는 방식이

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값( 해시 코드 ) 은 주소 값이 아니라는 것은 알 수 있었다.

결론

주소값 관련된 것은 찝찝하게 끝나긴 했는데

 

원래 목적의 결론은

이차원 배열에 각 배열의 크기는 달라도 된다! 땅땅땅 

+ Recent posts