티스토리 뷰
정말 오랜만에 C언어 포스팅을 합니다. 꾸준히 열심히 하기로 했는데 다른 일로 너무 바빠서 꽤 오랜기간 포스팅을 못했는데 너무 쉬면 안될것 같아 짬날때 조금씩이라도 이어서 포스팅을 해보겠습니다. 지금까지 내용을 정리해보면 간단한 입출력 + 자료형과 형변환 + 연산자 + 반복문까지 익혀보았습니다. 이제는 반복문을 활용할 때 거의 필연적으로 같이 쓰이게되는 배열에대해 알아보겠습니다.
자료형에대해 학습해 볼 때 저희는 한번의 변수 선언마다 한개씩 사용해야 했습니다. 이번에 배워볼 배열이라는 놈은 자료형의 집합이라고 보시면 됩니다. 한번의 선언에 같은 자료형을 여러개를 사용할 수 있도록 해주는 자료형의 묶음이죠.
바로 예를 들어보겠습니다.
int variable_one = 4; //int형 변수 하나를 선언
int variable_array[10000]; //int형 변수 만개를 선언
첫번째 줄은 int형 변수 하나를 선언하는 코드입니다.
두번째 줄은 같은 int형 변수이지만 한번의 선언으로 int형 변수 10000개를 선언하는것과 동일합니다.
사용법은 이전 변수 선언과 마찬가지로 자료형을 먼저 입력하고 변수명을 정한뒤 대괄호 '[ ]' 안에 원하는 자료형의 개수를 적어넣으면 됩니다.
*변수명에 array라는 단어가 있는데 프로그래밍에서 배열을 영어로 array, 혹은 줄여서 arr이라고 선언하곤 합니다.
그럼 이제 저 만개의 int형 변수를 어떻게 사용하는지 알아보겠습니다.
for(int i = 0; i < 10000; i++){
printf("%d\n", variable_array[i]);
}
배열의 구성요소중 하나의 변수를 보통 배열의 원소라고 합니다. 반복문을 통해 각각 배열의 원소를 사용하기 위해서는 원하는 배열의 원소의 인덱스를 대괄호안에 입력하면 됩니다. 위의 코드에서 i가 배열의 원소에 접근하기 위한 인덱스가 되며 위와 같이 코드를 작성할 경우 배열의 첫번째 값부터 10000번째 값까지 출력하게 됩니다.
여기서 중요한점은 첫번째 원소의 인덱스가 [1]이 아닌 [0]이라는 점입니다. 배열은 사용의 편의성을 위해 인덱스의 시작을 0으로 둡니다. 여기서 왜 0으로 시작하는것이 편하느냐에 대해 알기 위해서는 변수를 메모리에 적재하는 방식이나 포인터의 주소를 할당하는 방식 등 현재는 아주 어려운 길을 들어서야 하기 때문에 단순히 사용하기 편하다 라는 것 정도만 알아둡시다.
아무튼 처음에는 1이 아닌 0부터 시작한다는점 때문에 오히려 헷갈릴수도 있지만 사용하면 할수록 코드작성에서도 0으로 시작하는것이 더 편하다는것을 느끼실 수 있을것입니다. 그리고 첫번째 원소가 0으로 시작한다면 당연히 끝의 원소도 [10000]으로 끝나는것이 아닌 [9999]로 끝나게됩니다.
정리를 해보자면 배열을 선언하는 시점에는 10000개를 의미하는 숫자 10000을 대괄호에 입력하여야 하고 실질적으로 배열을 사용할 때는 0~9999번을 사용하여 인덱싱하여야 합니다. 여기서 숫자10000은 당연히 자유롭게 변하는 크기라는점 모두 아시겠죠? 절대 반드시 10000개를 사용하여야 하는것이 아닙니다. 2개를 사용하더라도 이것은 배열입니다.
모든 자료형에 대해서 배열을 사용할 수 있습니다. 그럼 여기서 재밌는게 지난 포스팅에서 문자 자료형 char를 배웠습니다. 문자의 배열을 사용하면 그럼 어떻게 될까요? 말 그래도 문자를 여러개 이어 붙인것이기 때문에 문장이라고 볼 수 있습니다. 프로그래밍에서는 문자의 배열을 문장이라고 하지 않고 문자열이라고하며 영어로 string이라고 일컫습니다.
다음 예제를 보시죠.
int main()
{
char string[6] = { 'a','p','p','l','e' };
printf("%s\n", string);
}
char형 배열 string을 선언하고 안에 apple을 저장하였습니다. 위에서 설명을 안드렸지만 선언과 동시에 값을 저장할 때는 위 코드처럼 중괄호 안에 각 원소값 사이에 쉼표로 구분지어 값을 할당합니다. 위처럼 작성하면 string 배열의 첫번째부터 a가 들어가게됩니다.
그리고 문자열을 출력하기 위한 printf의 기호는 %s입니다. 그래서 string배열을 출력하게되면 정상적으로 apple이 이어서 출력됩니다. 다만 여기서 중요한점은 string배열의 크기가 5가아니라 6이라는 점입니다. apple은 다섯글자인데 왜 6개를 사용해야 할까요? C언어에서 문자열을 다룰때 가장 중요한것은 문장의 끝에 null이 와야한다는것 입니다.
null은 컴퓨터 용어로 '아무것도 없음'을 의미하는데 문장의 끝에 null을 위치시킴으로서 이곳이 문장의 끝임을 컴퓨터에게 명시적으로 알려줘야합니다. 그렇지 않을 경우 %s는 문장의 끝을 찾을 때까지 의도치 않은 이상한 값을 끌어와 계속해서 출력하게 됩니다. 따라서 항상 문자열의 끝에 null이 와야 한다는것을 잊지 말아 주시길 바랍니다.
이제 다음으로는 2차원, 3차원 배열에 대해 알아보겠습니다. 지금까지 위에서 다룬 내용은 1차원 배열입니다. 수학으로 따지면 점이 하나의 자료형이 되고 이를 모아 선이된것이 1차워 배열입니다. 그리고 1차원 배열을 모아 면이 되면 2차원배열, 2차원 배열을 모아 공간이 되면 3차원 배열이 되는것이죠.
바로 예제를 봅시다.
int array2[3][10]; //2차원 배열
int array3[3][4][5]; //3차원 배열
1차원 배열과 사용법은 같습니다. 다만 대괄호의 수가 늘어날 뿐이죠. 각 차원의 크기는 왼쪽에서부터 큰 차원의 크기에 해당합니다. 위에서 2차원 배열은 10개짜리 1차원 배열이 3개가 있도록 선언한 것이고 3차워배열은 5개짜리 1차원배열이 4개가 있고 이러한 2차원배열이 3개가 있는 3차원배열입니다.
즉 2차원 배열은 3*10 = 30개의 int형 변수 3차원 배열은 3 * 4 * 5 = 60개의 int형 변수를 선언한것입니다.
더 쉽게 그림으로 표현해보겠습니다
/*
2차원 배열
o o o O o o o o o o
o o o o o o o o o o
o o o o o o o o o o
3차원 배열
o o o o o
o o o o o
o o o o o
o o o o o * 3
*/
3차원 배열은 표현이 어렵네요. 저렇게 5개의 배열이 4줄씩 3겹으로 겹쳐져 있는 모습을 떠올리시면 될 것 같습니다.
사용법도 1차원과 동일합니다. 원하는 원소에 접근하기 위해 적절한 인덱스를 넣으면 됩니다.
위에서 큰 O표시를 한 원소에 접근하기 위한 인덱싱으로는 array2[0][3] 이라고 사용하면 되겠죠.
2차원의 제일 첫번째 줄에 위치해있으므로 0으로 먼저 인덱싱한후 첫번째 줄의 4번째의 값이 위치해 있으니 3을 인덱싱하면 됩니다.
여기까지 배열의 기본 활용법에 대해 알아보았습니다. 다음 실습을 통해 반복적으로 연습하여 배열을 자유자재로 사용할 수 있도록 공부해보세요.
실습
구구단의 결과값을 2차원 배열을 활용하여 저장하고 출력하는 프로그램을 작성해보세요.
백준 알고리즘 홈페이지의 1차원 배열에 해당하는 문제들을 풀어보세요. 실력향상에 아주 큰 도움이 됩니다.
프로그래밍은 이론보다는 아주 많은 실습을 해보는것이 실력향상에 큰 도움이 됩니다. 지루하더라도 반복적으로 다양한 시도를 해보시고 모르시는 점은 질문 남겨주시면 언제든지 답변 드리겠습니다.
도움이 되셨다면 좋아요 부탁드립니다.
'C언어' 카테고리의 다른 글
C++ - 이길수 없는 틱택토 인공지능 만들기 (7) | 2021.04.14 |
---|---|
C 제9강 - 함수 활용하기 (0) | 2020.02.19 |
C 제7강 - 조건문과 반복문 (0) | 2020.02.17 |
C 제6강 - 연산자 (0) | 2020.01.30 |
C 기초 - printf 와 scanf (0) | 2020.01.19 |
- Total
- Today
- Yesterday
- 깃 허브 오류 해결
- 젠킨스
- c언어강의
- 안드로이드
- 언리얼
- refusing to run with root privileges
- 젠킨스 에이전트 연결
- 언리얼 사용자 정의 구조체
- 언리얼 빌드
- 깃 용량문제
- 언리얼 기초
- 안드로이드 구글맵
- 유니티
- C++
- Jenkins Build Periodically
- C언어기초
- Connecting Jenkins Agent
- Unreal Header Tool
- 백준
- c언어 기초
- 알고리즘
- Add Node
- 구글맵
- Connecting Jenkins
- 알고리즘기초
- 빌드 주기
- 유니티 직소퍼즐 구현
- UHT
- dfs
- Jenkins
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |