IT’s Portfolio

[Lecture] Cpp - Finals Summary λ³Έλ¬Έ

Development Study/C

[Lecture] Cpp - Finals Summary

f1r3_r41n 2023. 6. 13. 18:32
728x90
λ°˜μ‘ν˜•

πŸ’» 2023λ…„ Cpp 기말고사 λŒ€λΉ„ μš”μ  정리

πŸ‘€ [08] 상속

μƒμ†μ˜ κ°œλ…

  • 상속(Inheritance) : 객체 지ν–₯ μ–Έμ–΄μ˜ 본질적인 νŠΉμ„±
    • 두 클래슀 사이에 λΆ€λͺ¨-μžμ‹μ˜ 상속 관계 μ„ μ–Έ
    • μžμ‹ 클래슀의 객체가 생성될 λ•Œ, μžμ‹ μ˜ 멀버뿐 μ•„λ‹ˆλΌ λΆ€λͺ¨ 클래슀의 멀버λ₯Ό 포함할 것을 μ§€μ‹œν•¨
    • λΆ€λͺ¨ 클래슀 => κΈ°λ³Έ 클래슀(base class)
    • μžμ‹ 클래슀 => νŒŒμƒ 클래슀(derived class)
    • cppλŠ” μ—¬λŸ¬ 개의 클래슀λ₯Ό λ™μ‹œμ— μƒμ†λ°›λŠ” 닀쀑 상속(multiple inheritance) ν—ˆμš©
  • μƒμ†μ˜ λͺ©μ κ³Ό μž₯점
    • κ°„κ²°ν•œ 클래슀 μž‘μ„±
    • 클래슀 κ°„μ˜ 계측적 λΆ„λ₯˜ 및 κ΄€λ¦¬μ˜ μš©μ΄ν•¨
    • 클래슀 μž¬μ‚¬μš©κ³Ό ν™•μž₯을 ν†΅ν•œ μ†Œν”„νŠΈμ›¨μ–΄μ˜ 생산성 ν–₯상
  • 상속은 is-a 관계
    • has-a κ΄€κ³„λŠ” μƒμ†μœΌλ‘œ λͺ¨λΈλ§ X

클래슀 상속과 객체

class Student : public Person {

};
class StudentWorker : public Student {

};
  • Person을 μƒμ†λ°›λŠ” Student와 Studentλ₯Ό μƒμ†λ°›λŠ” StudentWorker μ„ μ–Έ
  • κΈ°λ³Έ 클래슀 이름 μ•žμ— λ°˜λ“œμ‹œ 상속 접근을 지정해야 ν•˜λŠ”λ°, μ ‘κ·Ό μ§€μ •μž 3개 λͺ¨λ‘ μ‚¬μš© κ°€λŠ₯함
  • μƒμ†μ˜ νšŸμˆ˜λŠ” μ œν•œμ΄ μ—†μŒ
class ColorPoint : public Point {
  // Pointλ₯Ό μƒμ†λ°›λŠ” ColorPoint의 상속 μ„ μ–Έ
};
int main() {
  Point p; // Point νƒ€μž…μΈ κΈ°λ³Έ 클래슀 객체 p 생성
  ColorPoint cp; // ColorPoint νƒ€μž…μΈ νŒŒμƒ 클래슀 객체 cp 생성
}
  • 객체 pλŠ” Point 클래슀의 λ©€λ²„λ§Œ 가짐
  • 객체 cpλŠ” Point 멀버와 ColorPoint 멀버 λͺ¨λ‘ 가짐

νŒŒμƒ ν΄λž˜μŠ€μ—μ„œ κΈ°λ³Έ 클래슀 멀버 μ ‘κ·Ό

  • νŒŒμƒ ν΄λž˜μŠ€λŠ” 상속을 톡해 κΈ°λ³Έ 클래슀의 멀버λ₯Ό μžμ‹ μ˜ λ©€λ²„λ‘œ ν™•μž₯
  • νŒŒμƒ 클래슀의 멀버듀은 κΈ°λ³Έ 클래슀의 private 멀버 외에 λͺ¨λ“  멀버λ₯Ό μ ‘κ·Όν•  수 있음

κΈ°λ³Έ 클래슀의 private λ©€λ²„μ˜ 상속과 μ ‘κ·Ό

  • κΈ°λ³Έ 클래슀의 private 멀버도 νŒŒμƒ ν΄λž˜μŠ€μ— 상속됨
  • νŒŒμƒ 클래슀의 객체가 생길 λ•Œ νŒŒμƒ 클래슀의 객체 내에 생성됨
  • 즉, κΈ°λ³Έ ν΄λž˜μŠ€μ— μ„ μ–Έλœ private λ©€λ²„λŠ” νŒŒμƒ ν΄λž˜μŠ€μ— μƒμ†λ˜κ³  νŒŒμƒ 클래슀의 객체에도 ν¬ν•¨λ˜μ§€λ§Œ, νŒŒμƒ 클래슀의 μ–΄λ–€ ν•¨μˆ˜μ—μ„œλ„ 직접 접근이 λΆˆκ°€ν•¨

클래슀 μ™ΈλΆ€μ—μ„œ νŒŒμƒ 클래슀의 멀버 호좜

  • main() ν•¨μˆ˜μ™€ 같이 νŒŒμƒ 클래슀 μ™ΈλΆ€μ—μ„œ νŒŒμƒ 클래슀 객체의 public 멀버와 κΈ°λ³Έ 클래슀의 public 멀버λ₯Ό λͺ¨λ‘ μ ‘κ·Όν•  수 있음

protected μ ‘κ·Ό 지정

  • protected μ ‘κ·Ό μ§€μ •μœΌλ‘œ μ„ μ–Έλœ λ©€λ²„λŠ” 클래슀 λ‚΄μ˜ 멀버 ν•¨μˆ˜μ™€ 이 클래슀λ₯Ό 상속받은 νŒŒμƒ 클래슀의 멀버 ν•¨μˆ˜μ—κ²Œλ§Œ 접근이 ν—ˆμš©λ¨

상속과 μƒμ„±μž, μ†Œλ©Έμž

  • νŒŒμƒ 클래슀의 객체가 생성될 λ•Œ νŒŒμƒ 클래슀의 μƒμ„±μžμ™€ κΈ°λ³Έ 클래슀의 μƒμ„±μžκ°€ λͺ¨λ‘ 싀행됨
    • νŒŒμƒ 클래슀의 μƒμ„±μžλ³΄λ‹€ κΈ°λ³Έ 클래슀의 μƒμ„±μžκ°€ λ¨Όμ € 싀행됨
    • μƒμ„±μžλŠ” 객체λ₯Ό μ΄ˆκΈ°ν™”ν•  λͺ©μ μœΌλ‘œ μ‚¬μš©λ¨
    • μƒμ„±μžμ˜ 호좜 κ΄€κ³„λŠ” μ»΄νŒŒμΌλŸ¬μ— μ˜ν•΄ 이루어짐
  • μ†Œλ©ΈμžλŠ” μƒμ„±μžμ˜ μ‹€ν–‰ μˆœμ„œμ™€ λ°˜λŒ€λ‘œ 싀행됨
  • νŒŒμƒ ν΄λž˜μŠ€μ—μ„œ κΈ°λ³Έ 클래슀의 μƒμ„±μžλ₯Ό μ„ νƒν•˜μ§€ μ•Šμ€ 경우, κΈ°λ³Έ 클래슀의 κΈ°λ³Έ μƒμ„±μžκ°€ 호좜됨
B(int x) : A(x+3) {
    cout << "λ§€κ°œλ³€μˆ˜μƒμ„±μž B" << x << endl;
}
  • νŒŒμƒ 클래슀의 μƒμ„±μžλ₯Ό μž‘μ„±ν•  λ•Œ κΈ°λ³Έ 클래슀의 μƒμ„±μžλ₯Ό λͺ…μ‹œμ μœΌλ‘œ μ„ νƒν•˜λŠ” 방법

μƒμ†μ˜ μ’…λ₯˜

  • public 상속 : κΈ°λ³Έ 클래슀의 protected, public 멀버듀은 μ ‘κ·Ό 지정 λ³€κ²½ 없이 νŒŒμƒ ν΄λž˜μŠ€μ— κ·ΈλŒ€λ‘œ 상속 확정됨
  • private 상속 : κΈ°λ³Έ 클래슀의 protected, public 멀버듀은 λͺ¨λ‘ private μ ‘κ·Ό μ§€μ •μœΌλ‘œ λ³€κ²½λ˜μ–΄ νŒŒμƒ ν΄λž˜μŠ€μ— 상속 확정됨
  • protected 상속 : κΈ°λ³Έ 클래슀의 protected, public 멀버듀은 λͺ¨λ‘ protected μ ‘κ·Ό μ§€μ •μœΌλ‘œ λ³€κ²½λ˜μ–΄ νŒŒμƒ ν΄λž˜μŠ€μ— 상속 확정됨

