배열 기초

 

인프런 Rookiss님의 'Part1: C++ 프로그래밍 입문' 강의를 기반으로 정리한 필기입니다. 
😎[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문 강의 들으러 가기!

 

 


 

 

배열의 크기는 상수

 

TYPE 이름[개수]

struct StatInfo
{
    int hp = 0xAAAAAAAA;
    int attack = 0xBBBBBBBB;
    int defence = 0xCCCCCCCC;
};

 

배열의 크기는 상수여야 함 (Visual Studio 컴파일러 기준)

그래서 아래와 같이 const 를 붙여준다.

    const int monsterCount = 10;
    StatInfo monsters[monsterCount];

 


 

배열 이름의 작동 방식

 

그런데 배열은 [이름] 조금 다르게 동작한다

	StatInfo players[10];
	players = monsters; //X. 다음과 같이 사용할 수 없다.

 

 

그럼 배열의 이름은 뭐지?

 

배열의 이름은 곧 배열의 시작 주소. 정확히는 시작 위치를 가리키는 TYPE* 포인터

	auto WhoAmI = monsters;

auto WhoAmI는 지역변수로 할당

위와 같이 auto를 사용해서 변수를 선언 할 수 있다.  


 

 

포인터와 참조를 활용한 배열 사용

 

주소[ (100,10,1) ]   StatInfo[ ] StatInfo[ ] StatInfo[ ] StatInfo[ ] ...
monster_0[ 주소 ]

 

포인터

-   StatInfo* monster_0은   monsters의 시작 주소(=시작 위치를 가리키는 StatInfo* 포인터). 

-   ->로 값을 변경하면 배열의 첫번째 원소의 hp, attack, defence 값이 변경된다. 

    StatInfo* monster_0 = monsters;
    monster_0->hp = 100;
    monster_0->attack = 10;
    monster_0->defence = 1;

 

 

포인터의 덧셈 

-   진짜 1을 더하라는게 아니라, StatInfo 타입 바구니 한개씩 이동하라는 의미
-   StatInfo[ ] 주소[ (200,20,2) ]   StatInfo[ ] StatInfo[ ] StatInfo[ ] ...
-   monster_1[ 주소 ]

    StatInfo* monster_1 = monsters + 1;
    monster_1->hp = 200;
    monster_1->attack = 20;
    monster_1->defence = 2;

 

   

포인터와 참조는 자유자재로 변환 가능하다

-   StatInfo[ ] StatInfo[ ]      monster_2,주소[  ]  StatInfo[ ] StatInfo[ ] ...

-   monster_2[ 주소 ]

    StatInfo& monster_2 = *(monsters + 2);
    monster_2.hp = 300;
    monster_2.attack = 30;
    monster_2.defence = 3;

 

 

[주의] 이거는 완전 다른 의미

-   위와 달리 StatInfo 뒤에 &가 없다.

-   StatInfo[ ] StatInfo[ ]   주소[ 내용물 ]  StatInfo[ ] StatInfo[ ] ...

-   temp [ 내용물 ]

    StatInfo temp = *(monsters + 2);
    temp.hp = 400;
    temp.attack = 40;
    temp.defence = 4;

 

 

 

이를 조금 더 자동화한다! 

    for (int i = 0; i < 10; i++)
    {
        StatInfo& monster = *(monsters + i);
        monster.hp = 100 * (i + 1);
        monster.attack = 10 * (i + 1);
        monster.defence = (i + 1);
    }

 


 

 

일반적인 배열 사용방법 - 인덱스 사용

 

 *(monsters + i) 너무 불편하고 가독성이 떨어진다... 더 편한 방법?


배열은 0번부터 시작. N번째 인덱스에 해당하는 데이터에 접근하려면 배열이름[N]

 

 *(monsters + i) = monsters[i]

    monsters[0].hp = 100;
    monsters[0].attack = 10;
    monsters[0].defence = 1;

    for (int i = 0; i < 10; i++)
    {
        monsters[i].hp = 100 * (i + 1);
        monsters[i].attack = 10 * (i + 1);
        monsters[i].defence = (i + 1);
    }

 


 

배열 초기화 방법 

 

	 int numbers[5] = {};  // 기본값인 0으로 초기화 된다. 하나 하나씩 0으로 밀어버린다.
    int numbers1[10] = { 1,2,3,4,5 }; // 설정한 애들은 설정한 값들로, 나머지 값들은 0으로 초기화
    int numbers2[] = { 1,2,3,4,11,24,124,14,1 }; // 데이터 개수만큼의 크기에 해당하는 배열로 만들어준다

    char helloStr[] = { 'H', 'e', 'l', 'l', 'o','\0'};
    cout << helloStr << endl;

    // 배열 요약:
    // 1) 선언한다
    int arr[10] = { };

    // 2) 인덱스로 접근해서 사용
    arr[1] = 1;
    cout << arr[1] << endl;


 

 

전체 코드

 

더보기
#include <iostream>
using namespace std;

// 배열

struct StatInfo
{
    int hp = 0xAAAAAAAA;
    int attack = 0xBBBBBBBB;
    int defence = 0xCCCCCCCC;
};


int main()
{
    // TYPE 이름[개수]
    
    // 배열의 크기는 상수여야 함 (Visual Studio 컴파일러 기준)
    const int monsterCount = 10;
    StatInfo monsters[monsterCount];

    // 여태껏 변수들의 [이름]은 바구니의 이름이었음
    int a = 10;
    int b = a;

    // 그런데 배열은 [이름] 조금 다르게 동작한다
    // StatInfo players[10];
    // players = monsters;

    // 그럼 배열의 이름은 뭐지?
    // 배열의 이름은 곧 배열의 시작 주소
    // 정확히는 시작 위치를 가리키는 TYPE* 포인터
    auto WhoAmI = monsters;

    // 주소[ (100,10,1) ] StatInfo[ ] StatInfo[ ] StatInfo[ ] StatInfo[ ] ...
    // monster_0[ 주소 ]
    StatInfo* monster_0 = monsters;
    monster_0->hp = 100;
    monster_0->attack = 10;
    monster_0->defence = 1;

    // 포인터의 덧셈! 진짜 1을 더하라는게 아니라, StatInfo 타입 바구니 한개씩 이동하라는 의미
    // StatInfo[ ] 주소[ (200,20,2) ] StatInfo[ ] StatInfo[ ] StatInfo[ ] ...
    // monster_1[ 주소 ]
    StatInfo* monster_1 = monsters + 1;
    monster_1->hp = 200;
    monster_1->attack = 20;
    monster_1->defence = 2;
    
    // 포인터와 참조는 자유자재로 변환 가능하다
    // StatInfo[ ] StatInfo[ ]  monster_2,주소[  ]  StatInfo[ ] StatInfo[ ] ...
    // monster_2[ 주소 ]
    StatInfo& monster_2 = *(monsters + 2);
    monster_2.hp = 300;
    monster_2.attack = 30;
    monster_2.defence = 3;
    
    // [주의] 이거는 완전 다른 의마다
    // StatInfo[ ] StatInfo[ ] 주소[ 내용물 ] StatInfo[ ] StatInfo[ ] ...
    // temp [ 내용물 ]
    StatInfo temp = *(monsters + 2);
    temp.hp = 400;
    temp.attack = 40;
    temp.defence = 4;

    // 이를 조금 더 자동화한다!    
    for (int i = 0; i < 10; i++)
    {
        StatInfo& monster = *(monsters + i);
        monster.hp = 100 * (i + 1);
        monster.attack = 10 * (i + 1);
        monster.defence = (i + 1);
    }

    // 근데 *(monsters + i) 너무 불편하고 가독성이 떨어진다... 더 편한 방법?
    // 인덱스!
    // 배열은 0번부터 시작. N번째 인덱스에 해당하는 데이터에 접근하려면 배열이름[N]
    // *(monsters + i) = monsters[i]

    monsters[0].hp = 100;
    monsters[0].attack = 10;
    monsters[0].defence = 1;

    for (int i = 0; i < 10; i++)
    {
        monsters[i].hp = 100 * (i + 1);
        monsters[i].attack = 10 * (i + 1);
        monsters[i].defence = (i + 1);
    }

    // 배열 초기화 문법 몇가지
    int numbers[5] = {};  // 기본값인 0으로 초기화 된다. 하나 하나씩 0으로 밀어버린다.
    int numbers1[10] = { 1,2,3,4,5 }; // 설정한 애들은 설정한 값들로, 나머지 값들은 0으로 초기화
    int numbers2[] = { 1,2,3,4,11,24,124,14,1 }; // 데이터 개수만큼의 크기에 해당하는 배열로 만들어준다

    char helloStr[] = { 'H', 'e', 'l', 'l', 'o','\0'};
    cout << helloStr << endl;

    // 배열 요약:
    // 1) 선언한다
    int arr[10] = { };

    // 2) 인덱스로 접근해서 사용
    arr[1] = 1;
    cout << arr[1] << endl;

    return 0;
}

 

 

 

'⭐ Programming > C++' 카테고리의 다른 글

[C++] 배열과 Swap함수를 활용한 연습: 로또 번호 생성기  (0) 2022.03.27
[C++] 포인터 vs 배열  (0) 2022.03.26
[C++] 포인터 vs 참조, const  (0) 2022.03.26
[C++] 참조 기초  (0) 2022.03.26
[C++] 포인터 실습  (0) 2022.03.26