C++ Array

m._.jooong·2023년 4월 18일
0

C++

목록 보기
14/23

#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;

}

0개의 댓글