πŸ‘€ [10] ν…œν”Œλ¦Ώκ³Ό ν‘œμ€€ ν…œν”Œλ¦Ώ 라이브러리(STL; Standard Template Library)

μΌλ°˜ν™”μ™€ ν…œν”Œλ¦Ώ

  • template : ν•¨μˆ˜λ‚˜ 클래슀 μ½”λ“œλ₯Ό 찍어내듯이 생산할 수 μžˆλ„λ‘ μΌλ°˜ν™”(generic) μ‹œν‚€λŠ” 도ꡬ
    • ν…œν”Œλ¦Ώ ν•¨μˆ˜(template function) or μ œλ„€λ¦­ ν•¨μˆ˜(generic function) : template ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•΄ λ§Œλ“  ν•¨μˆ˜
      • ν…œν”Œλ¦Ώ ν•¨μˆ˜λŠ” μ»΄νŒŒμΌλ˜μ§€λ„ ν˜ΈμΆœλ˜μ§€λ„ μ•ŠλŠ” ν•¨μˆ˜μ˜ ν‹€
      • ν…œν”Œλ¦Ώ ν•¨μˆ˜λ‘œλΆ€ν„° κ΅¬μ²΄ν™”λœ λ²„μ „μ˜ ν•¨μˆ˜κ°€ 컴파일되고 호좜됨

ν…œν”Œλ¦Ώ μ„ μ–Έκ³Ό μ œλ„€λ¦­ νƒ€μž…

// 쀑볡 ν•¨μˆ˜ 1
void myswap(int &a, int &b) {
    int tmp;
    tmp = a;
    a = b;
    b = tmp;
}

// 쀑볡 ν•¨μˆ˜ 2
void myswap(double &a, double &b) {
    double tmp;
    tmp = a;
    a = b;
    b = tmp;
}

// μ œλ„€λ¦­ ν•¨μˆ˜
template <class T>
void myswap(T &a, T &b) {
    T tmp;
    tmp = a;
    a = b;
    b = tmp;
}
  • template ν‚€μ›Œλ“œμ™€ <class T> λ‚˜ <typename T> 둜 μ œλ„€λ¦­ νƒ€μž… T μ„ μ–Έ
    • μ œλ„€λ¦­ νƒ€μž…(generic type) : cpp의 κΈ°λ³Έ νƒ€μž…μ΄ μ•„λ‹ˆλ©°, 이듀을 μΌλ°˜ν™”μ‹œν‚¨ μƒˆλ‘œμš΄ νƒ€μž…

ꡬ체화

  • ꡬ체화(specialization) : 쀑볡 ν•¨μˆ˜λ“€μ„ ν…œν”Œλ¦Ών™”ν•˜λŠ” κ³Όμ •μ˜ μ—­κ³Όμ •
    • μ»΄νŒŒμΌλŸ¬κ°€ 담당함
    • ꡬ체화λ₯Ό 톡해 μƒμ„±λœ ν•¨μˆ˜λ₯Ό κ΅¬μ²΄ν™”λœ ν•¨μˆ˜(specialized function) 라고 함

ν…œν”Œλ¦Ώμ˜ μž₯단점과 μ œλ„€λ¦­ ν”„λ‘œκ·Έλž˜λ°

  • μ†Œν”„νŠΈμ›¨μ–΄μ˜ 생산성과 μœ μ—°μ„± ν–₯상
  • ν¬νŒ…μ— μ·¨μ•½
  • 였λ₯˜ λ©”μ‹œμ§€κ°€ λΉˆμ•½ν•˜μ—¬ 디버깅에 λ§Žμ€ 어렀움
  • μ œλ„€λ¦­ ν”„λ‘œκ·Έλž˜λ°(generic programming) : ν…œν”Œλ¦Ώμ„ μ‚¬μš©ν•˜μ—¬ μ œλ„€λ¦­ ν•¨μˆ˜λ‚˜ μ œλ„€λ¦­ 클래슀λ₯Ό λ§Œλ“€κ³  이λ₯Ό ν™œμš©ν•˜μ—¬ ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λŠ” νŒ¨λŸ¬λ‹€μž„

