A. 배열
1. 배열
a. 배열이란?
🌟 같은 타입의 변수들로 이루어진 유한 집합
배열을 구성하는 각각의 값을 배열 요소라고 하며, 위치를 가리키는 숫자는 인덱스라고 함
인덱스는 0부터 시작 (양수만 가능)
같은 종류의 데이터를 많이 다뤄야 하는 경우 사용하는 가장 기본적인 자료구조
b. 배열의 종류
1차원 ~ n차원 배열까지 사용할 수 있지만, 현실적으로 2차원까지 사용
c. 배열의 특징
- 배열의 길이를 선언할 때에는 반드시 상수를 사용
- 배열 요소의 인덱스는 언제나 0부터 시작
- C 컴파일러는 배열의 길이를 전혀 신경쓰지 않음 = 개발자가 직접 신경써야 함
🤓 예제 : C 컴파일러는 배열의 길이를 신경쓰지 않음
#include <stdio.h>
int main(void)
{
int i;
int sum = 0;
int grade[3] = {85, 65, 90}; // grade[0], grade[1], grade[2]만 선언 및 초기화
grade[3] = 100; // grade[3]를 선언하지 않고 초기화 진행
for (i = 0; i < 4; i++) // grade[3]도 수식에 포함
{
sum += grade[i];
}
printf("국영수 과목 총 점수 합계는 %d이고, 평균 점수는 %f입니다.\n", sum, (double)sum/3);
return 0;
}
✨ 실행결과
국영수 과목 총 점수 합계는 340이고, 평균 점수는 113.333333입니다.
💥 개발자가 전혀 의도하지 않은 결과물이기 때문에 예상치 못한 결과를 내줄 수 있음
d.배열이 차지하는 메모리의 크기
배열을 복사하거나 배열 요소에 특정 작업을 하고 싶을 때는 해당 배열이 차지하는 메모리의 크기를 정확히 알아야 함
1) 배열이 차지하는 총 메모리의 크기 구하기
배열이 차지하는 메모리의 크기 = 배열의 길이 X sizeof(타입)
2) 배열의 길이 구하기
배열의 길이 = sizeof(배열 이름) / sizeof(배열 이름[0])
//배열 이름[0] : 해당 배열의 타입을 표현하기 위해서 사용
🤓 예제
int grade[] = {85, 65, 90}; // 배열의 길이를 명시하지 않음
int arr_len = sizeof(grade) / sizeof(grade[0]); // 배열의 길이를 구하는 공식 12/4
printf("배열 arrGrade의 길이는 %d입니다.\n", arr_len);
✨ 실행결과
배열 grade의 길이는 3입니다.
2. 1차원 배열
a. 선언만 하기
📘 문법
타입 배열이름[배열길이];
//타입 : 배열 요소로 들어가는 변수의 타입 명시
//배열 이름 : 배열이 선언된 후 배열로 접근하기 위해 사용
//배열의 길이 : 배열 요소의 갯수(생략하면 자동으로 설정됨)
선언만 하고 초기화하지 않으면 쓰레기 값이 저장됨 (주의!)
🤓 예제
#include <stdio.h>
int main(void)
{
int i;
int sum = 0;
int grade[3]; // 길이가 3인 int형 배열 선언
/* 배열의 초기화 */
grade[0] = 85; // 국어 점수
grade[1] = 65; // 영어 점수
grade[2] = 90; // 수학 점수
for (i = 0; i < 3; i++)
{
sum += grade[i]; // 인덱스를 이용한 배열의 접근
}
printf("국영수 과목 총 점수 합계는 %d점이고, 평균 점수는 %f점입니다.\n", sum, (double)sum/3);
return 0;
}
✨ 실행결과
국영수 과목 총 점수 합계는 240점이고, 평균 점수는 80.000000점입니다.
📝 예제 설명
위 예제의 배열 grade가 메모리 상에서 저장된 모습
b. 선언과 동시에 초기화 하기
초기화 리스트(중괄호({})를 사용해 초깃값을 나열한 것)를 활용해 초기화 함
📘 문법
타입 배열이름[배열길이] = {배열요소1, 배열요소2, ...};
- 초기화 리스트 타입과 배열의 타입은 반드시 일치해야 함
- 초기화 리스트 개수 < 배열 총 길이 : 배열의 앞부터 차례대로 초기화 (나머지 0)
- 초기화 리스트 개수 > 배열 총 길이 : 리스트 길이를 늘려버림 💥
🤓 예제
#include <stdio.h>
int main(void)
{
int i;
int sum = 0;
int grade[3] = {85, 65, 90}; // 길이가 3인 int형 배열의 선언과 동시에 초기화
for (i = 0; i < 3; i++)
{
sum += grade[i]; // 인덱스를 이용한 배열의 접근
}
printf("국영수 과목 총 점수 합계는 %d이고, 평균 점수는 %f입니다.\n", sum, (double)(sum/3));
return 0;
}
✨ 실행결과
국영수 과목 총 점수 합계는 240이고, 평균 점수는 80.000000입니다.
💙 INFO
문법에서 배열 길이를 따로 입력하지 않으면, 초기화 리스트의 배열 요소의 개수에 맞춰 자동으로 배열의 길이가 설정됨
타입 배열이름[] = {배열요소1, 배열요소2, ...};
int arr[] = {1,2,3}
B. 다차원 배열
1. 다차원 배열 (multi-dimensional array)
a.다차원 배열이란?
🌟 2차원 이상의 배열을 의미하며, 배열 요소로 또 다른 배열을 가지는 배열
2. 2차원 배열(two dimensional array)
a. 2차원 배열이란?
🌟배열의 요소로 1차원 배열을 가지는 배열
b. 2차원 배열의 선언
📘 문법
타입 배열이름[행의길이][열의길이];
//타입 : 배열 요소로 저장되는 변수의 타입
//배열 이름 : 배열이 선언 된 후 배열에 접근하기 위해 사용
//행의 길이 : 생략 가능
//열의 길이 : 생략 불가능 (생략시 컴파일 오류)
c. 2차원 배열의 도식화 / 메모리 공간
도식화 하면 위와같은 그림이지만, 메모리는 선형공간이기 때문에 아래와 같이 표현
코드로 작성하면 아래와 같음
int arr01[6] = {10, 20, 30, 40, 50, 60};
int arr02[2][3] = {10, 20, 30, 40, 50, 60};
d. 2차원 배열의 초기화
1차원 배열과 마찬가지로 선언과 동시에 초기화 가능
3가지 방법으로 초기화 할 수 있음
1) 1차원 배열의 초기화 형태를 따르는 방식
📘 문법
타입 배열이름[행의길이][열의길이] =
{배열요소[0][0], 배열요소[0][1], ...,
배열요소[1][0], 배열요소[1][1], ...,
배열요소[2][0], 배열요소[2][1], ...};
🤍 문법 설명
- 2차원 배열의 배열 요소[0][0]부터 차례대로 초기화
- 초기화하는 배열 요소의 개수가 배열의 총 길이보다 적으면, 나머지 배열 요소는 모두 0으로 초기화
🤓 예제
int arr01[2][3] = {10, 20, 30, 40, 50, 60};
2) 배열의 모든 요소를 초기화하는 방식
📘 문법
타입 배열이름[행의길이][열의길이] =
{
{배열요소[0][0], 배열요소[0][1], ...},
{배열요소[1][0], 배열요소[1][1], ...},
{배열요소[2][0], 배열요소[2][1], ...},
...
};
👉 1) 번 방식과 방식과 결과는 똑같지만 좀 더 직관적이여서 이 방식을 많이 사용함
🤓 예제
int arr02[2][3] = {
{10, 20, 30},
{40, 50, 60}
};
3) 배열의 일부 요소만을 초기화하는 방식
초기화하지 않은 배열 요소는 모두 0으로 자동초기화
🤓 예제
int arr[3][4] = {
{10, 20},
{30, 40, 50, 60},
{0, 0, 70, 80}
};
✨ 실행결과
10 20 0 0
30 40 50 60
0 0 70 80
👉 1행의 3, 4열 데이터는 0으로 초기화됨
e. 2차원 배열의 길이 구하기
1) 2차원 배열 열의 길이 구하기
📘 문법
arr_col_len = sizeof(arr[0]) / sizeof(arr[0][0]);
// 2차원 배열의 열의 길이를 계산함
2) 2차원 배열 행의 길이 구하기
sizeof(arr[0])으로 먼저 2차원 배열의 한 행의 길이를 구한 후에, 그 값을 배열 타입의 크기로 나누어서 구함
📘 문법
arr_row_len = (sizeof(arr) / arr_col_len) / sizeof(arr[0][0]);
// 2차원 배열의 행의 길이를 계산함
f. 배열의 길이 자동 설정
행의 길이를 생략하면 자동으로 길이를 설정 (행만 가능)
🤓 예제 : 행의 길이를 생략
int arr[][4] = {
{10, 20},
{30, 40, 50, 60},
{0, 0, 70, 80}
};
✨ 실행결과
10 20 0 0
30 40 50 60
0 0 70 80
'프로그래밍 언어 > C' 카테고리의 다른 글
[자료형(data type)] C 파생형 포인터와 배열 (0) | 2023.08.17 |
---|---|
[자료형(data type)] C 파생형 포인터의 기본 (0) | 2023.08.17 |
[자료형(data type)] C 파생형 함수 총정리 (0) | 2023.08.17 |
C 제어문 총정리 (조건문, 반복문, 기타 제어문) (0) | 2023.08.17 |
C 연산자 총정리 -2 (비교, 논리, 비트, 기타 등) (0) | 2023.08.16 |