Data Structure (자료구조)

비전공자는 도전해볼 수 있고, 전공자는 쉽게 배울 수 있는 데이터 스트럭쳐 수업

Data Structure (자료구조) 비전공자는 도전해볼 수 있고, 전공자는 쉽게 배울 수 있는 데이터 스트럭쳐 수업

Array - java API

배열의 생성

자바에서 배열을 만드는 방법을 알아봅시다. 아래는 numbers1이라는 변수에 4개의 int 데이터 타입을 담을 수 있는 배열을 만드는 방법입니다. 자바에서는 배열도 객체이기 때문에 new를 이용해서 배열을 생성해야 합니다.

1
int[] numbers1 = new int[4];

만약 문자열 엘리먼트를 사용한다면 아래와 같이 해야겠죠.

1
String[] strings = new String[4];

배열에 값을 저장할 때는 아래와 같이 합니다.

1
2
3
numbers1[0]=10;
numbers1[1]=20;
numbers1[2]=30;

배열 numbers1[0]에서 숫자 0은 배열의 인덱스를 가리킵니다. 즉 numbers1[0] = 10;은 인덱스 0번째 엘리먼트가 10이라는 의미입니다.

배열의 생성과 값을 설정하는 것을 한 번에 하고 싶다면 아래와 같이 하시면 됩니다.

1
2
int[] numbers2 = {10, 20, 30, 40};
int[] numbers3 = new int[]{10, 20, 30, 40};

예제코드 : http://ideone.com/EdJkGx

값 가져오기

값을 가져올 때는 아래와 같이 하면 됩니다.

1
numbers1[0]

물론 위의 코드는 동작하지 않습니다. 가져온 값을 가지고 아무것도 하지 않고 있기 때문이죠. 화면에 출력해보겠습니다.

1
System.out.println(numbers1[0]);

결과는 10입니다. 인덱스는 0부터 시작한다는 것 잊지 않으셨죠?

만약 아직 값을 지정하지 않은 엘리먼트를 조회하면 어떻게 될까요?

1
System.out.println(string1[3]);

결과는 0이 됩니다. 숫자 형식의 배열에는 값이 지정되지 않은 엘리먼트의 값은 0 입니다. 만약 배열의 데이터 타입이 문자열과 같은 객체라면 null이 됩니다. 

예제코드 : http://ideone.com/XVm8bS

배열의 크기

배열의 크기를 알고 싶으면 length 메소드를 사용하시면 됩니다.

1
System.out.println(numbers1.length);

이상 합니다. 우리가 만든 배열에는 총 3개의 값이 설정되었습니다. 그런데 결과는 4입니다. 4는 배열을 생성할 때 지정한 크기와 같습니다. 만약 값이 지정된 배열의 개수를 알고 싶다면 어떻게 해야 할까요? 자바의 배열에서는 이런 기능이 기본적으로 제공되지 않습니다. 만약 이걸 알고 싶다면 데이터를 넣거나 제거할 때 어딘가에 기록해두어야 합니다. 

바로 이런 이유에서 자바에서는 ArrayList나 LinkedList와 같은 리스트를 사용합니다. 리스트는 자동으로 엘리먼트를 수용할 수 있는 크기가 조정되고 또 리스트 내의 엘리먼트의 실제 개수를 알려줍니다. 리스트는 다음 시간에 배우게 됩니다. 

예제코드 : http://ideone.com/wAv8oq

배열과 반복

모든 데이터 스트럭쳐는 반복과 밀접한 관계를 가지고 있습니다. 데이터 스트럭쳐는 복수의 데이터를 저장하는 일종의 저장소이고 복수의 데이터를 일괄적으로 처리하려면 반복작업이 필수적이기 때문입니다. 반복문을 이용해서 배열의 데이터를 처리해보겠습니다.

1
2
3
4
5
int i=0;
while(numbers1.length > i){
System.out.println(numbers1[i]);
i++;
}

변수 i는 반복 몇 번 반복했는지를 적어두기 위한 용도입니다. 반복 실행을 할 때마다 이 값을 1씩 증가시킵니다. 이 값이 배열의 크기 보다 작은 동안 반복실행을 계속하는 것이지요. 위의 코드는 그런 내용입니다.

조금 다른 방법도 있습니다. for문을 사용하는 것입니다. for문은 while문의 이런 패턴을 문법적으로 지원하는 기능이라고 할 수 있습니다.

1
2
3
for(i=0; numbers1.length>i; i++){
System.out.println(numbers1[i]);
}

위의 코드는 이전의 while문과 정확하게 동일한 코드입니다. 하지만 변수 i의 초깃값을 지정하고, 값을 증가시키고, 조건을 확인하는 코드가 문법적으로 정의되어 있습니다. 코드의 가독성이 좋아졌습니다. 반복횟수가 확정적일 때는 for문을 사용하는 것이 좋습니다.

예제코드 : http://ideone.com/L2Hjw1

배열의 한계

자바의 배열은 기능적으로 한계가 많습니다. 배열의 크기를 배열을 생성할 때 지정하는 것이나, 배열의 크기를 변경할 수 없는 것은 몹시 불편한 일입니다. 또 배열에서 설정된 엘리먼트의 개수를 알아낼 수 없는 것도 불편합니다. 그렇다고 배열이 쓸모가 없는 것은 아닙니다. 데이터의 크기가 확정적일 때 배열을 사용하는 것이 메모리나 처리속도 면에서 좋습니다. 또한 배열은 다른 데이터 스트럭쳐의 부품이 되기도 합니다. 기능이 최소한일수록 좋은 부품이 될 수 있습니다. 기능이 많으면 사용하기는 좋아도 그것을 사용할 수 있는 용도가 제한되기 때문입니다. 

그럼 배열의 이런 한계를 극복하려면 어떻게 해야할까요? 조금 더 개선된 기능의 데이터 스트럭쳐를 고안할 필요가 있습니다. 그런 데이터 스트럭쳐가 바로 list입니다. 다음 시간에는 list에 대해서 알아봅시다.

전체코드

예제의 전체코드는 아래와 같습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package list.array.api;
public class Main {
public static void main(String[] args) {
int[] numbers1 = new int[4];
String[] strings = new String[4];
numbers1[0]=10;
numbers1[1]=20;
numbers1[2]=30;
int[] numbers2 = {10, 20, 30, 40};
int[] numbers3 = new int[]{10, 20, 30, 40};
System.out.println("System.out.println(numbers1[0]);");
System.out.println(numbers1[0]);
System.out.println("System.out.println(numbers1[3]);");
System.out.println(numbers1[3]);
System.out.println("System.out.println(numbers1.length);");
System.out.println(numbers1.length);
System.out.println("while");
int i=0;
while(numbers1.length > i){
System.out.println(numbers1[i]);
i++;
}
System.out.println("for");
for(i=0; numbers1.length>i; i++){
System.out.println(numbers1[i]);
}
}
}

댓글

댓글 본문
  1. 코딩이취미다
    굳이 패키지로 만드는 이유가 있을까요?
    이 코드 에서는 안 하는게 더 좋을듯 한데
  2. baeroro
    유툽ㄴ으로 달리는중
  3. 이마누
    완료
  4. SangHyeok Kim
    2017/03/30 수강완료!
    감사합니다!!
버전 관리
egoing
현재 버전
선택 버전
공동공부
graphittie 자세히 보기