λ‹€μ–‘ν•œ μ œλ„€λ¦­ ν•¨μˆ˜

  • μ œλ„€λ¦­ ν•¨μˆ˜λ₯Ό λ§Œλ“€ λ•Œ, 개발자의 ν•„μš”μ— 따라 μ œλ„€λ¦­ νƒ€μž…μ€ ν•˜λ‚˜ 이상 λ§ˆμŒλŒ€λ‘œ μ„ μ–Έν•˜λ©΄ 됨
  • ν…œν”Œλ¦Ώ ν•¨μˆ˜μ™€ λ™μΌν•œ μ΄λ¦„μœΌλ‘œ μ€‘λ³΅λœ ν•¨μˆ˜κ°€ μžˆμ„ 경우, 쀑볡 ν•¨μˆ˜κ°€ μš°μ„ ν•˜μ—¬ 바인딩됨

μ œλ„€λ¦­ 클래슀

template <class T>
class Box {
    T data;
public:
    Box() { }
    void set(T v) {
        data = v;
    }
    T get() {
        return data;
    }
};
  • ν΄λž˜μŠ€λ„ template ν‚€μ›Œλ“œλ‘œ μΌλ°˜ν™”μ‹œν‚¬ 수 있음
  • 클래슀의 λͺ¨λ“  멀버 ν•¨μˆ˜ μ—­μ‹œ ν…œν”Œλ¦Ώ ν•¨μˆ˜λ‘œ μž‘μ„±λ˜μ–΄μ•Ό 함

STLκ³Ό ν™œμš©

  • ν‘œμ€€ ν…œν”Œλ¦Ώ 라이브러리(Standard Template Library) : ν…œν”Œλ¦ΏμœΌλ‘œ μž‘μ„±λœ λ§Žμ€ μ œλ„€λ¦­ ν΄λž˜μŠ€μ™€ ν•¨μˆ˜ 라이브러리
    • ν”„λ‘œκ·Έλž˜λ°μ— 맀우 μœ μš©ν•œ μˆ˜λ§Žμ€ μ»¨ν…Œμ΄λ„ˆμ™€ μ•Œκ³ λ¦¬μ¦˜ 제곡
    • 객체 지ν–₯ 기법과 μ œλ„€λ¦­ ν”„λ‘œκ·Έλž˜λ° 기법을 μ‚¬μš©ν•˜μ—¬ λ§Œλ“€μ–΄μ‘ŒκΈ°μ— μœ μ—°μ„±μ΄ μ’‹μŒ
    • μ „λ¬Έκ°€κ°€ λ§Œλ“€μ–΄μ„œ κ²€μ¦λ˜μ—ˆμŒ
  • μ»¨ν…Œμ΄λ„ˆ(container) - ν…œν”Œλ¦Ώ 클래슀
    • 자료λ₯Ό μ €μž₯ν•˜λŠ” ꡬ쑰
    • 순차 μ»¨ν…Œμ΄λ„ˆ
      • 자료 순차 μ €μž₯
      • vector : 동적 λ°°μ—΄
        • λ’€μ—μ„œ 자료 μΆ”κ°€
      • deque : μ–‘ λμ—μ„œ μž…λ ₯κ³Ό 좜λ ₯ κ°€λŠ₯
      • list : 벑터와 μœ μ‚¬
        • 자료λ₯Ό 쀑간에 μΆ”κ°€ν•˜λŠ” 연산이 νš¨μœ¨μ μž„
    • μ—°κ΄€ μ»¨ν…Œμ΄λ„ˆ
      • 사전과 같은 ꡬ쑰λ₯Ό μ‚¬μš©ν•΄ 자료 μ •λ ¬ μ €μž₯
      • set : 쀑볡이 μ—†λŠ” μžλ£Œλ“€μ΄ μ •λ ¬λ˜μ–΄ μ €μž₯ - μ—°κ΄€
        • multiset : 쀑볡 ν—ˆμš©
      • map : key-value ν˜•μ‹μœΌλ‘œ μ €μž₯ - μ—°κ΄€
        • ν‚€κ°€ μ œμ‹œλ˜λ©΄ ν•΄λ‹Ή 값을 찾을 수 있음
        • multimap : 쀑볡 ν—ˆμš©
    • μ»¨ν…Œμ΄λ„ˆ μ–΄λŒ‘ν„°
      • 순차 μ»¨ν…Œμ΄λ„ˆμ— μ œμ•½μ„ κ°€ν•΄μ„œ 데이터듀이 정해진 λ°©μ‹μœΌλ‘œλ§Œ μž…μΆœλ ₯
      • queue : μ„ μž…μ„ μΆœ 자료 ꡬ쑰
      • stack : ν›„μž…μ„ μΆœ 자료 ꡬ쑰
      • priority queue : 큐의 μš”μ†Œλ“€μ΄ μš°μ„  μˆœμœ„λ₯Ό 가지고 있고 μš°μ„  μˆœμœ„κ°€ 높은 μš”μ†Œκ°€ λ¨Όμ € 좜λ ₯λ˜λŠ” 자료 ꡬ쑰
  • 반볡자(iterator) - μ»¨ν…Œμ΄λ„ˆ μ›μ†Œμ— λŒ€ν•œ μΌλ°˜ν™”λœ 포인터(generalized pointer)
    • μ»¨ν…Œμ΄λ„ˆ 내에 μ €μž₯된 μš”μ†Œλ“€μ„ 순차적으둜 μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ μ»΄ν¬λ„ŒνŠΈ
    • μ»¨ν…Œμ΄λ„ˆμ™€ μ•Œκ³ λ¦¬μ¦˜ μ‚¬μ΄μ˜ 닀리 μ—­ν• 
    • 반볡자의 μ—°μ‚°μž
      • ++ : μ»¨ν…Œμ΄λ„ˆ λ‹€μŒ μš”μ†Œλ₯Ό 가리킀기 μœ„ν•œ μ—°μ‚°μž
      • -- : μ»¨ν…Œμ΄λ„ˆ 이전 μš”μ†Œλ₯Ό 가리킀기 μœ„ν•œ μ—°μ‚°μž
      • ==, != : bool μ—°μ‚°μž
      • * : λ°˜λ³΅μžκ°€ κ°€λ¦¬ν‚€λŠ” μš”μ†Œμ˜ 값을 μΆ”μΆœν•˜κΈ° μœ„ν•œ μ—°μ‚°μž
  • μ•Œκ³ λ¦¬μ¦˜(algorithm) - ν…œν”Œλ¦Ώ ν•¨μˆ˜
    • μ •λ ¬μ΄λ‚˜ 탐색과 같은 λ‹€μ–‘ν•œ μ•Œκ³ λ¦¬μ¦˜ κ΅¬ν˜„
    • find : μ»¨ν…Œμ΄λ„ˆ λ‚΄μ—μ„œ νŠΉμ • 자료 μ°ΎκΈ°
    • sort : μžλ£Œλ“€ 크기순 μ •λ ¬
    • reverse : μžλ£Œλ“€ μˆœμ„œ μ—­μˆœ
    • remove : 쑰건을 λ§Œμ‘±ν•˜λŠ” 자료 μ‚­μ œ
    • transform : μ»¨ν…Œμ΄λ„ˆμ˜ μš”μ†Œλ“€μ„ μ‚¬μš©μžκ°€ μ œκ³΅ν•˜λŠ” λ³€ν™˜ ν•¨μˆ˜μ— λ”°λΌμ„œ λ³€ν™˜

