JOURNALHelloworld

20261005-배열과인덱스

배열[Array]

  • 학생별 점수를 변수로 만들어야 한다고 하면
  • int score1, score2, score3 ...;
  • -> 배열로 int score[3];
  • 같은 종류의 변수를 한 묶음으로

1차원 배열의 선언과 초기화

{배열 내부 변수의 타입} {변수명}[크기];
int score[3];
char name[5];
float avg[4];
int scores[3] = {88, 91, 32};
scores[1] = 22;
...

배열의 인덱스[첨자]

{1, 2, 3, 4, 5}
  • 값 2에 접근하기 위해서는 몇 번 인덱스를 사용해야 할까?
  • 2? 아니다. 배열은 0부터 센다.
  • 앞에서부터 0, 1, 2, 3, 4번째 요소다

왜 0부터 시작할까?

  • 배열은 메모리에 ‘순서대로’ 저장된다.
  • 빈 칸에 무작위로 저장하지 않고, 배열은 원소의 크기 × 원소 개수만큼의 연속된 메모리 공간을 사용한다.
  • int test[3] = {1, 2, 3}
    Address: [0x1000, 0x1004, 0x1008]
    Data:    [  1   ,   2   ,    3  ]
    Index:   [  0   ,   1   ,    2  ]
    • 조금 더 깊게 들어가보도록 하자.
    • 배열의 각 원소 위치는 시작 위치와 원소 크기를 기준으로 계산 할 수 있음.
    • 시작 주소가 0x1000이니 4바이트인 int는 0x1000~0x1003까지의 메모리를 사용한다.
    • Int는 환경마다 크기가 다르기에, 본 문서에서는 4바이트로 가정한다.
    • 즉 우리가 0번, 1번, 2번으로 세는 까닭은 원소의 주소 = 시작 주소 + (인덱스 × 원소의 크기)이기에
    • test[0] → 0x1000 + (0 × 4) = 0x1000
      test[1] → 0x1000 + (1 × 4) = 0x1004
      test[2] → 0x1000 + (2 × 4) = 0x1008
    • 0번부터 시작한다는 것을 알 수 있다.

배열의 인덱스 범위와 N - 1

  • 그렇다면 요소가 5개인 배열의 범위는?
  • 0~4다. 인덱스는 항상 0부터 세니 N - 1까지가 범위인 것이다.

배열과 for문

int score[5] = {80, 90, 70, 100, 85};
 
for (int i = 0; i < 5; i++) {
    printf("%d\n", score[i]);
}
  • for는 지정된 횟수동안 반복하는데 주로 쓰이는 반복문이다.
  • 그렇다면 배열의 인덱스 범위만큼만 반복시키면 배열과 함께 사용할 수 있지 않겠는가?
  • i = 0에서 0번 인덱스부터 i < 5에서 4번 인덱스까지 score[i]에서 루프마다 다른 인덱스에서 접근.

자주하는 실수

배열 크기와 마지막 인덱스 혼동

int a[5];
a[5] = 10; // 잘못된 접근.
 
// 정상 범위
a[0] ~ a[4]

반복문에서의 조건문 실수

for (int i = 0; i <= 5; i++)
  • 마지막 i = 5까지 반복하게 됨

초기화 되지 않은 배열 사용

int a[5];
 
printf("%d", a[0]);
  • 지역 배열의 경우 초기값이 보장되지 않음.
  • 그래서
int a[5] = {0};
  • 처럼 초기화가 가능함.

배열 전체 대입

int a[3];
a = {1, 2, 3};   // 불가능
  • 대신 선언시에
int a[3] = {1, 2, 3};
  • 처럼 전체를 대입할 수 있음.

과제

  • 는 추후에 공개 예정.