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 |