Super Kawaii Cute Cat Kaoani [C++] cpp의 기본 내용 정리

[C++] cpp의 기본 내용 정리

2024. 1. 22. 01:23
728x90
SMALL

📌 C++ 특징

  • C++ = C + class
    • class를 갖는 c언어
  • c언어의 문법을 모두 포함, 개선
  • C 문법은 포함하고 있지만 프로그래밍 스타일은 완전 다름
  • 객체지향 프로그래밍이 가능하도록 Class 위주로 다양한 문법 추가

 

📌 C 프로그램의 구성요소

⚡ 1. 토큰

: C프로그램을 구성하는 기본 단위

  • 예약어(reserved word, keyword) : int, if
    • 컴파일러에 의해 미리 의미가 정해져있는 32 ~ 44개의 단어
  • 연산자(operator) : +, /
    • 우선순위와 결합성
  • 구두점(punctuator) : [], ()
    • 토큰을 구분하기 위해 사용하는 기호
    • 소스 어느 부분에서 사용하는 지에 따라 연산자인지 구두점인지 구별
  • 식별자(identifier) : 변수, 함수, 배열, 구조체 등의 이름
  • 상수(constant) 또는 literal : 정수형, 부동소수점형, 문자형, 문자열
  • 문자열(string) : "hello"

 

⚡ 2. 제어문

1) 조건문

  • if
  • if ~ else
  • switch ~ case

2) 반복문

  • for
  • while
  • do ~ while

3) 분기문

  • goto
  • continue
  • break

 

for 문

 

✔ 기본적인 for 문

 

for(초기식; 조건식; 증감식){}

 

 

✔ 범위 기반 for문

  •  c++11부터 도입
for(자료형 변수 : 컨테이너){

}

 

 

for(auto&&)

std::vector<int> numbers = {1, 2, 3, 4, 5};
for (auto&& number : numbers) {
  // number는 벡터 numbers의 각 원소에 대한 참조
  // 반복 실행할 코드
  std::cout << number << ' ';
}

 

 

✔ for_each 함수

  •  < algorithm > 헤더에 포함된 함수
std::for_each(first, last, 함수 or 함수 객체);

 

 

✔  for문과 이터레이터

  • c++에서는 이터레이터를 사용하여 컨테이너의 원소에 접근하는 방식을 제공
for(이터레이터 it = 컨테이너.begin(); it!=컨테이너.end(); ++it){}

 

 

  무한 for문

  • break 사용해서 종료
for(;;){

}
반응형

 

📌 C와 C++의 차이

C의 기본 구조 예시

#include<stdio.h>
int main(){
    printf("소프트웨어\n");
    return 0;
} //확장자 : .c .cpp

 

C++의 기본 구조 예시

ex 1)

#include<iostream>
int main(){
    std::cout<<"소프트웨어"<<std::endl;
    return 0;
}//std동네에 있는 cout, 확장자 : .cpp

 

ex 2) 위에 내용과 같은 코드지만 다르게 표현한 것

#include<iostream>
using namespace std;
//네임스페이스로 std 사용, 잘 쓰진 않음
int main(){
    cout<<"소프트웨어"<<endl;
    return 0;
}

 

ex 3) 더 좋은 방법

#include<iostream>
using std::cout;
using std::endl;
//이제부터 cout은 std::cout을 참조하겠다는 뜻
int main(){
    cout<<"소프트웨어"<<endl;
    return 0;
}

 

 

📌 C++의 입출력 스트림 객체

  • iostream 파일을 프로그램에 포함하면 자동으로 열리는 자동 스트림(stream) 객체
#include <iostream>

 

  • cout<< : 화면으로 출력하면 객체, printf()
  • cin>> : 키보드로부터 데이터를 입력받는 객체, scanf()

ex)

#include<iostream>
#include<stdio.h>
using namespace std;
int main(){
    int a, b, c;
    a = 100;
    b = 200;
    c = a + b;
    printf("%d, %d, %d\n", a,b, c); //C
    cout<<a<<','<<b<<','<<c;//cpp
    return 0;
}

 

 

⚡ 입력 스트림 객체 cin

  • 키보드로부터 데이터를 입력받는 객체
  • cin >> 변수명; 
int a;
cin>>a;//키보드 입력을 a에 저장
cout<<"a="<<a<<'\n'; //화면에 순서대로 출력

 

 

⚡ 변수를 상수화 : const

  • 자료형 앞에 const를 추가하면 초기값을 변경할 수 없음

 

