본문 바로가기
C & C++/C++

[C++] 흐름 제어, 복합 데이터

by 거북이 코딩 2024. 6. 26.

Ch 05. 흐름 제어

if 문

if(조건문){
실행
}
else if{
}
else{
}

if 문 내에서 선언하기

if(int num1, num2; scanf("%d %d, &num1, &num2){
}

switch 문

switch(sw){
case 1:
	break;
case 2:
	break;
default:
}

if문보다 아주 약간 빠름

if문처럼 switch문 내에서 변수 선언이 가능함

break를 의도적으로 넣지 않을 경우

switch(sw){
case 1:
	[[fallthrough]]
	//폴스루를 넣어주면 좋다.
case 2:
	break;
default:
}

for문

for(초기화;조건;갱신){
}

//1. 초기화
//2. 조건이 true면 3번 false면 탈출
//3. 구문수행
//4. 갱신
//5. 2번으로 돌아감

break문을 사용할 때 안사용할 때 차이

int main() {
	int i;
	
	for (i = 0; i < 10; i++)
		cout << i << endl;
		
	cout << i<<endl; //10출력
	
	for (i = 0; i < 10; i++)
	{
		cout << i << endl;
		if (i == 9)
			break;
	}
	
	cout << i; //9출력
}

while문

while(조건){
실행 
}
//1. 조건
//2. 실행
//3. 1번으로 돌아감

do while 문

do{
}while(조건);
//1. 실행
//2. 조건
//3. 1번으로 돌아감

go to 문

라벨:
	...
	
	goto 라벨; //라벨로 이동함

사용을 안할 수 있다면 안 하는 게 좋음

Ch 06. 복합 데이터

배열(Array)

int array[100]; //100크기의 배열 인덱스 0 ~ 99
int array2[3] = {0, 1, 2}; //배열 초기화
int arrat3[10]{}; //0으로 초기화
int array4[10]{0,1,2} // 0, 1, 2, 0, ... 으로 초기화
int array5[] = {1,2,3} // 길이 3의 배열 생성

배열에 접근하기

array[3] : 3번째 인덱스에 접근

배열의 크기

sizeof(array) //(배열의 자료형크기 * 길이)를 반환
sizeof(array)/sizeof(int) //배열의 길이
std::size(array) //위의 값과 같은 값을 반환

배열 복사하기

memcpy(새 주소, 기존 주소, 데이터의 크기);
std::copy(기존주소, 기존주소 + 사이즈, 새 주소);

//기존 주소의 데이터를 새 주소로 옮긴다.

다차원 배열

int arr[3][3] = {
	{1, 2, 3},
	{4, 5, 6},
	{7, 8, 9}
};
//3 * 3의 배열 생성
for (int i = 0; i < 3; i++) {
	for (int j = 0; j < 3; j++) {
		cout << arr[i][j] << " ";
	}
	cout << endl;
}

다차원 배열의 메모리는 행별로 저장되기 때문에 활용할 때 이를 유의하면 성능을 좋게 할 수 있다.

cout << size(arr) << endl; //행의 수
cout << size(arr[0]) << endl; //열의 수

문자열

C style 문자열

#include <cstring>
char str[] = "abc";
//길이가 4인 배열이 생성되고 마지막 인덱스에 널문자 \\0이 들어간다.

strlen(str); // str의 길이 반환 (널문자 제외)
size(str); //배열의 크기 반환

strcmp(str1, str2); 
// 같으면 0, 왼쪽이 사전순으로 앞이면 -1, 
//오른쪽이 사전순으로 앞이면 1 반환

strcpy(str1, str2);
//str1로 str2의 내용 복사

strcat(str1, str2);
//str1 뒤에 str2를 붙임

atoi("1"); //아스키 to 인티저 문자열을 int로 반환
atof("1.0"); //문자열을 실수로 반환

sprintf(문자열, "서식문자", 인자); //printf의 출력을 문자열에 저장 

cin.getline(str, 10); //str에 최대 10글자 까지 공백 포함해서 입력받음

String

#include <iostream>
#include <string>

using namespace std;

int main(){
	string str = "abcd";
	cout << str;
	return 0;
}

string 헤더를 include해서 사용한다. 인덱스 접근도 가능하다.

str[0]='h'
str[1]='e'
...

C++ 스타일 초기화

string str1("hello"), str2("world");

비교

if(str1==str2)
{
	cout<<"True";
} //내용이 같다면 True 출력

연결

string str3 = str1 + str2; //str1과 str2를 붙인 str3 생성
str3 += str1; //str3 뒤에 str1 붙이기

C스타일 문자열 함수 사용하기

strlen(str1.c_str());
//string str1 으로 c style 함수 사용하기

길이

str1.size();
str1.length();

숫자 → 문자 변환하기

string str1 = to_string(123.456);
//123.456을 string으로 변환

String → 숫자 변환하기

int num = stoi("1");
float num2 = stof("1.1");

std::getline(cin, str)

string str;
std::getline(cin, str);

cout << str << endl;

구조체(struct)

여러 타입의 데이터를 하나로 묶는데 사용한다.

struct Person{
	float height;
	float weight;
	char name[10];
};
Person person = { 170.1f, 66.6f, "David" };

Person person{ 170.1f, 66.6f, "David" }; //C++ style

Person person = { .height = 170.1f, .weight = 66.6f, .name = "David" };
//C++2x 버전의 초기화

struct를 겹쳐서 선언하기

struct eyeSight{
	float left;
	float right;
};
struct Person{
	float height;
	float weight;
	char name[10];
	eyeSight eyesight;
};
Person person = { 170.1f, 66.6f, "David", { 1.0, 1.1 ) };

구조체 복사

Person person2 = { 170.1f, 66.6f, "David", { 1.0, 1.1 ) };
Person person1 = person2;
//person1 과 2는 다른객체이다.

메모리 align

//구조체의 데이터를 저장할 때 가장 큰 자료형의 크기를 단위로 맞춘다.

struct Person{
	float height;
	float weight;
	char name[10];	
	short grade;
};
// 4바이트 4바이트 10바이트 2바이트 = 20바이트를 나타낸다.
// 하지만 데이터의 순서를 바꾸면 달라진다.

struct Person{
	float height;
	short grade;
	float weight;
	char name[10];	
};
// 4바이트 2바이트 (2바이트 버려짐) 4바이트 10바이트 (2바이트 버려짐)
// 총 24바이트를 사용하게 된다.

struct alignas(16) Person{
	float height;
	float weight;
	char name[10];	
	short grade;
};
//alinas 를 사용하면 메모리 할당 단위를 설정할 수 있다.
//alinof(구조체) 를 사용하면 현재 할당 단위를 리턴한다.

공용체(union)

//타입이 다른 여러데이터중 한개만 사용할때
union ID
{
	int integer;
	char chars[10];
};
struct Product
{
	int idType;
	ID id;
};
//메모리를 공유하여 효율적으로 사용한다.

열거형(enum)

// 0: Red, 1: Green, 2: Blue 를 표현하고 싶을 때
enum Color
{
	Red, Green, Blue
};
int colors[3];
colors[Red] = 255;
//열거형의 원소들은 상수이다.
//0부터 1씩 증가하며 할당된다.

범위가 있는 열거형(scoped enum)

enum struct attr{ Red, Blue, Green };
enum class attr{ Red, Blue, Green };
//그냥 열거형과 다르게 범위지정을 꼭 해야한다.
//ex) sttr::Red
//타입 캐스팅을 해주어야 int처럼 쓸 수 있음
(int)sttr::Red + 1;

정수형 타입 지정하기

enum class attr : int64_t { };
enum class attr : short { };

열거형 변수 선언하기

attr atr = attr::Red;
attr atr = (attr)1;  //Blue를 의미한다.

std-array

#include <array>
array<int 100> arr; //쓰레기값
array<int 100> arr{}; //0으로 초기화
array<int 100> arr{ 1, 2, 3 }; //1, 2, 3, 0, 0, ... 

인덱스 접근과 .at() 접근

cout<<arr[-1]; //쓰레기값 출력
cout<<arr.at(-1); //오류 발생 : 부적절한 인덱스접근을 더 명확히 함

사이즈

arr.size(); : size 반환

front, back

arr.front(); //0번 인덱스 반환
arr.back(); //size - 1 인덱스 반환

swap

array<int, 5> arr = { 1, 2, 3, 4, 5 };
array<int, 5> arr2 = { 5, 4, 3, 2, 1 };
arr.swap(arr2);
//arr 과 arr2의 내용을 바꿈

할당 & 비교

arr = arr2;
//arr 에 arr2 내용을 넣음
(arr==arr2)
//arr과 arr2의 내용이 같으면 true

정적 배열 접근

arr.data()[0] //0번 인덱스에 접근

캐릭터 배열

array<char, 6> chararr{ "abcde" };
cout << "chararr: " << chararr.data() << endl;
//.data()를 이용하여 문자열 출력

Range based for

int arr[5] = {1,2,3,4,5};
for(int num : arr)
{
	cout<<num<<endl;
} //num이 배열의 순회할 때 현재 요소를 의미한다.

pass by reference

struct Person {
	float height;
	float weight;
};

Person persons[] = {
	{ 1.7f, 60.0f },
	{ 1.6f, 55.0f }
};

for (Person& p : persons) //값을 변경할 때는 reference로 pass해야 한다.
	p.weight = 0.0f;
	
for (Person p : persons) {
	cout << "Height: " << p.height << " Weight: " << p.weight << endl;
}

 

 

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

[C++] 연산자 오버로딩  (4) 2024.07.16
[C++] 클래스  (0) 2024.07.13
[C++] 함수, 범위, 공간  (0) 2024.07.08
[C++] 포인터, 참조  (1) 2024.07.01
[C++] 데이터, 입출력, 연산자  (0) 2024.06.25