안녕하세요. 배열에 관해서 모르는것이 있어서요...첫번째질문입니다.
큰길
전부 잘지내시죠??
배열에 관해서 질문좀 할려고 합니다.
메모리상에 문제인데, 한번도 이런걸 생각해 보지 않고, 배열을 사용해 왔는데,
약간의 문제점이 있을수도 있을거 같다라는 생각이 드네요..
두가지의 문제점이 있는데요.. 선배님들의 조언좀 부탁좀 드리겠습니다.
주말내내 생각을 해봤는데, 답이 나오지 않아서요.ㅠㅠ
물론, 벡터라든지 다른방법이 있을수도 있지만은, 이방법을 사용해서 하신다면 어떻게 하실런지요? 여러분들은
좀 부탁드립니다.ㅠ
(모바일쪽 일을 하다보니 메모리가 엄청 중요해서요.)
질문 드리겠습니다.
1.
public class Test{
int a[]; //먼저 배열을 하나 선언합니다.
public void addInt( int b ){ //인자로 int 값을 받습니다.
int temp[] = null; // temp 를 먼저 하나 선언합니다.
if(a != null){
temp = a; //a가 null이 아닐경우 temp에다가 대입을 시킵니다.
a =new int[temp.length+1]; //a의배열길이를 하나를 늘립니다.
for(int i=0; itemp.length; i++){
a[i] = temp[i]; //기존에 가지고있던값들을 다시 대입을 시킵니다.
}
a[temp.length] = b; //마지막에다가 인자로 새로받을 값을 대입을 시킵니다.
}else{
a = new int[1]; //a가 null일경우 배열 하나를 만듭니다.
a[0] = b; //인자로 받은 값을 대입시킵니다.
}
}
public static void main(String arg[]){
Test t = new Test();
for(int i=0; i100; i++){
t.addInt(i); //a배열에다가 0~99까지 배열로 차례대로 넣게되는거죠..
}
}
}
코딩이 간단한 거라 다들 이해하시리라 믿습니다.
배열을 늘리는 거지요.
윗 코딩에서는 100개의 배열을 만들면 되지만, 실제로는 몇개의 배열이 생성이 될지 모릅니다.
10개가 될지 12개가 될지 100개가될지, 1000개가 될지 전혀 모릅니다.
미리 배열을 엄청 크게 생성을 시켜놓고 하면 당연히 않되잖아요??
필요한만큼만 배열의 크기를 만들어서 사용을 해야하잖아요??
그래서 제가 저방법을 사용을 했습니다.
근데, 이코딩에 문제가 있을수도 있다고 하던군요.
그래서 배열을 늘리면서 사용하는 선배님들의 팁들이 있으시면, 가르쳐주시면감사하겠습니다.^^;;
아~ 제가 궁금한건 그게아니라요.. 저코딩에 문제가 있을수도 있는 부분이 바로 메모리 부분입니다.
a배열변수만 놓고 봤을때, 새로운 값이 들어오면 다시 new 라는 것을 이용하여 새로운객체를 다시생성을 하잖아요.
그럼 그전에 a가 생성을 해놓은것은 메모리에서 사라지지 않고, 그대로 남아있는상태에서 다른메모리에다가 새로운값을
생성을 시키는지가 궁금합니다.(제 생각에는 아닌것 같은데...)
무슨 말이냐면, 한마디로 윗코딩에서 보면 0~99까지 돌면서 a의 배열을 늘리잖아요.
int는 4byte이니깐, 맨처음에는 a가 메모리 4byte를 먹겠죠.
근데요, 그다음에 값이 또 들어가면은, a에 배열이 두개가 생기죠. 그래서 8byte를 먹게되죠.
그럼 전에 있던 4byte는 어디로 가나요? 전 사라질것이라고 보는데요..
그게 아니라 a가 먹는 메모리는 12byte라고 하더군요. 그럼 그런식으로 메모리를 먹게되면은,
위코딩에서 마지막에 a가 100개의 배열이 생성이되니, 400byte메모리를 먹는게 아니라,
엄청난 메모리를 먹게된다는 것인데, 정말 그런지 궁금합니다.
배열을 늘리는 방법은 제생각엔 다시 생성을 시켜줘야 할것같은데, 어떻게 해야하는지 궁금합니다.
그리고 밑에 3가지가 무엇이 다른건지 좀 가르쳐주십시요.
위코딩을 사용하자면,
1 : temp = a;
2 :
int temp[] = new int[a.length];
for(int i=0; ia.length; i++){
temp[i] = a[i];
}
3 : System.arraycopy(); -- api가 지원하는 메소드입니다.
이 3가지의 차이점을 좀 설명해주십시요.
간단하다면 간단한 문제일수도있지만, 저한테는 좀 까다로운 문제입니다.ㅠ
선배님들의 많은 조언 기다리겠습니다. 읽어주셔서 감사드리고,
밤인데 전부 주무시겠네요. 전부 잘 주무시고, 내일부터 새로운 한주 잘보내시길 바랍니다.
수고들 하세요..^^/
(두번째 질문은 새로 작성하겠습니다.)
-
레이
메모리 문제는 단순하게 체크해보세요 기존 a값을 다른변수에 저장하고
new한a랑 같은지(==) 비교해보세요 서로 주소가 틀리면 틀리다고 나오겟죠.
주소가 같다면 같다고 나오고요. 그럼 같은 주소일때는 계속 추가라고 생각하수도 있겠죠. -
츄릅
꼭 위의 방법을 쓰실려고 한다면 배열말고 링크드리스트를 사용하시는게 더 좋을꺼 같네요.
-
큰힘
저도 예전에 배열의 크기가 가변으로 필요할때가 있었는데요. 위와 같이 한번에 하나씩 늘리지 않고요.
그냥 필요한 겟수 만큼 늘렸읍니다.
예를 들면요
int n =100;
int [] a = new int[n];
for(int i=0; in; i++)
a[i]=i; // a배열에다가 0~99까지 배열로 차례대로 넣게되는거죠..
이런씩으로요 물론 n값은 입력하거나 길이를 구하거나 수를 정해주거나 기타 등등을 이용했고요.
위의 방법은 100번 메모리를 -
희선
음.. 자바에서는 동적으로 생성한 메모리에 대한 직접적인 메모리 해제가 없습니다. 제생각에는 빈번하게 메모리를 생성하지 않는게 좋다고 생각합니다. 가령, 테스트를 많이 해봐서 실제로 필요한 최대크기의 배열을 잡는게 제일 낫습니다. 그리고, 만일 잡은 메모리를 늘려야 할경우 그2배 크기로 다시 확보하구요. Vector 클래스의 소스를 보면, 객체를 추가시 addElement - ensureCapacity 를 통해서 메모리 크기를 확인합니다. 이소스를 참조