list

#include <iostream>
#include <time.h>
#include <list>
using namespace std;

int main()
{
    list<int> values;
    list<int>::iterator it;
    srand(time(NULL));
    for (int i = 0; i < 10; i++) {
        values.push_back(rand() % 100);
    }
    values.sort();

    for (it = values.begin(); it != values.end(); it++)
        cout << *it << " ";

    cout << endl;
    return 0;
}
  • push_back(), pop_back(), insert(n, v)

vector

#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<double> score(10);
    double max = 0;

    for (int i=0; i<score.size(); i++) {
        cout << "성적 μž…λ ₯: ";
        cin >> score[i];
        if (score[i] > max) {
            max = score[i];
        }
    }

    cout << "졜고 성적: " << max << endl;

    return 0;
}
#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<double> score;
    double max = 0;

    while(1) {
        double v = 0;
        cout << "성적 μž…λ ₯(-1 μž…λ ₯ μ‹œ μ’…λ£Œ): ";
        cin >> v;
        if (v == -1) break;
        score.push_back(v);
        if (v>max) max=v;
    }

    cout << "졜고 성적: " << max << endl;

    return 0;
}
  • push_back() : 벑터 끝에 μš”μ†Œ μΆ”κ°€ ν›„ 크기 1
  • pop_back() : λ°±ν„° λμ—μ„œ μš”μ†Œ 제거 ν›„ 크기 -1
  • insert(n, v) : λ²‘ν„°μ˜ n번째 μžλ¦¬μ— v μš”μ†Œ μΆ”κ°€