⚡ 자료형과 기억 클래스

  • 변수 선언 시에 이용하는 예약어와 선언된 위치에 의해서 결정됨
  • 기억클래스
    • 변수의 값이 어떤 종류의 메모리에 저장 되는지를 지정
    • int형 변수는 4바이트인데 이 4바이트 공간이 주기억장치의 스택에 만들어지는지 CPU의 레지스터에 만들어지는지 등을 결정하는 것
|자료형|기억클래스|
|::|::|
|자료의 크기 결정|자료의 기억 위치(메모리의 종류) 스택, data 영역, CPU의 레지스터 등|
|int, char, float, double|auto, static, extern, register|
auto int x;
static double y;

 

 

기억클래스 : 자동(auto)

  • 가장 많이 사용하는 기억 클래스
  • int형 변수 a를 auto 변수로 선언
    • auto int a; //auto는 생략이 가능하여 이 선언문은 int a;와 같은 문장임
    • 지금까지는 그냥 "int a;" 형태로 자료형만 명시했는데 자료형인 int 앞에 기억 클래스를 나타내는 auto를 더 쓰면 됨
  • auto 변수의 특징
    • 함수 또는 블록 내부에서 선언
    • 해당 함수나 블록 내에서만 유효한 지역(local)변수
    • 기억 클래스가 명시되지 않고 선언된 변수는 모두 자동 변수
      • 즉, auto는 생략이 가능
      • 그래서 지금까지 기억 클래스를 쓰지 않고 사용한 모든 변수는 auto 변수
    • 스택(stack) 공간을 일시적으로 사용
    • 함수나 블록을 진입하면 기억 영역이 확보되고, 벗어나면 기억 영역은 바로 소거
    • 초기화는 실행시 이루어지며, 초기화하지 않으면 임의의 값(쓰레기 값, garbage value)을 가짐
//ex)
#include<stdio.h>
int main(void){
    auto int a = 1;//auto 생략가능
    {
        int a = 2; //auto가 생략되어있음
        {
            int a = 3; //auto가 생략되어있음
            printf("%d ", a);
        }
        printf("%d ",a);
    }
    printf("%d ",a);
    return 0;
}
  • cpp에서의 auto
    • auto는 기억 클래스 지정자가 아닌 동적으로 타이을 정할 수 있게 변경되어있음
    • STL 사용시 코드가 짧아지고 가독성이 좋아짐
std::vector<std::vector<int>>::iterator it = ptWord.begin();
auto it = ptWord.begin();

 

 

 

기억 클래스 : 정적(static) 변수

  • int형 변수 a를 정적(static)변수로 선언
    • static int a;
    • 자료형인 int앞에 기억 클래스를 나타내는 static을 더 쓰면 됨
  • static변수 특징
    • 프로그램이 종료될 때까지 값을 유지
    • 처음 실행시 한 번만 초기화되고 초기화 값이 없으면 0으로 초기화됨
    • 스택이 아닌 정적 데이터 영역을 사용
    • 지역 static변수는 해당 블록 내에서만 접근 가능
  • static 변수는 윈도우즈 프로그래밍할 때 많이 사용
  • 전역 변수는 기본적으로 static이므로 static 키워드 필요없음

 

 

📌 구조체

  • c : 변수의 모임
  • cpp : 변수 + 함수의 모임
    • 클래스와 같나?
  • 접근 재어 속성을 생략하면 struct는 public, class는 private가 기본임
// struct vs class
struct Man{
private:
    int age;
private://기본접근속성
    int getAge(){return age;}
    void setAge(int a){age=a;}
};

struct Man han; //c
Man han;//pp

class Man{
    private://기본 접근 속성
          int age;
      public:
          int getAge(){return age;}
        void setAge(int a){age=a;}
};

Man han;

 

 

📌 객체와 클래스

⚡ 객체(instance)

  • 자료와 이를 처리하는 동작인 연산(함수, method)을 하나로 묶어 만든 요소
  • 자료를 표현하는 변수 만을 가지는 것이 아니라 그 객체가 무엇을 할 수 있는가를 정의한 함수도 구성

 

⚡ 클래스(class)

  • 각 객체의 속성을 정의하는 수단
  • 모든 객체는 사용 전에 객체의 속성을 기술하는 클래스를 정의한 후 이 클래스의 형으로 선언되어야 한다
  • 클래스는 객체의 타입(Object Type)이다
  • 클래스는 유사한 객체들이 갖는 공통된 데이터와 함수들을 정의한 객체의 기본 구격(specification)이다.
클래스를 만드는 것 : 추상 자료형

