C/ C++ 핵심 정리
메모리 크기
1
2
3
4
5
6
7
| int = 4
char = 1
short = 2
long = 4
float = 4
double = 8
long double = 12
|
자료형(Data Type)
기본 자료형
C와 C++ 비슷하다고 보면 됨
1
2
3
4
| int a = 10; // 정수형
char ch = 'A'; // 문자형
double pi = 3.14; // 실수형
bool flag = true; // 불리언형
|
상수와 변수
변수 선언
‘int’ ‘char’ ‘float’ 등의 자료형을 사용해 선언 가능함
1
2
3
4
| int a = 10;
char ch = 'A';
double pi = 3.14; // 소수점 이하 15자리
float Pi = 3.14; // 소수점 이하 6자리
|
걍 double형 쓸란다..
상수 선언
1
2
| const double PI = 3.14159; // 런타임 또는 컴파일 타임 상수
constexpr int MAX = 100; // 반드시 컴파일 타임 상수
|
1
2
| #define PI 3.14159 // 전처리기 매크로 (단순 치환, 타입 없음)
cconst in MAX = 100; // 상수 변수 (타입 있음, 변경 불가)
|
함수
특정 작업을 수행하는 코드 블록 이라 생각하면 됨.
C++ (함수 오버로딩 지원)
1
2
3
4
5
6
7
8
9
| int add(int a, int b){
return a + b;
}
double add(double a, double b){
return a + b;
}
// 함수 호출
add(3,5); // 정수(int) → 첫 번째 `add` 실행
add(2.5,3.1); // 실수(double) → 두 번째 `add` 실행
|
C++는 매개변수 타입이 다르면 같은 이름의 함수 여러 개를 만들 수 있음 → 함수 오버로딩 (Overloading)
표준 출력 함수
C
1
2
3
4
5
6
| #include <stdio.h> // C 입출력 라이브러리(stdio.h)
int main(){
printf("Hello,World!\n");
return 0;
}
// 출려값 : Hello,World!
|
C++
1
2
3
4
5
6
7
| #include <iostream> // C++ 입출력 라이브러리(iostream)
using namespace std; // std::cout, std::endl을 cout, endl로 간단히 사용하기 위해 선언.
int maini(){
cout<<"Hello,World!"<<end; // cout을 이용해 출력 (endl은 줄바꿈)
return 0;
}
// 출력값 : Hello,World!
|
C++에서는 cout을 사용하면 형식 지정자가 필요 없고, 객체 지향적인 방식으로 더 직관적인 코드 작성이 가능!
연산자
C/C++
1
2
3
4
5
| int sum = 10 + 5; // 덧셈
int diff = 10 - 5; // 뺄셈
int prod = 10 * 5; // 곱셈
int quot = 10 / 5; // 나눗셈
int mod = 10 % 3 : // 나눗셈 나머지!!
|
조건문
if 조건문
1
2
3
4
5
6
7
8
| int num = 10; // 변수 10 정의
if ( num > 0 ) { // 조건1. 변수가 0보다 클 시
printf("양수입니다.\n"); // 조건1.의 출력값
} else if (num < 0 ) { // 조건2. 변수가 0보다 작을 시
printf("음수입니다.\n"); // 조건2.의 출력
} else { // 그 외의 조건에 관한 출력
printf("0입니다.\n");
}
|
swtch문
1
2
3
4
5
6
7
8
9
10
11
12
| char grade = 'B'; // 문자형 변수 선언
switch (grade) { // 스위치 조건 시작
case'A': // 케이스A 경우
printf("매우 우수\n"); // 케이스A의 출력값
break; // 이후 필수적으로 break; 해줘야함
case'B':
printf("우수\n");
break;
case'C':
printf("기타\n");
break;
}
|
반복문
for 문
:for문 안에서 변수 선언하고 범위 지정하고
1
2
3
| for (int i = 0; i < 5; i++){ // for반복문 변수 선언 및 초기값0 ,반복 범위,증가범위
printf("%d\n",i)
} // 출력 값: 0\n 1\n 2\n 3\n 4\n 5
|
while 문
밖에서 선언되어 있는 변수
1
2
3
4
5
| int j = 0; // 변수가 먼저 선언 되어 있음
while (j < 5){ // 범위 지정
printf("%d\n",k); // 출력
j++; // 이후 증가하며 다시 시작할 수 있게
}
|
시프트 연산자와 비트 연산자
시프트 연산자
:비트 단위로 왼쪽(<<) 또는 오른쪽(>>)으로 이동시키는 연산자임.
1
2
3
4
| int a = 8; // 00001000 2진수로 했을 때의 '8'임
int leftShift = a << 1; // 00010000 이렇게 이동이 된다는 뜻
int rightShift = a >> 1: // 00000100 ㅇㅋ???
printf("%d,%d",leftShift,rightShift); // 출력 값 : 16, 4 일케 됨
|
비트 연산자
:비트 연산자는 정수를 이진수 형태로 변환하여 논리 연산을 수행.
& (비트 AND): 두 비트가 모두 1이면 1| (비트 OR): 하나라도 1이면 1^ (비트 XOR): 다르면 1, 같으면 0~ (비트 NOT): 비트를 반전1
2
3
4
5
6
| int a = 5; // 0101 2진수 5
int b = 3; // 0011 2진수 3
int andOp = a & b; // 0001 and 계산법으로 (1)
int orOp = a | b; // 0111 or 계산으로 (7)
int xorOp = a ^ b; // 0110 xor 계산 (6)
int notOp = ~a; // 1010 비트 반전임 (10)
|
지역 변수와 전역 변수
지역 변수
:지역 변수는 특정 블록({}) 안에서 선언되며, 블록이 종료되면 메모리에서 사라짐.
1
2
3
4
| void func(){
int localVar = 10; // 지역 변수 예임. 함수 안에서만 쓰이는
printf("%d\n",localVar);
}
|
전역 변수
:전역 변수는 프로그램의 모든 영역에서 접근할 수 있는 변수로, 프로그램이 종료될 때까지 메모리에 유지됨.
1
2
3
4
| int globalVar = 20; // 전역 변수임. 함수 밖에서 이미 선언 되어 있어 모든곳에서 호출 가능
void func(){
printf("%d\n",globalVar); // 이런식으로 함수 내에서도 부를수가 있다
}
|
내가 아는 대부분의 언어들은 지역 변수 전역 변수 특징을 갖고 있는것 같음!!
배열과 문자열
배열
:배열은 같은 자료형의 여러 개의 데이터를 하나의 변수로 저장하는 자료구조.
1
2
| int arr[5] = {1,2,3,4,5}; // 5개의 인덱스를 가진 배열을 선언
printf("%d",arr[2]); // 출력 값: 인덱스[2]의 = 3출력
|
문자열
:문자열은 문자 배열이며, \0(널 문자)로 끝남.
1
2
| char str[] = "Hellow";
printf("%s",str); //출력 값: Hello
|
포인터
:포인터는 변수의 메모리 주소를 저장하는 변수임.
1
2
3
| int num = 10; // 정수형 변수 num 선언 후 그 값을 10으로 초기화
int *prt = # // int*는 정수형 변수의 주소를 저장 할 수 있는 포인터
printf("%d",*prt); // &num은 num의 메모리 주소를 뜻. 출력 값: 10
|
(예시)
1
2
3
4
5
6
7
8
9
10
11
12
| #include <stdio.h>
int main(){
int a = 100; // 변수 a 를 선언함 값은 100
int b = 200; // 변수 b 를 선언함 값은 200
int *ptr; // 포인터 선엄함
ptr = &a; // 포인터로 a를 가르킴
printf("ptr이 a를 가르킬 때: %d",*ptr); // 100출력
ptr = &b; // 포인터로 b를 가르키도록 변경
printf("ptr이 b를 가르킬 때: %d",*ptr); // 200출력
}
|
표준 입력 함수
:사용자로 부터 데이터 입력을 받을 때 사용 하는 것임. Python 에서는 input()
1
2
3
4
| char name[20]; // 20개의 문자를 저장 할 수 있는 문자 배열 선언
printf("이름을 입력 하시오:"); // 단, 마지막 1자는 null 문자를 위해 빼야해서 19개 까지만 가능
sacnf("%s",name); // 사용자가 입력하는 값이 name 배열에 저장됨
printf("입력한 이름: %s",name);
|
배열과 포인터
1
2
3
4
5
6
7
| int arr[3] = {10,20,30}; // 3크기의 정수형 배열 선언 안에 값은 10,20,30 있음
int *ptr = arr; // 포인터 선언하고 arr배열을 가르킴 시작지점. 즉 배열의 첫번째 요소 인덱스[0]을 가르킴
printf("%d",*(ptr+1)); // 인덱스[0 +1] 이 소리임 결국엔 인덱스[1]을 묻기에 출력 값: 20
```(예시)```
int numbers[4] = {5,15,25,35};
int *ptr = numbers;
printf("%d",*(ptr+2)); // 출력 값: 25
|
메모리 할당
동적 메모리 할당
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
| int *ptr = (int*)malloc(sizeof(int)*10); // 동적 메모리 할당을 위한 표준 라이브러리 함수 = malloc
// sizeof(int) 정수형 변수 크기를 바이트 단위로 반환
// siezof(int)*10 10개의 정수를 저장할 수 있는 메모리 크기 나타냄
// int(*) 반환된 주소를 정수형 포인터로 형변환 하는것
free(ptr); // free 는 malloc으로 할당된 메모리 해제하는 함수임.
```(예시)```
#include <stdio.h>
#include <stdliib.h> // malloc과 free 사용 하기 위함
int main(){
int*ptr = (int*)malloc(sizeof(int)*5);
// 5개의 정수를 저장할 동적 메모리 할당
if (ptr == NULL) {
// 메모리 할당 실패 확인함
printf("메모리 할당 실패!\n");
return 1;
}
for (int i = 0; i < 5; i ++){
// 할당된 메모리에 값 저장함
ptr[i] = (i + 1) * 10; // 10,20,30,40,50
}
printf("동적 배열의 값: ");
// 저장된 값 출력
for ( int i = 0; i < 5; i++){
printf("%d",ptr[1]);
}
printf("\n");
free(ptr);
// 메모리 해제
ptr = NULL; // g해제 후 포인터 NULL로 설정함
return 0;
}
|
다차원 포인터
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| int **ptr; // 이중 포인터
int a = 10; // 정수형 변수 a
int*p = &a; // 단일 포인터로 a주소 의미
ptr = &p; // 이중 포인터로 p 주소를 의미하고 있음 하지만 p는 a를 가리키고 있음
printf("%d",**ptr); // 10 출력
```(예시)```
#include <stdio.h>
int main() {
int **ptr;
int a = 10;
int *p = &a;
ptr = &p;
printf("a의 값: %d\n", a); // 10
printf("p의 값: %p\n", p); // a의 주소 (0x1000)
printf("*p: %d\n", *p); // 10
printf("ptr의 값: %p\n", ptr); // p의 주소 (0x2000)
printf("*ptr: %p\n", *ptr); // a의 주소 (0x1000)
printf("**ptr: %d\n", **ptr); // 10
return 0;
}
|
구조체와 연결 리스트
구조체
:여러 개의 변수를 하나의 데이터 구조로 묶음
예를 들어, 사람의 이름,나이 를 하나의 데이터로 관리하고 싶다.. 그러면 구조체 ㄱㄱ
결론은 객체 지향 프로그래밍에서 클래스와 비슷한 개념이라 생각하면 됨..
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| typedef struct { // struct 구조체 정의할 때 사용, typedef 는 구조체에 별칭 붙여주는 역
char name[20]; // { } 안에 구조체가 포함할 변수 정의함 char name, int age
int age; // 이름과 나이가 정의됨
}Person;
```(예시)```
#include <stdio.h>
#include <string.h>
typedef struct{
char name[20];
int age;
} Person;
int main () {
Person p1; // 구조체 변수 선언
strcpy(p1.name, "홍길동"); // 구조체 멤버에 값을 할당함. 문자열은 strcpy로 복사함
p1.age = 25;
// 구조체 멤버 출력함
printf("이름: %s, 나이: %d\n", p1.name,p1.age);
}
|
연결 리스트
:동적으로 할당된 노드들이 연결된 자료 구조임
1
2
3
4
5
6
7
8
9
| typedef struct Node{
int data; // 노드가 저장하는 데이터(정수형)
struct Node*next; // 다음 노드를 가리키는 포인터
}Node;
}
// int data: 노드가 저장하는 실제 값
// struct Node *next: 다음 노드의 주소를 저장하는 포인터
// struct Node 타입을 가리킴.
// typedef: 구조체에 Node라는 별칭 붙여 사용하게 편기하게 만듬
|
파일 입출력
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| FILE *file - fopen("test.txt","w"); // FILE C 표준 라이브러리에서 파일 입출력 다루기위한 데이터 타입임. fopen 함수로 파일 열거나 생성
fprintf(file,"Hello,World!\n"); // test.txt 파일을 쓰기모드(w)로 연단 소리임
fclose(file); // fprintf 파일에 포맷된 문자열 쓰는 함수임
``` // 이후 fclose(file) 파일 닫음
:test.txt 라는 파일이 생성되며,(이미 있으면 덮어 씀) 안에 Hello, World!가 기록됨
---
## 함수 포인터
```cpp
// add라는 함수 정의함. 반환 타입은 int
int add(int a, int b) {return a + b;}
// funcPtr 함수 포인터 선언. 2개의 int 매개변수 받고 int를 반환하는 함수 가르키는 포인터 의미
int (*funcPtr)(int, int) = add;
// funcPtr은 add 함수를 가르키는 포인터, add(2,3) 호출과 동일
printf("%d",funcPtr(2,3)); // 출력 값: 5
|
함수 포인터는 함수의 주소를 저장하고, 이를 동적으로 호출할 수 있게 해줌