#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<double> score;
    double max = 0;

    while(1) {
        double v = 0;
        cout << "성적 μž…λ ₯(-1 μž…λ ₯ μ‹œ μ’…λ£Œ): ";
        cin >> v;
        if (v == -1) break;
        score.push_back(v);
    }

    vector<double>::iterator it;

    // c++14 이전 버전
    for (it=score.begin(); it!=score.end(); it++) {
        if (*it>max) max = *it;
    }

    // c++14
    // for (auto p=score.begin(); p!=score.end(); ++p) ..
    // for (auto &n : score) ..

    cout << "졜고 성적: " << max << endl;

    return 0;
}
  • 반볡자 μ‚¬μš©
  • auto : μ»΄νŒŒμΌλŸ¬μ—κ²Œ λ³€μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œλΆ€ν„° λ³€μˆ˜μ˜ νƒ€μž…μ„ μΆ”λ‘ ν•˜μ—¬ κ²°μ •ν•˜λ„λ‘ μ§€μ‹œν•¨

μ»¨ν…Œμ΄λ„ˆ 곡톡 ν•¨μˆ˜

deque

  • push_front() : 데큐 μ•žμ— κ°’ μΆ”κ°€
  • pop_front() : 데큐 μ•žμ˜κ°’ μΆ”μΆœ
  • push_back() : 데큐 뒀에 κ°’ μΆ”κ°€
  • pop_back() : 데큐 λ’€μ˜ κ°’ μΆ”μΆœ

map

  • make_pair(t, u) : tκ°€ ν‚€, uκ°€ κ°’

stack, queue

  • push() : 값을 μ €μž₯
  • pop() : μŠ€νƒμ€ ν›„μž…μ„ μΆœ ꡬ쑰둜 κ°’ μΆ”μΆœ, νλŠ” μ„ μž…μ„ μΆœ ꡬ쑰둜 κ°’ μΆ”μΆœ

find, find_if

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

int main() {
    vector<string> vec = { "사과", "ν† λ§ˆν† ", "λ°°", "μˆ˜λ°•", "ν‚€μœ„" };

    auto it = find(vec.begin(), vec.end(), "μˆ˜λ°•");
    if (it != vec.end()) {
        cout << "μˆ˜λ°•μ΄ " << distance(vec.begin(), it) << "에 μžˆμŠ΅λ‹ˆλ‹€." << endl;
    }
    return 0;
}

count

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

template <class T>
bool is_even(const T &num) {
    return (num % 2) == 0;
}

int main() {
    vector<int> vec;
    for (int i = 0; i<10; i++)
        vec.push_back(i);

    size_t n = count_if(vec.begin(), vec.end(), is_even<int>);
    cout << "값이 짝수인 μš”μ†Œμ˜ 개수: " << n << endl;
    return 0;
}

binary_search() 및 lambda

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

int main() {
    vector<string> v = { "one", "two", "three" };
    bool result;
    auto comp = [](string s1, string s2) { return (s1==s2); };

    result = binary_search(v.begin(), v.end(), "two", comp);
    if (result == true)
        cout << "λ¬Έμžμ—΄ \"two\" 은 벑터 μ•ˆμ— 있음." << endl;
    return 0;
}

for_each() 및 lambda

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    vector<int> v = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

    for_each(v.begin(), v.end(), [](int n){ if (n%2==0) cout<<n<<" ";} );
    cout << endl;
    return 0;
}

5보닀 큰 μ •μˆ˜

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    vector<int> n = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    auto cnt = count_if(n.begin(), n.end(), [](int n) { return (n > 5); });
    cout << "5보닀 큰 μ •μˆ˜μ˜ 개수: " << cnt << endl;

    return 0;
}

πŸ‘€ [11] Cpp μž…μΆœλ ₯ μ‹œμŠ€ν…œ

슀트림(stream)

  • μˆœμ„œκ°€ μžˆλŠ” λ°μ΄ν„°μ˜ 연속적인 흐름
  • Cpp ν‘œμ€€ μž…μΆœλ ₯ μ‹œμŠ€ν…œμ€ 버퍼λ₯Ό μ‚¬μš©ν•˜λŠ” 슀트림 μž…μΆœλ ₯만 지원
  • cin : Cpp의 ν‘œμ€€ μž…λ ₯ 슀트림 객체
    • istream νƒ€μž…
  • cout : Cpp의 ν‘œμ€€ 좜λ ₯ 슀트림 객체
    • ostream νƒ€μž…
  • cerr, clog : Cpp의 ν‘œμ€€ 였λ₯˜ 좜λ ₯ 슀트림 객체
    • clog λŠ” 버퍼λ₯Ό κ±°μΉ¨
    • cerr 은 버퍼λ₯Ό κ±°μΉ˜μ§€ μ•ŠμŒ

