[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 : 키를 기준으로 정렬된 순서로 원소들을 저장함
- 성능
- map : 내부적으로 레드-블랙 트리를 사용하여 원소들을 저장하므로, 삽입, 삭제, 검색 작업에 대해 O(logN)의 시간 복잡도를 가짐
- 원소의 개수가 적을 때는 map이 unordered_map보다 빠를 수 있음
- map : 내부적으로 레드-블랙 트리를 사용하여 원소들을 저장하므로, 삽입, 삭제, 검색 작업에 대해 O(logN)의 시간 복잡도를 가짐
-
- unordered_map : 내부적으로 해시테이블을 사용하여 원소들을 저장하므로, 삽입, 삭제, 검색 작업에 대해 O(1)의 평균적인 시간복잡도를 가짐
- 원소의 개수에 무관하게 일정한 성능을 제공함
- 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 |