클래스 : 개
객체 : 멍멍이, 해피, 메리

 

 

📌 객체 지향의 중심 기술

객체 지향 프로그래밍

  • 캡슐화
  • 상속성
  • 다형성

 

📌 형 변환 static_cast

인위적으로 형 변환을 해줄 때 사용

static_cast<변수형> 변수 이름

 

📌 자릿수

cout.precision(숫자) : <iostream>에서 제공되는 std::cout객체의 멤버함수
-> 숫자만큼의 자릿수 출력(반올림)

cout.precision(5);//소수점까지 5자리만 출력
cout.setf(ios::fixed); 위에서 선언한 자릿수만큼 고정
std::cout.setf(std::ios::hex); // 16진수로 출력 형식 플래그 설정
std::cout.setf(std::ios::dec); // 10진수로 출력 형식 플래그 설정
cout.setf(ios::showpoint);//소수점 표시
cout<<fixed;//
int main(){
    double a = 100;
    double b = 1500.0;
    double pi = 3.1416;

    std::cout.precision(5);
    std::cout<<std::showpoint<<a<<'\t'<<b<<'\t'<<pi<<std::endl;
    std::cout<<std::noshowpoint<<a<<'\t'<<b<<'\t'<<pi<<endl;
    return 0;

    //100.00    1500.0    3.1416
    //100    1500    3.1416
}

 

📌 난수 생성 : srand()

#include<time>
srand(time(0));

 

📌 에러검출 : assert

#include<cassert>

내가 체크하고 싶은 부분에서, 원하는 결과가 맞는지 체크

assert(var>10);
//컴파일러가 맞으면 넘어가고 틀렸으면 오류
#define NDEBUG
#include<cassert>
//assert 전체 다 끔

 

📌 std::ios::sync_with_stdio()

  • C++의 표준라이브러리인 <ios>에 정의된 'std::ios_base' 클래스의 정적 멤버함수
  • C++의 입출력 버퍼와 C의 입출력 버퍼를 동기화여부를 설정하는데 사용
  • 기본적으로 C++의 입출력 버퍼와 C의 입출력 버퍼는 동기화되어 있어서, 한 쪽에서 입출력이 발생하면 다른 쪽에서도 동기화되는 작업이 수행됨 => 이 동기화 작업은 성능을 저하시킬 수 있음

=> std::ios::sync_with_stdio(false)를 호출하면 두 입출력 버퍼가 동기화되지 않도록 설정됨

 

📌 getline

  • getline(cin, str)
  • <string>헤더에 정의된 함수로 문장을 한 줄 입력받음

 

📌 map

  • 키와 값의 쌍으로 데이터를 저장하고 관리하는 연관 컨태이너
  • 내부적으로 이진검색트리를 사용하여 키-값 쌍을 저장하며 키는 정렬된 상태르 ㄹ유지

map 특징

  • 원소의 삽입, 삭제, 검색 작업에 대해 평균적으로 O(logN)의 시간복잡도를 가짐
    • 이진 검색 트리의 특성때문에 원소의 삽입, 삭제, 검색속도가 빠름
  • 키는 중복될 수 없으며, 키에 대한 오름차순으로 원소들이 정렬됨
  • 트리 기반의 구조를 사용하기 때문에 원소들의 삽입, 삭제 시 자동으로 정렬되는 특징을 가짐
  • 키를 기반으로 원소를 검색하고 접근할 수 있음

 

📌 unordered_map

  • 키와 값 쌍을 저장하는 연관 컨테이너
  • 해시테이블을 사용하여 원소들을 저장하며 원소들은 순서가 유지되지 않음
  • 키를 기반으로 원소를 검색, 삽입, 삭제하는 데에 O(1)의 평균적인 시간 복잡도를 가짐

unordered_map 특징

  • 원소의 삽입, 삭제, 검색 작업에 대해 평균적으로 O(1)의 시간 복잡도를 가짐
    • 해시테이블을 사용하기 때문에 원소의 개수와는 무관하게 일정한 성능을 제공함
  • 원소들은 순서가 유지되지 않음
    • 삽입된 순서나 키의 순서에 관계없이 원소들이 저장됨
  • 해시테이블 기반의 구조를 사용하기 때문에 원소들의 순서가 예측할 수 없음
  • 키와 값이 동일한 형태를 가지며, 키를 기반으로 원소를 검색하고 접근할 수 있음

 

