프로그래밍 언어/C

[자료형(data type)] C 파생형 배열 총정리

순정법사 2023.08.17
더보기
자료형 중 파생형 배열 공부 / https://ddanzimind.tistory.com/32

 

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

 

 

 


출처 : http://www.tcpschool.com/c/c_array_oneDimensional

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com