-
8장. 배열에 대하여C++ 기본 문법 알아보기 2019. 1. 11. 23:32
배열이란?
배열은 동일한 타입의 변수 여러 개를 묶어 놓은 것이다.
만약 100개의 제품의 가격을 다루어야 한다고 생각해보자.
그러기 위해선 int형 변수를 100개 선언해야 할 것이다.
배열을 사용하면 변수 100개를 선언하는 것과 똑같은 코드를 아주 짧게 선언할 수 있다.
배열의 사용법은 일반 변수의 선언과 똑같이 한 뒤, 뒤에 대괄호와 그 안에 원소의 개수를 넣어주면 된다.
배열의 예제를 직접 보자.
int main()
{
int score[5];
score[0] = 10;
score[1] = 5;
score[2] = 40;
score[3] = 60;
score[4] = 50;
return 0;
}
이렇게 5개의 원소를 갖는 배열을 정의하게 되면 컴퓨터에는 int 타입의 값을 담을 수 있는 공간이 5개 생긴다.
즉, int 타입이 4바이트인 환경에서는 4 * 5 = 20 바이트 만큼의 공간이 확보되는 것이다.
그리고 배열의 첫번째 요소는 1이 아닌 0부터 시작이다.
중요한 개념이니 꼭 알아두자!
이제 전 글에서 배웠던 반복문을 통해서 배열의 원소를 출력해보자.
#include <iostream>
using namespace std;
int main()
{
int score[5];
score[0] = 10;
score[1] = 5;
score[2] = 40;
score[3] = 60;
score[4] = 50;
for (int i = 0; i < 5; i++)
{
cout << i << " 번째 원소 : " << score[i] << "\n";
}
return 0;
}
각 원소의 값이 잘 출력 된 것을 볼 수 있다.
이제 배열을 선언과 함께 초기화 하는 법을 알아보자.
#include <iostream>
using namespace std;
int main()
{
int score[5] = {10, 5, 40, 60, 50};
for (int i = 0; i < 5; i++)
{
cout << i << " 번째 원소 : " << score[i] << "\n";
}
return 0;
}
같은 결과가 출력된다.
그렇다면 만약 부분만 초기화 해주면 어떻게 될까?
#include <iostream>
using namespace std;
int main()
{
int score[5] = {10, 5};
for (int i = 0; i < 5; i++)
{
cout << i << " 번째 원소 : " << score[i] << "\n";
}
return 0;
}
초기화에서 제외된 원소의 값은 자동적으로 0으로 채워지는 것을 볼 수 있다.
배열에 관련된 규칙들
배열을 사용하면서 사용할 수 있는 팁과 오류를 발생하는 것들에 대해 알아보자.
우선 처음으로 배열의 초기화를 사용하면 배열의 크기를 지정해주지 않아도 된다.
int score[] = {10, 5, 40, 60, 50} // 가능
물론 배열을 선언할 때 말고는 초기화 할 수 없다.
int score[];
score = {10, 5, 40, 60, 50} // 오류
그리고 배열끼리의 대입은 불가능하다
int A[3] = {1, 2, 3};
int B[3] = A; // 오류
배열의 값을 복사해서 넣기 위해서는 반복문을 사용하면 된다.
int main()
{
int A[3] = {1, 2, 3};
int B[3];
for (int i = 0; i < 3; ++i)
{
B[i] = A[i];
}
return 0;
}
배열의 크기
아까도 말했듯이 배열을 선언하면 자료형 크기 * 원소의 개수 만큼의 크기를 갖는다.
sizeof 연산자를 사용하면 쉽게 크기를 구할 수 있다.
각각 다른 자료형의 배열의 크기를 출력해보자.
#include <iostream>
using namespace std;
int main()
{
char cArr[3] = {'A', 'B', 'C'};
int iArr[4] = {10, 20, 30, 40};
double dArr[5] = {0.1, 0.2, 0.3, 0.4, 0.5};
cout << "sizeof(cArr) = " << sizeof(cArr) << " (Bytes) \n";
cout << "sizeof(cArr[0]) = " << sizeof(cArr[0]) << " (Bytes) \n";
cout << "원소의 개수 = " << sizeof(cArr) / sizeof(cArr[0]) << " (Bytes) \n\n";
cout << "sizeof(iArr) = " << sizeof(iArr) << " (Bytes) \n";
cout << "sizeof(iArr[0]) = " << sizeof(iArr[0]) << " (Bytes) \n";
cout << "원소의 개수 = " << sizeof(iArr) / sizeof(iArr[0]) << " (Bytes) \n\n";
cout << "sizeof(dArr) = " << sizeof(dArr) << " (Bytes) \n";
cout << "sizeof(dArr[0]) = " << sizeof(dArr[0]) << " (Bytes) \n";
cout << "원소의 개수 = " << sizeof(dArr) / sizeof(dArr[0]) << " (Bytes) \n\n";
return 0;
}
배열의 크기가 어떻게 정해지는지 잘 알 수 있다.
배열에서의 문자열 사용
앞으로 c++을 통해 프로그램을 만들다보면 문자열은 아주 중요한 개념이다.
문자열이란 문자를 담은 배열이다.
그런데 반드시 마지막 문자가 "\0"이어야 한다.
"\0"은 아스키 코드가 0인 문자를 의미하는데 NULL을 의미한다.
그렇다면 만약 마지막 문자에 NULL이 없다면 어떻게 될까?
#include <iostream>
using namespace std;
int main()
{
char String[] = {'H', 'e', 'l', 'l', 'o', '\0'};
char nString[] = {'H', 'e', 'l', 'l', 'o'};
cout << String << "\n";
cout << nString << "\n";
return 0;
}
NULL이 들어가지 않은 문자열은 쓰레기 값이 같이 출력되는 것을 볼 수 있다.
그 이유는 cout 객체가 문자열을 처리하는 방식과 관련이 있다.
cout 객체 뿐만 아니라 문자열을 다루는 많은 코드들은 반복 명령을 통해서 한 글자씩 처리한다.
그런데 이 반복 명령의 종료 조건이 바로 "NULL 문자를 만날 때 까지"이기 때문에 다른 메모리 영역을 침범해 쓰레기 값이 출력된다.
예제를 보고 이해하자.
#include <iostream>
using namespace std;
int main()
{
char String[] = {'H', 'e', 'l', 'l', 'o', '\0'};
char String2[] = {'H', 'e', '\0', 'l', 'l', 'o'};
cout << String << "\n";
cout << String2 << "\n";
return 0;
}
문자열 상수
다음 코드를 보자.
#include <iostream>
using namespace std;
int main()
{
char cArr1[] = "ABCDE";
char cArr2[] = {'A', 'B', 'C', 'D', 'E', '\0'};
cout << "sizeof(cArr1) = " << sizeof(cArr1) << "(Bytes)\n";
cout << "sizeof(cArr2) = " << sizeof(cArr2) << "(Bytes)\n";
cout << cArr1[4] << (int)cArr1[5] << "\n";
cout << cArr2[4] << (int)cArr2[5] << "\n";
return 0;
}
이렇게 문자열 상수를 사용하면 자동으로 NULL값이 들어가는 것을 볼 수 있다.
다음 글에서는 구조체에 대해서 배워보자.
'C++ 기본 문법 알아보기' 카테고리의 다른 글
10장. 포인터 변수란? (0) 2019.02.15 9장. 구조체에 대하여 (0) 2019.01.12 7장. 반복문 (0) 2019.01.10 6장. 조건문이란? (0) 2019.01.09 5-2장. 비트 단위 연산자와 연산자 마무리 (0) 2019.01.08