2018년 9월 디자인과 코딩을 함께 다루는 유튜브 채널을 열었습니다. "타입과 미디어" 사이트는 당분간 유지할 계획이지만, 새로운 정보는 유튜브 비디오를 통해서 소개하겠습니다. 많은 관심 부탁드립니다! — 정대인

배열

세부 목차

배열 만들기

10명의 학생들의 성적을 관리한다고 합시다. 각 학생들의 성적을 담을 수 있는 10개의 변수가 필요할 것입니다.

int score1 = 76;
int score2 = 81;
int score3 = 69;
int score4 = 81;
int score5 = 50;
int score6 = 90;
int score7 = 77;
int score8 = 71;
int score9 = 95;
int score10 = 68;

println( score3 );

위의 예제에서는 10개의 변수에 값(성적)을 할당하고, 세번째 학생의 성적을 콘솔에 출력합니다. 이 방법으로 원하는 결과를 만들어낼 수는 있지만, 변수가 많아질수록 코드가 길어지고, 관리하기도 쉽지 않습니다. 같은 종류의 데이터들을 담을 변수들을 많이 만들어야 한다면, 배열의 사용을 고려해볼 수 있습니다. 배열은 여러 개의 데이터 값을 하나의 변수 이름 아래 사용할 수 있게 해줍니다.

int[] scores = {76, 81, 69, 81, 50, 90, 77, 71, 95, 68};

println( scores[2] );

위의 예제는 배열을 사용해서 똑같은 결과를 얻어냅니다. 배열 내의 각 데이터는 대괄호 [ ] 사이에 인덱스 값2을 주어서 접근할 수 있습니다. 인덱스는 0부터 시작하기 때문에 세번째 학생의 성적은 scores[2]가 됩니다.

배열을 선언할 당시에 초기값을 가지고 있지 않다면, 배열의 크기만 일단 정해놓고, 각각의 값은 이후에 직접 할당하는 것도 가능합니다.

int[] scores = new int[10];

scores[2] = 69;

println( scores[2] );

배열 사용하기

일반적으로, 배열의 각 요소들은 for 반복문을 이용해서 한꺼번에 접근하고, 업데이트하는 경우가 많습니다. 예를 들어, 배열을 사용해서 50개의 파티클을 만들고, 또, 배열을 사용해서 모든 파티클의 위치를 변경해줍니다.

int numBalls = 50;
float[] xs;
float[] ys;
float[] xspeeds;
float[] yspeeds;

void setup() {
  size(600, 200);
  background(255);

  xs = new float[numBalls];
  ys = new float[numBalls];
  xspeeds = new float[numBalls];
  yspeeds = new float[numBalls];

  for (int i = 0; i < numBalls; i++) {
    xs[i] = width/2;
    ys[i] = height/2;
    xspeeds[i] = random(-3, 3);
    yspeeds[i] = random(-3, 3);
  }
}

void draw() {
  for (int i = 0; i < numBalls; i++) {
    xs[i] += xspeeds[i];
    ys[i] += yspeeds[i];
    ellipse(xs[i], ys[i], 10, 10);
  }
}

void mousePressed() {
  background( random(255), random(255), random(255) );
  
  for (int i = 0; i < numBalls; i++) {
    xs[i] = mouseX;
    ys[i] = mouseY;
    xspeeds[i] = random(-1, 1);
    yspeeds[i] = random(-1, 1);
  }
}
Your browser does not support canvas.

위의 예제에서는 배열을 사용해서 각각 x와 y의 좌표, x와 y의 속도를 저장하고, 업데이트하고 있습니다. 필요에 따라서 원들의 색깔을 저장하는 color[] 배열을 만들어줄 수도 있겠죠?

2차원 배열

2차원 배열은 배열의 각 요소들이 단순한 int, float와 같은 데이터 타입이 아닌 또다른 배열인 경우를 말합니다. 말그대로 2차원의 데이터를 담고 있기 때문에 2차원의 좌표를 담을 때 유용하게 사용할 수 있습니다. 엑셀과 같은 프로그램의 테이블을 생각해볼 수도 있습니다. 필요에 따라서 3차원 배열 (예를 들어, int[][][] coords)을 사용할 수도 있습니다. 하지만, 2차원, 3차원 배열을 관리하는 것은 헷갈리기 쉬워 버그의 원인이 될 수 있으니 주의해야 합니다.

int[][] kieuk = {
  {1, 1, 1, 1, 1}, 
  {0, 0, 0, 0, 1}, 
  {0, 0, 0, 0, 1}, 
  {0, 1, 1, 1, 1}, 
  {0, 0, 0, 0, 1}, 
  {0, 0, 0, 0, 1}
};

int[][] tieut = {
  {1, 1, 1, 1, 1}, 
  {1, 0, 0, 0, 0}, 
  {1, 1, 1, 1, 0}, 
  {1, 0, 0, 0, 0}, 
  {1, 0, 0, 0, 0}, 
  {1, 1, 1, 1, 1}
};

void setup() {
  size(600, 200);
}

void draw() {
  background(255);

  drawCharacter(kieuk, 20, 20, 20);
  drawCharacter(tieut, 140, 20, 20);
}

void drawCharacter(int[][] cha, int xpos, int ypos, int chaSize) {
	pushMatrix();
	translate(xpos, ypos);
	for (int y = 0; y < cha.length; y++) {
	  for (int x = 0; x < cha[y].length; x++) {
	    if (cha[y][x] == 1) {
	      noStroke();
	      fill(0);
	      rect(x*chaSize, y*chaSize, chaSize, chaSize);
	    }
	  }
	}
	popMatrix();
}
Your browser does not support canvas.

위의 예제에서는 각 자소에 해당하는 2차원 배열을 만들고 drawCharacter() 함수를 이용하여 글자를 원하는 크기로 원하는 곳에 배치하고 있습니다.

배열의 크기 변경

배열은 생성할 때에 그 크기를 명시해줘야 합니다.

int[] nums = new int[10];

하지만, 실행 중에 데이터를 추가해야할 일이 생기기도 합니다. 이럴 경우에는 append() 함수를 사용할 수 있습니다.