안녕하세요 아즈라엘 입니다.
이번에 메서드 인자값으로 레퍼런스를 넘겨서 new 를 하는데 안되고
리턴값으로 받으면 되는걸 받았는데 C/C++의 포인터 개념과 무쟈게
햇갈리네요 ㅜㅜ
잘되는 소스
startPoint = DataToken(readTxt(context, R.raw.start_frame));
private int[] DataToken(String txt) {
int[] ret = null;
try {
StringTokenizer st = new StringTokenizer(txt, "\n");
int i = 0;
ret = new int[st.countTokens()];
while (st.hasMoreTokens()) {
ret[i++] = (int) (Integer.parseInt(st.nextToken()) / 30.0f * 1000.0f);
}
} catch (NullPointerException e) {
DebugUtils.e(TAG, "DataToken() -> NullPointerException : " + e.getMessage());
return null;
} catch (IndexOutOfBoundsException e) {
DebugUtils.e(TAG, "DataToken() -> IndexOutOfBoundsException : " + e.getMessage());
return null;
}
return ret;
}
잘 안되는 소스
DataToken(startPoint , readTxt(context, R.raw.start_frame));
private void DataToken(int[] ret, String txt) {
try {
StringTokenizer st = new StringTokenizer(txt, "\n");
int i = 0;
ret = new int[st.countTokens()];
while (st.hasMoreTokens()) {
ret[i++] = (int) (Integer.parseInt(st.nextToken()) / 30.0f * 1000.0f);
}
} catch (NullPointerException e) {
DebugUtils.e(TAG, "DataToken() -> NullPointerException : " + e.getMessage());
} catch (IndexOutOfBoundsException e) {
DebugUtils.e(TAG, "DataToken() -> IndexOutOfBoundsException : " + e.getMessage());
}
}
아래쪽에 처럼 넘겨받은 변수를 내부에서 new를 해버리면 그 변수는 메소드에 속해버리는 지역변수가 되어버리지 않나요?
메소드가 종료되면 변수가 없어지는(메모리엔 있지만)..
단순히 레퍼런스변수의 메모리만 참조하여 값을 수정하면 돼긴하지만..
ArrayList같은 경우에는 레퍼런스를 넘겨서 add를 해주고 리턴하지 않아도 호출한 쪽에서 입력된 값을 확인할수있습니다.
제의견은 정확하지 않을수도 틀릴수도 있습니다. ArrayList는 확실히 됩니다.
공히 ret 가 0xffff0000 번지를 alloc 했다고 생각할떄
return ret; 의 경우 번지수를 return 해 주기 떄문에 받는쪽에서 주소를 알 수 있지만
두번째의 ret 는 로컬변수이기 때문에 호출한 쪽에서 alloc 된 0xffff0000 주소를 알 수 없습니다.
= 오퍼레이터가 뭔가 하는가본뎅.. 잘 모르겠네요..
이럴땐 포인터가 좋긴 좋군요 ㅋ