- 배열
여러 연속적인 값을 저장하고자 할 때 사용하는 자료이다.
- 배열변수
[ ]안에 설정한 값만큼 연속적으로 메모리를 할당하여 설정한 개수만큼의 정보를 저장하겠다는 의미
int a[5]라는 것을 a[0], a[1], a[2], a[3], a[4]처럼 연속해서 같은 자료형을 가진 정보를 저장할 수 있는 공간이 할당된다는 뜻이다.
배열 이름(여기서는 a)으로 접근할 수 있어 변수의 사용과 관리가 편하다.
배열은 1이 아니라 0부터 시작한다.
int a[5];
5개의 정수 정보를 연속적으로 저장한다는 뜻
이때 5를 '배열의 크기'라고 한다.
1. 배열을 저장할 정보 int
2. 배열 이름 a
3. 저장할 정보 개수 [3]
합치면 int a[3]이러한 모습을 하고 있다.
ex)가을이네 방 번호가 101호 이라는 것을 family[0]에 저장하려면 family[0]=101;처럼 대입연산자를 사용하면 된다.
예를 들어 시은이의 반인 1반 학생들의 키를 배열 변수를 이용하여 효율적으로 저장해보자.
이를 확장해서 2반부터 3반까지 학생들의 몸무게 정보도 저장해보자
우선 배열을 사용하고 설명의 편의를 위해 각 반의 학생 수는 5명으로 제한
int class1[5];
int class2[5];
int class3[5];
이렇게 작성하게 되는 데 만약 이것을 하나의 그룹에 저장한다면
1학년 반은 총 3개이며, 각 반의 학생이 5명이라고 가정해보자
int ourclass[3][5];라고 작성하면 된다.
------> 즉 2차원 배열을 사용
1반 학생 1번~5번 까지의 몸무게 정보를 저장하고 바로 연속하는 공간에
2반 학생 1번~5번 까지 몸무게 정보를 저장하고 바로 연속하는 공간에
3반 학생 1번~5번 까지 몸무게 정보를 저장할 수 있다.
int ourclass[3][5];
배열은 1이 아니라 0부터
ourclass[0][0]; //1반 1번 학생의 몸무게
ourclass[0][1];
ourclass[0][2];
ourclass[0][3];
ourclass[0][4];
ourclass[1][0]; //2반 1번 학생의 몸무게
ourclass[1][1];
ourclass[1][2];
ourclass[1][3];
ourclass[1][4];
ourclass[2][0]; //3반 1번 학생의 몸무게
ourclass[2][1];
ourclass[2][2];
ourclass[2][3];
ourclass[2][4];
만약 2학년 3학년까지 저장하려면 하나의 배열을 더 추가한다.
int ourclass[3][3][5]; //1-3학년 //1-3반 //1-5번
여기서 하나를 더 추가하고 싶다면
int ourclass[4][3][3][5] //1-4동네 //1-3학년 //1-3반 //1-5번
다차원 배열이라고 한다.
근데 3차원 배열(다차원 배열) 이상은 프로그래밍 수행 속도 느려짐 그래서
프로그래밍도 복잡하게 되어 효율적이지 않을 수 있다.
-배열 초기화
배열도 다른 변수와 같이 선언과 동시에 초기화할 수 있다.
int a[5];
a[0]=1; //배열 요소 a[0]를 1로 초기화
a[1]=2;
a[2]=3;
a[3]=4;
a[4]=5;
크기가 5인 정수형 배열 변수 a를 선언하여 정수 5개를 저장할 메모리 공간을 할당받는다.
각 메모리 공간에 1-5까지 숫자를 차례대로 저장하여 초기화했다.
가독성을 높이기 위해 선언과 동시에 초기화할 수 있다.
int a[5]={1,2,3,4,5};
int a[5]={1,2,3,4};
만약 배열 변수의 값이 하나 부족하면 자동으로 기본 값 0으로 저장된다.
int a[5]={1,2,3,4,5,6};
반대로 배역 변수의 값이 더 많으면 컴파일러 에러 발생 변수를 저장할 공간은 5개인데 6개의 정수를 저장하려고 하면
공간이 부족하므로 에러발생
이를 해결하기 위해서는
int a[6] or int a[]로 선언하거나 5개의 정보만 저장하도록 코드를 수정한다.
int a[ ]={1,2,3,4,5,6};
a[ ]는 에러가 발생하지 않고 아무 문제 없이 잘 수행된다.
배열 a[]를 선언하고 동시에 초깃값을 지정할 경우
컴퓨터는 초깃값의 개수를 보고
필요한 메모리 크기 만큼 메모리를 알아서 할당한다.
즉, {1,2,3,4,5,6}을 보고 6개의 정수가 저장되겠다는 것을 확인한 후
배열의 크기를 6으로 정한다.
정리하자면 a[ ]라고 선언하면 a[6]로 수행한다.
-sizeof 연산
sizeof()괄호에 변수 이름을 넣어주면
그 변수의 메모리 크기를 바이트 단위로 알려준다.
정수형 int 자료형은 4바이트이기 때문에
위 코드의 출력값은 "변수a의 메모리 크기는 4바이트이다."가 출력된다.
배열도 마찬가지
int b[10];
printf("배열 b의 메모리 크기는 %d이다.", sizeof(b));
배열의 크기는 정수형 10이고 변수 하나는 4바이트 이므로 총 *10=40바이트이다.
5개의 정수를 저장하는 데 배열c와 같이 배열 크기를 10개로 설정하는 것은 메모리 낭비이다.
그러므로 5개의 정수만 저장한다면 배열 a or b와 같이 선언하는 것이 현명하다.
크기가 30인 배열 변수 a를 선언하고 모두 0으로 초기화하려면 어떻게 해야 할까?
int a[30] ={0,0,0,0,0,0,0,0,...0};
이런 방법은 보기 불편하고 0을 하나 더 쓰거나 덜 쓰는 등 실수가 발생할 수 있다.
int a[30] ={0,}; 처럼 간결하게
a[0]부터 a[29]까지 모두 0으로 자동을 초기화 된다.
문제
배열 크기가 30인 정수형 배열 a를 선언한 후 모두 0으로 초기화하고 홀수 번째 배열 요소만 출력하는 프로그램을 작성하시오.
i=1<30;
a[1]=0
배열 1번째 값은 0이다.
------------i+=2-------------
i=3<30;
a[3]=0
배열 1번째 값은 0이다.
------------i+=2-------------
이런 식으로 진행된다.
배열 크기 5인 정수형 배열 b를 선언하고 모두 1로 초기화하려고 한다.
int b[5]={1,};
이렇게 코드를 작성하면 될 것이라고 생각하지만 이렇게 작성하면
b[0]=1;
b[1]=0;
b[2]=0;
b[3]=0;
b[4]=0;
배열의 첫번째 값만 1로 초기화하고 나머지는 0으로 초기화되었다.
모두 1로 저장하는 방법을 생각해보자
문제
배열 b의 모든 값을 1로 초기화하시오.
다차원 배열 초기화 1번째 방법
int a[2][3]= {1, 2, 3, 4, 5, 6};
int[0][0]=1;
int[0][1]=2;
int[0][2]=3;
int[1][0]=4;
int[1][1]=5;
int[1][2]=6;
다차원 배열도 1차원 배열과 마찬가지로
{}안에 배열요소 값을 순서대로 나열하면 된다.
다차원 배열 초기화 2번째 방법
int a[2][3]= {1, 2, 3, 4, 5, 6};
int a[2][3]= {
{1,2,3},
{4,5,6}
};
다차원 배열 초기화 세 번째 방법
int a[2][3]= {1, 2, 3, 4, 5, 6};
int a[2][3]= {
{1,2},
{3,4},
{5,6},
};
문제
아래와 같이 출력되는 배열 요소의 합을 구하시오.
문제 아래 처럼 출력되도록 코드를 작성하시오
문제
a[2][3]의 2차원 배열 for문을 통해 1로 초기화하는 프로그램을 작성하시오.
-문자 배열
문자: 'a' '#' '8' '가'
문자열: "Hi, C"
문자는 말 그래로 문자 '하나'를 의미한다.
문자열은 문자의 조합이다.
앞에서 문자를 저장하기 위해 자료형 char를 배웠다.
문자열은 어떻게 해야 할까?
이때가지 문자열은 큰 따옴표("")사이에 하나 이상의 문자를 넣어 표기하고
printf()함수 안에 사용해왔다.
C언어에서는 문자열을 저장하기 위한 특별한 자료형을 제공하지 않는다.
C언어에서는 문자하나만을 저장할 수 있는 char형 변수를 사용하여 문자열까지 저장해야 한다.
문자열 저장하는 방법
1. char자료형과 배열의 조합으로 가능하다.
2. 다음시간에 배울 포인터를 사용하는 것이다.
1번 방법에 대해서 알아보겠다.
"Hi, Tom!"에서 저장할 문자는 총 8개이다.
콤마와 느낌표, 공백도 하나의 문자이다.
우리가 저장할 문자는 8개이지만, 정확하게 9개이다.
나머지 하는 바로 문장의 끝을 의미하는 널 문자(NULL)이다.
NULL또는 '\0'이라고 표기
문자열을 저장할때는 반드시 '\0'(널 문자)를 저장해야 한다.
이것은 컴파일러에 널 문자를 사용하여 "나의 문자열의 끝이 여기다!"라고
정확하게 알려줘야, 컴파일러는 문자열을 정확하게 구분할 수 있기 때문이다.
컴파일러는 널 문자를 만나면 문장의 끝으로 인식한다.
문자 자료형과 배열을 이용한 문자열 저장방법
"Hi, Tom!"
1. char s1[9]= {'H','i',','...'\0'};
2. char s1[9]= "Hi, Tom!";
->""사이에 문자영을 초기화하여 저장하는 방식
1번과 달리 널 문자를 컴파일러가 초기화 할때 자동으로 추가
2-1. char s1[]="Hi, Tom!";
-> 배열의 크기를 저장하지 않고 선언해도
C언어 컴파일러가 자동으로 배열의 크기를 정하여 배열을 초기화한다.
'C언어' 카테고리의 다른 글
C언어 <문자열> <함수 포인터> (0) | 2023.07.26 |
---|---|
C언어 <포인터> (0) | 2023.07.25 |
C언어 <함수> (0) | 2023.07.21 |
C언어 <반복문> 13~19 문제 풀이 (0) | 2023.07.21 |
C언어 난수를 활용한 게임 (0) | 2023.07.21 |