map()과 unordered_map()의 차이점

  • 정렬 순서
    • map : 키를 기준으로 정렬된 순서로 원소들을 저장함
      • 기본적으로 오름차순으로 정렬되며, 정렬 기준을 사용자 정의할 수 있음
    • unordered_map : 원소들은 순서가 유지되지 않음
      • 삽입된 순서나 키의 순서에 관계없이 원소들이 저장됨
    •  
    • 성능
      • map : 내부적으로 레드-블랙 트리를 사용하여 원소들을 저장하므로, 삽입, 삭제, 검색 작업에 대해 O(logN)의 시간 복잡도를 가짐
        • 원소의 개수가 적을 때는 map이 unordered_map보다 빠를 수 있음
      • unordered_map : 내부적으로 해시테이블을 사용하여 원소들을 저장하므로, 삽입, 삭제, 검색 작업에 대해 O(1)의 평균적인 시간복잡도를 가짐
        • 원소의 개수에 무관하게 일정한 성능을 제공함
  •  
  • 메모리 사용
    • map : 추가적인 이진 검색 트리 구조를 사용하므로 unordered_map보다 더 많은 메모리를 사용할 수 있음
    • unordered_map : 해시테이블을 사용하기 때문에 map보다 더 적은 메모리를 사용할 수 있음
  • 정렬 여부
    • map : 키를 기준으로 정렬된 순서로 원소들이 저장되기 때문에, 정렬된 순서로 원소를 순회하거나 특정 범위의 원소들을 검색하는데 유용함
    • unordered_map : 순서가 유지되지 않으므로 원소들을 삽입된 순서로 순회할 수 없으며, 정렬된 순서로 접근하는 것이 필요하지 않을 때 유용

정리

  • map : 정렬된 순서가 필요하거나, 작은 데이터셋에 대해 효율적인 연산을 수행할 때 유용
  • unordered_map : 순서가 중요하지 않거나, 대량의 데이터를 빠르게 검색하고자 할 때 유용

 

📌 set

  • 중복되지 않는 원소들의 정렬된 집합을 관리하는 연관 컨테이너
  • 내부적으로 이진 검색 트리를 사용하여 원소들을 저장하며, 원소들은 중복되지 않고 정렬된 상태를 유지

 

set 특징

  • 원소의 삽입, 삭제, 검색 작업에 대해 평균적으로 O(logN)의 시간 복잡도를 가짐
    • 이진 검색 트리의 특성때문에 원소의 삽입, 삭제, 검색 속도가 빠름
  • 원소들은 중복되지 않고 정렬된 상태를 유지
    • 기본적으로 오름차순으로 정렬되며, 정렬 기준을 사용자 정의할 수도 있음
  • set은 트리 기반의 구조를 사용하기 때문에 원소들의 삽입, 삭제 시 자동으로 정렬되는 특징을 가짐
  • 키와 값이 동일한 형태를 가지며, 키를 기반으로 원소를 검색하고 접근할 수 있음

 

📌 greater

  • map, set 등 key를 내림차순으로 정렬하고 싶을 때 사용
  • #include< functional >

📌 isdigit

  • #include< cctype >
  • 주어진 문자가 0~9 사이의 숫자인지 확인하는 함수
    • 숫자면 true 반환
    • 그렇지 않은 경우 false 반환

 

📌 stoi

  • #include< string >
  • c++11부터 제공
  • 숫자인 문자열을 정수로 반환

 

📌 back_inserter

  • 컨테이너의 뒤쪽에 값을 삽입할 수 있는 반복자를 생성
    • 컨테이너에 값을 추가할 때 편리하게 사용

 

📌 pair

  • #include< utility >
  • 두 개의 값을 하나의 쌍으로 묶어주는 클래스 템플릿

 

ex)

#include <iostream>
#include <utility>

int main() {
    // 정수와 문자열의 쌍을 만듦
    std::pair<int, std::string> myPair(42, "Hello");

    // pair의 멤버에 접근
    std::cout << "First: " << myPair.first << std::endl;
    std::cout << "Second: " << myPair.second << std::endl;

    // pair의 멤버를 수정
    myPair.first = 99;
    myPair.second = "World";

    // 수정된 pair의 멤버 출력
    std::cout << "Modified First: " << myPair.first << std::endl;
    std::cout << "Modified Second: " << myPair.second << std::endl;

    return 0;
}

 

 

 

 

 

 

 

728x90
LIST

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

[C++] class VS 구조체  (0) 2024.01.26
[C++] <vector>  (0) 2024.01.26
[C++] priority queue (우선순위 큐) 란?  (0) 2024.01.26
[C++] <algorithm>  (1) 2024.01.22
[C++] find()함수  (0) 2024.01.22

BELATED ARTICLES

more