μ‚½μž… μ—°μ‚°μžμ™€ μΆ”μΆœ μ—°μ‚°μž

  • << : μ‚½μž… μ—°μ‚°μž
    • ostream ν΄λž˜μŠ€μ— μž‘μ„±λœ μ—°μ‚°μž
  • >> : μΆ”μΆœ μ—°μ‚°μž
    • istream ν΄λž˜μŠ€μ— μž‘μ„±λœ μ—°μ‚°μž

πŸ‘€ [12] Cpp 파일 μž…μΆœλ ₯

파일 슀트림

  • ofstream : 좜λ ₯ 파일 슀트림 클래슀
    • 좜λ ₯ 파일 생성 및 νŒŒμΌμ— 데이터 μž‘μ„± μ‹œ μ‚¬μš©
  • ifstream : μž…λ ₯ 파일 슀트림 클래슀
    • 파일의 데이터λ₯Ό 읽을 μ‹œ μ‚¬μš©
  • fstream : 일반적인 파일 슀트림

파일 μ“°κΈ°

#include <fstream>

using namespace std;

int main() {
    ofstream os("number.txt");

    if (!os.is_open()) {
        cerr << "error!" << endl;
        exit(1);
    }
    for (int i=0; i<100; i++)
        os << i << " ";
    return 0;
}
  • 파일 κ°μ²΄λŠ” λ²”μœ„λ₯Ό λ²—μ–΄λ‚˜λ©΄ 파일 객체 μ†Œλ©Έμžκ°€ νŒŒμΌμ„ λ‹«μŒ

파일 읽기

#include <fstream>

using namespace std;
int main() {
    ifstream is("numbers.txt");
    if (!is.is_open()) {
        cerr << "파일 μ˜€ν”ˆμ— μ‹€νŒ¨ν•˜μ˜€μŠ΅λ‹ˆλ‹€" << endl;
        exit(1);
    }
    int number;
    while (is) {
        is >> number;
        cout << number << " ";
    }
    cout << endl;
    return 0;
}

파일 λͺ¨λ“œ

  • ios::in : μž…λ ₯ λͺ¨λ“œ
  • ios::out : 좜λ ₯ λͺ¨λ“œ
  • ios::binary : 이진 파일 μž…μΆœλ ₯ λͺ¨λ“œ
  • ios::ate : 파일의 끝을 초기 μœ„μΉ˜λ‘œ ν•˜λŠ” λͺ¨λ“œ
  • ios::app : 파일의 끝에 μΆ”κ°€ν•˜λŠ” λͺ¨λ“œ
  • ios::trunc : μƒˆλ‘œμš΄ λ‚΄μš©μœΌλ‘œ ꡐ체 λͺ¨λ“œ

πŸ‘€ [μΆ”κ°€] μ˜ˆμ™Έμ²˜λ¦¬

μ˜ˆμ™Έ(exception)

  • 잘λͺ»λœ μ½”λ“œ, λΆ€μ •ν™•ν•œ 데이터, μ˜ˆμ™Έμ μΈ 상황에 μ˜ν•˜μ—¬ λ°œμƒν•˜λŠ” 였λ₯˜
  • interrupt : 컴퓨터 μž‘λ™ 쀑 λ¬Έμ œκ°€ λ°œμƒν•œ κ²½μš°λΌλ„ 업무 μ²˜λ¦¬κ°€ 계속될 수 μžˆλ„λ‘ ν•˜λŠ” κΈ°λŠ₯

였λ₯˜ 처리 방식

  • 닀쀑 if 문으둜 μ²˜λ¦¬ν•˜λŠ” 방식은 λΉ„νš¨μœ¨μ μž„
int main() {
    try {
        ...
        if ()
            throw exception;
    } catch (μ˜ˆμ™Ένƒ€μž…   λ§€κ°œλ³€μˆ˜) {
        ...
    }
}
  • try : μ˜ˆμ™Έκ°€ λ°œμƒν•  수 μžˆλŠ” 블둝
  • throw : μ˜ˆμ™Έλ₯Ό 전솑
  • catch : try λΈ”λ‘μ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄ μ²˜λ¦¬ν•˜λŠ” 블둝

πŸ‘€ [μΆ”κ°€] λ©€ν‹° μŠ€λ ˆλ“œ ν”„λ‘œκ·Έλž˜λ°

μŠ€λ ˆλ“œ(thread)

  • <thread> λΌμ΄λΈŒλŸ¬λ¦¬μ— μ •μ˜λ˜μ–΄ 있음
  • λ™μ‹œμ— μ²˜λ¦¬ν•΄μ•Ό ν•  일이 μžˆμ„ λ•Œ
  • CPU μ„±λŠ₯ μ΅œλŒ€ ν™œμš©
  • 보닀 λΉ λ₯΄κ³  적은 λΉ„μš©
  • λŒ€κΈ°μ‹œκ°„ 및 μ‘λ‹΅μ‹œκ°„ μ΅œμ†Œν™”
  • μ‹œμŠ€ν…œ λ‹¨μˆœν™”

