『Lena's by ☆볶기!!』: Restart !!

Rorolena
1-7 변수를 여러 개 모아놓은 변수

-/1. 배열의 기본/-

배열의 사용
-----------------------------------------------------------------------
int main()
{
 // int 타입의 배열 정의
 int kor_scores[5];

 // 임의의 값을 넣어본다.
 kor_scores[0] = 100;
 kor_scores[1] = 100;
 kor_scores[2] = 100;
 kor_scores[3] = 100;
 kor_scores[4] = 100;

 return 0;
}
-----------------------------------------------------------------------
point

1. 배열의 사용방법은 int kor_scores[5];와 같이
사용할 변수 타입 변수이름 변수의 개수를
차례대로 적어 사용하면 된다.

2. 배열의 각각의 변수들을 배열의 원소라 하며
이 배열의 원소들은 각각의 인텍스를 부여 받는다.
여기서 중요 한점은  배열의 첫번째 원소는 0의 인덱스를 가진다.
만약 1~5까지의 원소가 있다면 1~5의 인덱스가아닌
0~4의 인덱스를가진다.

tip

1. 배열의 범위와 접근 위반.
배열을 사용할때 생성한 배열원소 보다
그이상의 배열 원소를 접근할수 있다.
다만 이는 접근 위반이라는 문재를 일으켜
사용하는 프로그램과 그외의 프로그램에 문재가 발생한다.
대부분 이런경우 윈도우에서 오류는 띄워주지만
적당히 가까운 값을 부를경우에는 띄워지지 않는다.
허나 이는 오히려 오류가 눈에띄이지 않아
더큰 문재를 야기할수 있다.

원소의 탐색
-----------------------------------------------------------------------
#include <iostream>
using namespace std;

int main()
{
 // int 타입의 배열 정리
 int kor_scores[5];

 // 임의의 값을 넣어본다.
 kor_scores[0] = 100;
 kor_scores[1] = 188;
 kor_scores[2] = 92;
 kor_scores[3] = 40;
 kor_scores[4] = 76;

 // 각 원소의 값을 출력한다.
 for(int i = 0; i < 5; ++i)
 {
  cout << i << " 번째 원소 = " << kor_scores[i] << "\n";
 }

 return 0;
}
-----------------------------------------------------------------------
point

1. 배열을 선언후 for문을 이용하여
별도의 변수를 선언하여 인덱스에 매회
값을 더하여 순차적으로 띄우도록 하였다.

배열의 초기화
-----------------------------------------------------------------------
#include <iostream>
using namespace std;

int main()
{
 // 배열을 정의하면서 초기화시킨다.
 int kor_scores[5] = {100, 88, 92, 40, 76};

 // 각 원소의 값을 출력한다.
 for(int i = 0; i < 5; ++i)
 {
  cout << i << " 번째 원소 = " << kor_scores[i] << "\n";
 }

 return 0;
}
-----------------------------------------------------------------------
point

1. int kor_scores[5] = {100, 88, 92, 40, 76};와같이
배열을 정의하면서 초기화가 가능하다.
물론 배열의 크기보다 적은 개수의 초기 값을 넣어 줄수 있다.
초기화에서 제외된 원소의 값은 자동적으로 0으로 채워지게 된다.

2. 배열은 가능한 초기화를 시켜주어야하는대
int kor_scores[5] = {0};와 같이 적어주면
배열의 모든 원소를 0으로 초기화하는 것을 쉽게 할수 있다.

tip

1. 초기화의 필요성
보통의 프로그램은 메모리 공간을 사용후 초기화 하지를 않고
그뒤 사용하는 프로그램은 비어있는 메모리의 임의 공간을
확보하여 사용 하는 것이기에 0으로 초기화 하지않고 그공간을 이용할경우
전에 쓰던 프로그램의 쓰레기값이(잔류 데이타가) 남아 엉뚱한 값을 출력하기도 한다.
또한 초기화를 해주지 않으면 프로그램은 자동으로 0으로 채워주지않는다.
이는 프로그래머가 집적해야할 부분이다.

2, 배열의 초기화를 사용하면 배열의 크기를 지정해주지 않아도 된다.
예로 int kor_scores[] = {100, 88, 92, 40, 76}와 같이 사용할수 있다.
단 배열을 정의할 때 말고는 초기화할  수 없으며
또한 배열끼리 대임하는 것도 불가능하다.
cf1)
int kor_scores[];
kor_scores = {100, 88, 92, 40, 76}; // 오류

cf2)
int arrayA[3] = {1, 2, 3};
int arrayB[3] = arrayA; // 오류

arrayB = arrayA; // 오류

배열의 원소를 복사하기
-----------------------------------------------------------------------
int main()
{
 // 두 개의 배열 정의
 int arrayA[3] = {1, 2, 3};
 int arrayB[3];

 // arrayA의 내용을 arrayB로 복사한다.
 for(int i = 0; i < 3; ++i)
 {
  arrayB[i] = arrayA[i];
 }

 return 0;
}
-----------------------------------------------------------------------
point

1. 배열과 배열을 대입하면 원하는 배열을 복사를 시킬수있다.

sizeof 연산자의 사용
-----------------------------------------------------------------------
#include <iostream>
using namespace std;

