인공지능 개발일지

[C언어] 배열의 A-Z까지, 본문

개발 지식/C,C++

[C언어] 배열의 A-Z까지,

Prcnsi 2021. 6. 13. 23:01
728x90

안녕하세요! 여러분들 잘 지내셨나요?

벌써 여름이 오고 있음이 느껴지는 계절입니다.

오늘은 배열에 관해 정리해 보려 합니다.

 

 


 

 

 

1.자료형별 배열

  저는 처음 배열을 배울 때 자료형 별 배열이 직관적으로 이해되지 않았습니다.

  그런데 아래와 같이 생각하니까 이해가 되더라고요.

  

  그러니까 보통 자료형을 말할 때 크기가 다른 그릇이라고 하잖아요?

  배열은 아래와 같은 형식으로 선언하는데요.

  자료형 변수명[배열의 크기]=값;

 

  이것의 의미는 선언한 자료형 X 배열의 크기로 연속된 공간을 할당하는 것입니다.

  아래는 그 예시입니다.

  

int a
int a[7]

 

char b

 

 

char b[6]

 

float c
char c[4]

 

 

 

  조잡한 그림이지만 직관적인 전달을 위해 그려 봤습니다.

  그러니까 자료형별로 크기가 다른데 배열이란 것은 메모리에서 연속으로 공간을

  할당하는 것입니다. 

  

  그런데 참고로 이와 같이 같은 자료형을 연속으로 묶어주는 것이 있다면

  다른 자료형을 묶어주는 것도 있습니다.

 

<구조체>

  

  위와 같이 말이죠. 이것을 구조체라고 합니다. 이를 이용하면 정보를 매우 효율적으로 관리할 수 있지요.

  이는 다음 포스팅에서 다루기로 하고 다시 본론으로 돌아가서

  이제 배열이 무엇인지 아시겠죠? 

  

  그렇다면 이의 종류와 사용법 다차원 배열에 관해 알아봅시다.

 

 

 

 

 

 

 

2. 배열의 종류

  배열은 용도에 따라 두 가지로 나눌 수 있습니다. 

 

  여기서 주의할 점은 배열의 끝이 아닌 문장의 끝은 0(NULL)으로 인식한다는 것입니다.

  이것을 유의하고 한 번 살펴봅시다.

 

  1)배열 선언 방법

    배열을 선언하는 방법에는 두 가지가 있습니다.

 

    첫 번째는 중괄호를 사용하는 것이고, 두 번째는 큰 따옴표를 사용하는 것입니다.

    이 둘은 결과적으로는 같은 배열을 만들지만 중괄호로 선언한 배열은 좀 더 널 값을 이용하여

    문장의 끝을 정해줄 수 있습니다.

 

    예를 들어 아래와 같이 중괄호로 Hello world를 선언한 배열 a와

    큰 따옴표로 선언한 배열 b가 있습니다.

 

배열 예제

    이를 출력해보면 둘 다 Hello world라는 문장을 출력합니다.    

출력

   

    이것이 의미하는 것은 중괄호로 선언하든 큰 따옴표로 선언하든 동일하게 아래와 같은

    배열이 선언된다는 것입니다.

인덱스 0 1 2 3 4 5 6 7 8 9 10 11
H e l l o   W o r l d 0

 

 

 

 

 

    그런데 흥미로운 것은 배열 a에서 5번째 인덱스에 공백이 아닌 널(0) 값을 할당하면

    아래와 같이 Hello까지만 출력된다는 것이죠.

 

널값 예제
널값 결과

 

 

    그리고 이때 a의 배열은 아래와 같은 구조를 가집니다.

    여기서 주목해야할 부분은 5번째 인덱스의 널 값인데요.

    널 값은 문자의 끝이라는 의미이기 때문에 이를 문장으로 출력하면 Hello 까지만 출력되는 것입니다. 

인덱스 0 1 2 3 4 5 6 7 8 9 10 11
H e l l o 0 W o r l d 0

 

    이를 통해 배열을 선언하는 방법을 알아보았습니다.

 

 

 

 

2) 배열의 종류

    배열은 용도에 따라 두 가지로 나눌 수 있습니다.

    첫 번째는 바로 위의 예제와 같이 '문장'을 표현하기 위한 배열이고 두 번째로는 문자의 '배열'이다.

    이는 형식지정자의 차이이다.

 

    (참고로 문장을 표현하기 위한 배열은 string이라고 한다.

    그래서 형식지정자가 string의 앞 글자를 딴 % s이다)

 