Cppμ—μ„œμ˜ μŠ€λ ˆλ“œ

#include<iostream>
#include<thread>
using namespace std;

void func1() {
    cout<<"my func1"<<endl;
}

int main() {
    thread t(&func1);  //방법 1
    t.join();         //join()을 μ‹€ν–‰μ‹œν‚€λ©΄ tκ°€ μ’…λ£Œλ˜κΈ° μ „κΉŒμ§€ λŒ€κΈ°

    return 0;
}
  • κΈ°λ³Έ ν™œμš©
// thread_ex.h
#ifndef STUDY_H
#define STUDY_H
#include <fstream>

class Operator {
protected:
    std::fstream f1;
    std::fstream f2;
public:
    Operator();
    ~Operator();
    void sum();
    void sub();
};

#endif

// thread_ex.cpp
#include <iostream>
#include <fstream>
#include <thread>
using namespace std;

#include "thread_ex.h"

Operator::Operator() { cout << "operator constructor" << endl; }
Operator::~Operator() { cout << "operator distructor" << endl; }
void Operator::sum() {
    cout << "sum() running..." << endl;
    f1.open("source.txt");
    fstream wf1("plus.txt", ios::out);

    if (f1.is_open() && wf1.is_open()) {
        while (f1) {
            int a, b;
            f1 >> a >> b;
            wf1 << a << " + " << b << " = " << a+b << endl;
        }
        wf1.close();
    } else {
        cerr << "error!" << endl;
        exit(1);
    }
    cout << "sum() shutdown..." << endl;
}
void Operator::sub() {
    f2.open("source.txt");
    cout << "sub() running..." << endl;
    fstream wf2("minus.txt", ios::out);

    if (f2.is_open() && wf2.is_open()) {
        while (f2) {
            int a, b;
            f2 >> a >> b;
            wf2 << a << " - " << b << " = " << a-b << endl;
        }
        wf2.close();
    } else {
        cerr << "error!" << endl;
        exit(1);
    }
    cout << "sub() shutdown..." << endl;
}

int main() {
    Operator o;

    thread t1(&Operator::sum, &o);
    thread t2(&Operator::sub, &o);

    t1.join();
    t2.join();

    return 0;
}

πŸ‘€ [μΆ”κ°€] μ—¬λŸ¬ 가지 μΆ”κ°€ λ‚΄μš©λ“€

멀버 λ³€μˆ˜ 간단 μ΄ˆκΈ°ν™”

class Car {
    int speed;
    int gear;
    string color;
public:
    Car(int _s, int _g, string _c) : speed(_s), gear(_g), color(_c) { }
};

μƒμˆ˜ λ©€λ²„μ˜ μ΄ˆκΈ°ν™”

class Car {
    const int MAX_SPEED;
    int speed;
public:
    Car() : MAX_SPEED(300) { }
};

객체와 μ—°μ‚°μž

int main() {
    Car c1(0, 1, "white");
    Car c2(0, 1, "red");
    c1 = c2;
    if (c1==c2) {
        cout << "true" << endl;
    } else {
        cout << "false" << endl;
    }
    return 0;
}
  • 객체에 ν• λ‹Ή μ—°μ‚°μž = 을 μ‚¬μš©ν•˜λ©΄ c2 객체가 가지고 μžˆλŠ” λ³€μˆ˜μ˜ 값이 c1으둜 볡사됨
  • 객체 비ꡐ μ‹œμ—λŠ” == μ‚¬μš©

정적 멀버 ν•¨μˆ˜

class Car {
    ...
public:
    static int count;    // 정적 λ³€μˆ˜μ˜ μ„ μ–Έ

    ...
    // 정적 멀버 ν•¨μˆ˜
    static int getCount() {
        return count; 
    }
};
int Car::count=0;    // 정적 λ³€μˆ˜μ˜ μ •μ˜

int main()
{
    Car c1(100, 0, "blue");     
    Car c2(0, 0, "white");     
    int n = Car::getCount();    
    cout <<"μ§€κΈˆκΉŒμ§€ μƒμ„±λœ μžλ™μ°¨ 수 = " << n << endl;
    return 0;
}
728x90
λ°˜μ‘ν˜•
Comments