Post

[C,C++] 한 페이지에 싹 정리

[C,C++] 한 페이지에 싹 정리

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 = &num;       // 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

함수 포인터는 함수의 주소를 저장하고, 이를 동적으로 호출할 수 있게 해줌

This post is licensed under CC BY 4.0 by the author.