#include <iostream>
// 문자열 관련 라이브러리
#include <string>
// 배열의 사이즈를 가져오기 위한
#include <array>
// C++ 표준 라이브러리
using namespace std;
// Rectangle 이름의 구조체를 정의
struct Rectangle
{
int width;
int height;
};
// Fruit라는 이름의 구조체 정의
struct Fruit
{
string name;
int count;
};
int main()
{
// 배열(array)은 같은 자료형을 여러개 저장할 수 있는 타입이다
// 매우 비효율적이다
int score0;
int score1;
int score2;
// ~
int score499;
int score500;
// 배열을 사용하면 위의 작업을 쉽고, 효율적으로 실행할 수 있다.
// int타입의 여러 변수 저장 할 수 있는 score[]변수 선언
// 대괄호를 사용해 배열 변수에 할당할 배열 길이 설정
// 자료형 배열이름[배열길이];
int score[30];
// 배열에 있는 각 변수를 요소(element)라고 한다,
// 요소에는 고유한 이름이 없다.
// 대신 배열의 개별 요소에 접근하려면, 배열 이름을 하위 연산잔([])와 함께 사용하며
// 원하는 요소를 알려주는 인덱스(index)라는 매개 변수를 사용한다.
// 배열이름[인덱스]
// 프로그래밍 언어에서 숫자는 0부터 시작한다.
// score[0] : score배열의 0번째 인덱스, score배열의 첫 번째 요소이다.
// score[1] : score배열의 1번째 인덱스, score배열의 두 번째 요소이다.
// score[2] : score배열의 2번째 인덱스, score배열의 세 번째 요소이다.
// score[9] : score배열의 9번째 인덱스, score배열의 열 번째 요소이다.
// score[29] : score배열의 29번째 인덱스, score배열의 마지막 요소이다.
// 배열의 인덱스는 0부터 시작한다.
// string 타입을 여러개 저장할 names 배열 변수 선언
// 사이즈를 5로 해서 초기화
string names[5];
names[0] = "John";
names[1] = "Hane";
names[2] = "Tom";
names[3] = "Smith";
names[4] = "James";
cout << "for 문" << endl;
for (int i = 0; i < size(names); i++)
{
cout << names[i] << " ";
}
cout << endl;
cout << endl;
cout << "foreach 문" << endl;
for (string name : names)
{
cout << name << " ";
}
cout << endl;
cout << endl;
// 모든 자료형을 배열로 만들 수 있다. 구조체를 배열로 만들어보기
// Rectangle 이름의 구조체를 정의
// 배열의 사이즈는 5인데 인덱스는 2까지만 값을 줌
Rectangle rectangles[5];
rectangles[0].width = 20;
rectangles[0].height = 10;
rectangles[1].width = 22;
rectangles[1].height = 30;
rectangles[2].width = 55;
rectangles[2].height = 60;
// 배열의 사이즈는 5개인데, 요소의 수를 넘겨보자
// 배열은 사이즈를 다시 정해주기 전까지는 사이즈를 줄이거나 늘릴 수 없다.
rectangles[10].width = 25;
rectangles[10].height = 100;
cout << "for 문" << " ";
for (int i = 0; i < size(rectangles); i++)
{
cout << "width : " << rectangles[i].width << ", height : " << rectangles[i].height << endl;
}
cout << endl;
cout << endl;
cout << "foreach 문" << " ";
for (Rectangle rectangle : rectangles)
{
cout << "width : " << rectangle.width << ", height : " << rectangle.height << endl;
}
cout << endl;
cout << endl;
// 고정 배열을 선언할 때 배열의 길이는 컴파일 타임 상수이어야 한다.
// 컴파일 타임에 고정 배열의 길이를 알아야 하기 때문이다
// 상수(constant)란
// 상수는 값이 변하지 않는 것을 의미한다,
// 상수에 넣는 데이터로는 숫자만 오는 것이 아니라 클래스나 구조체 같은 객체도 가능하다
// Fruit라는 이름의 구조체 정의
const Fruit fruit = {"Apple", 10};
//fruit.name = "Banana"; // x
//fruit.count = 30; // x
// 리터럴(Literal) 이란
// 리터럴은 값 그 자체를 의미한다. 즉 변수에 넣는 변하지 않는 데이터를 의미한다,
// intValue1 은 상수변수이고, 1 은 리터럴 값이다.
const int intValeu1 = 1;
// stringValue1은 상수변수이고 "Jane"은 리터럴 값이다.
const string stringValue1 = "Jane";
// 고정배열을 선언하는 방법 4가지
// 1. 리터럴 상수를 사용
int intArr1[5];
// 2. 메크로 기호 상수를 사용
#define ARRAY_LENGTH 5
int intArr2[ARRAY_LENGTH];
// 3. 상수 변수 사용
const int arrayLength = 5;
int intArr3[arrayLength];
// 4. 열거형 사용
enum EArrayLength {MaxArrayLength = 10};
int intArr4[EArrayLength::MaxArrayLength];
// 좋지 않은 예
// 비-상수 변수 사용
int arrayLength1 = 10;
//int intArr5[arrayLength1]; // x
// 런타임 상수 변수 사용
int arrayLength2 = 5;
// arrayLength3 값은 컴파일 타임에서는 알 수 없는 런타임 상수이다.
const int arrayLength3 = arrayLength2;
//int intArr5[arrayLength3]; // x
// 배열은 선언과 동시에 초기값을 줄 수 있다.
string friend1[5] = { "John", "Tom", "Jane", "Smith", "James" };
// 요소의 개수로 사이즈를 알 수 있기 때문에 사이즈를 명시하지 않아도 된다.
string friend2[] = { "John", "Tom", "Jane", "Smith", "James" };
for (auto name : friend1)
{
cout << name << " ";
}
cout << endl;
cout << endl;
// 배열의 초기화에 대한 정리
// 일반적인 배열 선언 방식
int intArr5[3];
intArr5[0] = 1;
intArr5[1] = 2;
intArr5[2] = 3;
for (int i : intArr5)
{
cout << i << " ";
}
cout << endl;
cout << endl;
// 배열을 선언하고 초기화
int intArr6[] = { 10, 20, 30, 40, };
for (int i : intArr6)
{
cout << i << " ";
}
cout << endl;
cout << endl;
// 배열을 선언하고 초기화 하지 않아도 된다, 나머지는 기본값으로 채워진다 // 기본값 : 0
int intArr7[10] = { 10, 20 };
for (int i : intArr7)
{
cout << i << " ";
}
cout << endl;
cout << endl;
// 대입 연산자가 없어도 된다.
int intArr8[3]{ 10, 20, 30 };
for (int i : intArr8)
{
cout << i << " ";
}
cout << endl;
cout << endl;
// 배열의 요소를 전부 0으로 설정
int intArr9[20] = {};
for (int i : intArr9)
{
cout << i << " ";
}
cout << endl;
cout << endl;
int intArr10[30]{};
for (int i : intArr10)
{
cout << i << " ";
}
cout << endl;
cout << endl;
// 요소의 갯수로 사이즈를 알 수 있기 때문에 사이즈를 명시하지 않아도 된다
int intArr11[] = { 1,2,3,4,5,6,7,8,9, };
for (int i : intArr11)
{
cout << i << " ";
}
cout << endl;
cout << endl;
// 대입연산자가 없어도 되며 사이즈를 명시하지 않아도 된다
int intArr12[]{ 1,2,3,4,5,6,7,8,9 };
for (int i : intArr12)
{
cout << i << " ";
}
cout << endl;
cout << endl;
// 지금까지는 C언어 스타일의 배열이다.
// 이제는 C++ 스타일의 배열
array<int, 5> intArr13 = { 1,2,3,4,5, };
for (int i : intArr13)
{
cout << i << " ";
}
cout << endl;
cout << endl;
}