'배열'에 해당되는 글 4건

  1. 2009.03.24 배열 참조와 2차원 배열의 선언
  2. 2009.03.24 배열 선언, 복사
  3. 2009.03.18 [C] 함수와 배열 그리고 포인터 - 1부
  4. 2009.03.05 배열 선언
Programming/JAVA2009.03.24 16:10

배열 참조

 C에서 배열의 이름이 그 배열의 포인터를 가르키는 것과 같이 Java에는 배열의 이름이 참조값을 가진다.
그러므로 다음과 같이 사용하면 두개의 변수로 하나의 배열을 다룰수 있다.

int[] num = {1,2,3,4,5};
int[] num_1 = num;
int[] num_2 = num_1;


위의 세 변수 num, num_1, num_2는 모두 같은 참조값을 가지고 있기 때문에 하나의 배열이라고 볼수 있다.
만약 하나의 변수이름으로 값을 수정하게 되면 3개의 값이 다 바뀌는것 같을 것이다.

num_2[0] = 9;
for(i=0;i<num.length;i++)
     System.out.println("num["+i+"] : "+num[i]+"\tnum_1["+i+"] : "+num_1[i]+"\tnum_2["+i+"] : "+num_2[i]);


위의 결과는 다음과 같다.

num[0] : 9     num_1[0] : 9     num_2[0] : 9
num[1] : 2     num_1[1] : 2     num_2[1] : 2
num[2] : 3     num_1[2] : 3     num_2[2] : 3
num[3] : 4     num_1[3] : 4     num_2[3] : 4
num[4] : 5     num_1[4] : 5     num_2[4] : 5


3개의 변수는 하나의 배열 참조값을 공유하고 있는것이다. 이것이 참조이며 반드시 데이터형은 같아야 한다.

public void copy(int[] A, int[] B)
{
     for(int i=0;i<A.length;i++)
          B[i] = A[i];
}


A와 B 모두 참조값을 받는다. 그러므로 A와 B를 변경하면 매개변수로 넘긴 배열도 변경된다. C언어 에서는 포인터를 사용해야할 이런일이 아주 쉽게 된다.

2차원 배열 선언

1차원 배열 선언과 거의 같다.

int[][] num = new int[2][3];
int[][] num_1 = new int[2][3] {{1,2,3}, {4,5,6}, {7,8,9}};
int[][] num_2 = {{1,2,3}, {4,5,6}, {7,8,9}};

신고
Posted by 초프(초보 프로그래머)
Programming/JAVA2009.03.24 15:35

 자바에서의 배열 선언은 C와는 조금 다르다. C에서는

int num[10];
int num2[]={1,2,3};


이런식으로 하였다면 자바는

int[] num = new int[10];
int[] num2 = new int[]{1,2,3};
int[] num3 = {1,2,3};


이렇게 3가지 방법이 있다. 2,3 번째는 초기화를 같이 해주는 것이다.

자바와 C의 배열의 다른점은 자바에서는 배열을 만들고 메모리를 할당해 줘야 한다는건데
int, float등 기본 데이터형은 자동으로 메모리가 할당되지만 객체인 경우는 그렇지 않다. 그래서 직접 할당을 해줘야 한다. 안그러면 NULL값이 있게 된다.

Person[] yoon = new Peson[10];

이렇게 한다고 배열에 메모리가 할당되지 않는다. 값을 출력해보면 NULL 값이 나올것이다.

yoon[0] = new Person();
yoon[1] = new Person("26");
yoon[2] = new Person("초보프로그래머","26");


이런식의 새로운 메모리 할당이 필요하다. 그럼 배열의 각값이 객체가 되는것이다. 중요한것은 기본데이터형은 이렇게 따로 해줄 필요가 없다는것이다. 기본데이터형은 선언하고 그냥 쓰면된다.

배열을 복사하는 방법에는 2가지가 있다. arraycopy()와 clone()메소드를 사용하는 것이다.

  • public static void arraycopy(Object src, int src_position, Object dst, int dst_position, int length)
    src : 원본 배열
    src_position : 원본 배열의 시작 위치
    dst :  복사할 배열
    dst_position :  복사할 배열의 시작 위치
    length : 복사할 개수
  • int[] target = (int[])num.clone();
    clone()는 array객체의 메소드이다.
    clone()는 object를 리턴하므로 꼭 다운캐스팅을 해줘야한다. (int[])를 해주므로써 원래 데이터형으로 들어가게 한다.

이게 배열 선언, 복사에 관한 짧은 내용입니다.


신고
Posted by 초프(초보 프로그래머)
Programming/C,C++2009.03.18 01:00
 배열을 사용하다가 함수에 넣을때가 있다. 이부분에서 부터 문제가 생긴다. 도대체 어쩌란 말인가~~~

int ABC = {1,2,3};
printf("sum : %d\n",sum(ABC));


이게 원하는 코드이다.
함수부분을 보면 다음과 같이 사용하면 된다.

int sum(int data[]) 또는 int sum(int *data) 이렇게 하면 된다.

물론 차이는 있다. data[] 이렇게 쓰면 값복사를 하는것이다. 함수안에서 data라는 배열이 새로 생기는 것이다.
*data 포인터로 사용하면 배열의 주소만 넘겨 받는다. 그러므로 함수안에서 배열의 값을 변경할수 있다.

여기까지는 간단하게 1차원 배열을 넘기는 방법을 설명한거고
2차원 배열을 넘기는 방법은 조금더 복잡하다.

int sum(int dataA[][])

이렇게 하면 오류난다.;;

int sum(int data[][2]) 또는 int sum(int (*data)[2]) 이렇게 두가지 방법이 존재하는것 같다.

이것도 마찬가지로 앞에 부분은 값복사이고 두번째것은 포인터로 넘긴것이다.
그리고 또 하나 생각해볼수 있는것이 있는데.. 그건 이중포인터이다.

int sum(int **data)

이와 같은 방법으로 하면 오류난다... -_-;
이게 아직 정확히 이해하지 못한 부분이네요;;

malloc를 이용하여 2중포인터 배열을 만들경우 저런 식으로 사용이 가능하다.
하지만 일반 배열을 **data로 넘기는 것은 불가능하다.

이건 좀더 알아봐야 할것 같다.
신고
Posted by 초프(초보 프로그래머)
Programming/JAVA2009.03.05 02:02
오늘 처음으로 자바로 뭔가를 만들어 봤음;;

만들다가 조금 힘들었던 부분중 하나가 배열 ㅋㅋ

int[] a = new int[10];

a라는 이름으로 크기가 10인 배열을 선언하는 문장이다.

다른 타입도 똑같이 해주면 된다.

이건 금방 찾아서 했는데... 문제는 객체 배열이었다..

객체도 위와 같은 방법으로

student[] std = new student[10];

이렇게 하면 컴파일시 아무 문제도 없다.

하지만... 사용할때 std[1].name = "ABC"; 이렇게 할경우에도 컴파일시 아무 문제가 없다.

실행하면... 오류가 뜬다.. NULL 어쩌고 저쩌고 하는건데...

이것 때문에 엄청 헤맸다;; 결론은 std에 student 공간만 10개 만들었지.. 메모리(?)가 할당안된거 같다

해결방법은 사용전에

for(i=0;i<10;i++)
{
     std[i] = new student();
}


이렇게 하나씩 다 해줘야 한다;
신고
Posted by 초프(초보 프로그래머)