[C++] 배열 기초
배열 기초
인프런 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 |
댓글
이 글 공유하기
다른 글
-
[C++] 배열과 Swap함수를 활용한 연습: 로또 번호 생성기
[C++] 배열과 Swap함수를 활용한 연습: 로또 번호 생성기
2022.03.27 -
[C++] 포인터 vs 배열
[C++] 포인터 vs 배열
2022.03.26 -
[C++] 포인터 vs 참조, const
[C++] 포인터 vs 참조, const
2022.03.26 -
[C++] 참조 기초
[C++] 참조 기초
2022.03.26