'문장'을 표현하기 위한 배열(string) %s
'문자'의 배열 %c

   

    배열을 문장으로 표현할 때는 널 값이 문장의 길이에 영향을 끼쳤지만

    문자의 배열로서 배열은 널 값이 있더라도 값이 손실되지 않는다.

    

 

    예를 들어 아래와 같이 널 값을 포함한 배열 a가 있을 때 

    4번째 줄 코드와 같이 문장으로 출력하면 값의 손실이 있지만

    7번째 줄 코드와 같이 단어로 출력하면 모두 출력되는 것을 확인할 수 있다.

 

단어의 배열

   

출력 결과

 

 

 

3) String 함수

    앞서 문장과 문자의 배열 차이를 알아봤다. 그때 문장을 표현하기 위한 배열을 String이라고 했는데

    이 Sting에는 내장 함수가 있다.

    내장 함수는 아래와 같다.

    

strlen(const char *str1) str의 길이를 계산
strcmp(const char *str1,const char *str2) str1과 str2가 같은지 비교후 같으면 0반환
strcpy(char *str1,char *str2) str2=>str1으로 복사
strcat(char *str1,char *str2) str2를 str1끝에 붙임
strcat(char *str1,char *str2) str1에서 str1과 str2의 교집합부터 끝까지 리턴

    strcmp반환 값으로 다르면 아래와 같은 값을 반환합니다.

    -str1>=str2:양수

    -str1 <str2:음수

    (참고로 strcmp는 구조체에서 문자열 값을 할당할 때 유용하게 사용된다)

 

 

 

 

 

3. 다차원 배열

  다차원 배열은 2차원 3차원 다 있지만 기본적인 베이스는 2차원 배열이기 때문에 이를 이해하면 

  쉽게 사용할 수 있다. 2차원 배열은 아래와 같이 선언한다.

  자료형 변수명[행][열];

  

  예를 들어 3행 3열짜리 int형 배열에 값을 할당하고 이를 출력할 수 있다.

2차원 배열
결과

  추가적으로 3차원 배열은 아래와 같다.

자료형 변수명[x축방향 길이][y축방향 길이][z축방향 길이];

  그러니까 변수명 옆에 대괄호의 개수 n이 차원의 개수만큼 있는 것입니다.

  하지만 이 3차원 배열보다는 2차원 배열이 더 활용도가 높으니 2차원 배열만 완벽하게 이해하시면 되겠습니다.

 

마지막으로 글을 마무리하기 전에 배열의 개수를 앞선 포스팅에서 배운 매크로를 이용하여 선언할 수 있습니다.

[C언어] 헤더 파일과 전처리기 (tistory.com)

 

[C언어] 헤더파일과 전처리기

안녕하세요! 여러분들 잘 지내셨나요? 저는 한동안 시험기간이여서 뜸했습니다. 그래서 1학기 동안 배운 것들을 한 번 정리해보는 시간을 가질까 합니다. 대략 6장 정도로 제가 이해한 것을 정리

perconsi.tistory.com

 

 

그러니까 매크로 상수는 값이 변하지 않는 상수를 설정할 때 유용한데 

보통 이를 배열의 크기로 선언하곤 합니다.

그런데 이때 주의할 점은 변수의 크기는 매크로 상수+1을 해야 한다는 사실입니다.

 

왜냐하면 크기가 n인 배열을 선언한다는 것은 n개의 문자 혹은 숫자를 저장한다는 뜻인데

배열의 마지막 자리에는 항상 널 값이 할당되는데 배열의 크기를 딱 n개로 하면

마지막 값을 손실할 위험이 있습니다.

 

그래서 마지막 널 값이 들어갈 자리를 고려하여 배열의 크기는 +1을 해줘야 합니다.

아래는 그 예제입니다.

매크로 상수로 배열크기 설정

 

 

 


 

 

 

이해가 잘 가시나요? 오늘은 배열에 대해 알아보았습니다.

다음 포스팅은 구조체 다다음 포스팅은 포인터가 예정되어 있습니다.

빠른 시일 내에 업로드하도록 하겠습니다.

오늘도 방문해 주셔서 감사합니다. 

좋은 하루 보내세요!

728x90

'개발 지식 > C,C++' 카테고리의 다른 글

[C++] 벡터, 스택, 큐 사용법과 차이  (0) 2023.05.02
[C언어] 포인터 사용 법  (0) 2021.06.18
[C언어] 구조체  (0) 2021.06.15
[C언어] 헤더파일과 전처리기  (2) 2021.06.10
[C언어] 파일 입출력  (0) 2021.06.02