int main()
{
 double d;
 int i;
 char a;

 // sizeof의 다양한 사용
 cout << "sizeof(d) = " << sizeof(d) << " (bytes)\n";
 cout << "sizeof(i) = " << sizeof(i) << " (bytes)\n";
 cout << "sizeof(a) = " << sizeof(a) << " (bytes)\n";
 cout << "sizeof(double) = " << sizeof(double) << " (bytes)\n";
 cout << "sizeof(int) = " << sizeof(int) << " (bytes)\n";
 cout << "sizeof(char) = " << sizeof(char) << " (bytes)\n";

 return 0;
}
-----------------------------------------------------------------------
point

1. sizeof로 변수와 타입의 크기를 알수있다.
또한 이를 응요하여 배열의 크기 또한 알아낼수있다.

배열의 크기 확인
-----------------------------------------------------------------------
#include <iostream>
using namespace std;

int main()
{
 // 세 가지 종류의 배열을 정의한다.
 char cArray[3] = { 'A', 'B', 'C' };
 int iArray[4] = { 100, 200, 300, 400};
 double dArray[5] = { 0.1, 0.2, 0.3, 0.4, 0.5};

 // cArray의 크기에 대한 조사
 cout << "sizeof(cArray) = " << sizeof(cArray) << " (Bytes)\n";
 cout << "sizeof(cArray[0]) = " << sizeof(cArray[0]) << " (Bytes)\n";
 cout << "원소의 개수 = " << sizeof(cArray) / sizeof(cArray[0]) << " (Bytes)\n\n";

 // iArray의 크기에 대한 조사
 cout << "sizeof(iArray) = " << sizeof(iArray) << " (Bytes)\n";
 cout << "sizeof(iArray[0]) = " << sizeof(iArray[0]) << " (Bytes)\n";
 cout << "원소의 개수 = " << sizeof(iArray) / sizeof(iArray[0]) << " (Bytes)\n\n";

 // dArray의 크기에 대한 조사
 cout << "sizeof(dArray) = " << sizeof(dArray) << " (Bytes)\n";
 cout << "sizeof(dArray[0]) = " << sizeof(dArray[0]) << " (Bytes)\n";
 cout << "원소의 개수 = " << sizeof(dArray) / sizeof(dArray[0]) << " (Bytes)\n\n";

 return 0;
}
-----------------------------------------------------------------------
point

1. 위와 같은 방식으로 배열의 크기를 확인할수있고
sizeof(cArray[0])와같이 사용하여 해당배열의 원소
크기를알수있으며 sizeof(iArray) / sizeof(iArray[0])와 같이
사용하면 원수의 개수또한 알수 있다.

원소의 크기 10을 직접 적어준 경우
-----------------------------------------------------------------------
int main()
{
 // 배열의 정의
 int array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

 // 각 원소의 값을 두 배로 만든다.
 for(int i = 0; i < 10; ++i)
 {
  array[i] *=2;
 }
 return 0;
}
-----------------------------------------------------------------------
point

1. 위의 배열을 가공처리가 필요하여
아래와 같은 공식을 만들어 주었을때
조건을 능동이아닌 지적을 했을경우
만약 코드수정시 조건또한 수정해야한다.

이럴경우 이를 10이라는 지정숫자 대신
i < sizeof(array) /sizeof(array[0]); ++i
와같이 능동적으로 사용할수 있다.

tip

1. 성능 문제
위의 예제에서 for문 이 반복 되어 프로그램이
느려지지 않을까 생각하지만 이점은
컴퓨터가 프로그램을 실행하기 전에
sizeof(array) / sizeof(array[0])의 값을
계산해두고 매회 연산마다 그 값을  사용한다.

-/2. 배열에서의 문자열 사용/-

NULL 문자의 중요성
-----------------------------------------------------------------------
#include <iostream>
using namespace std;

int main()
{
 // 그냥 문자의 배열을 만든다.
 char ThisIsNotString[] = { 'H', 'e', 'l', 'l', 'o'};

 // 문자열을 만든다.
 char ThisIsString[] = { 'H', 'e', 'l', 'l', 'o', '\0'};

 // 두 배열을 cout 객체로 보낸다.
 cout << ThisIsNotString << "\n";
 cout << ThisIsString << "\n";

 return 0;
}
-----------------------------------------------------------------------
point

1. 문자열끝에 NULL 문자로 끝나지 않는경우
NULL문자열이 나올때까지 메모리의 값을
모두 출력하게 됨으로 문자열이라면 당연히
NULL 문자로 끝난다고 생각하는 것이좋다.

문자열 리터럴의 사용
-----------------------------------------------------------------------
#include <iostream>
using namespace std;

int main()
{
 // 문자열 상수를 사용해서 배열을 초기화한다.
 char cArray1[] = "ABCDE";
 char cArray2[] = { 'A', 'B', 'C', 'D', 'E', 0 };

 // 두 배열의 크기를 비교해본다.
 cout << "sizeof(cArray1) = " << sizeof(cArray1) << "(Bytes)\n";
 cout << "sizeof(cArray2) = " << sizeof(cArray2) << "(Bytes)\n";

 // 두 배열의 4, 5번째 원소를 출력해본다.
 cout << cArray1[4] << (int)cArray1[5] << "\n";
 cout << cArray2[4] << (int)cArray2[5] << "\n";

 return 0;
}
-----------------------------------------------------------------------
point

1. NULL값으로 \0와 0를써도 똑같이 NULL값으로 작동한다.
다만 \0을 사용하는 것이 일반적이다.

2. 문자열을 따옴표 대신 쌍따옴 표를 이용하여 만들수도 있다.
또한 쌍따옴표를 이용할경우 마지막에 자동으로 NULL값이 삽입되어
따로 NULL값을 적어주지 않아도 된다.