VEDA(한화비전 아카데미) 1기 : 3주차 기록

액상과당·2024년 8월 4일


👍🏻 이번 주 수업에서 좋았던 점 Liked

  • 저번 주가 기초 중의 기초 같은 느낌이었다면 이번에는 상속이나 템플릿, STL, 람다 등을 배우며 C언어와는 다른 매력을 잔뜩 느낄 수 있었다!

📚 이번 주에 새롭게 배운 점 Learned

  • friend
  • 참조를 리턴하는 연산자 중복
    +=, <<, ++(전위) 등의 연산자는 참조를 리턴해야 한다
    class Math {
    	int n, m;
    public:
    	Math& operator++ ();
    };
    
    Math& Math::operator++ () { 
    	n++;
    	m++;
    	return *this;
    };
  • 상속

    • 클래스 상속과 객체
      • class me : public Person { ... };
      • 파생 클래스 객체는 기본 클래스의 멤버와 파생 클래스의 멤버를 모두 가짐
      • 파생 클래스의 멤버들은 기본 클래스의 private 멤버 외 모든 멤버에 접근 가능
    • 상속과 객체 포인터
      // 업 캐스팅: 파생 클래스의 객체를 기본 클래스의 포인터로 가리킴
      // → 파생 클래스의 객체를 기본 클래스의 객체처럼 다룰 수 있음
      ColorPoint cp;
      ColorPoint *pDer = &cp;
      Point *pBase = pDer;
      
      // 다운 캐스팅: 기본 클래스의 포인터가 가리키는 객체를 파생 클래스의 포인터로 가리킴
      // cuation: 명시적인 타입 변환이 요구된다
      ColorPoint cp;
      ColorPoint *pDer;
      Point *pBase = &cp;
      pDer = (ColorPoint *)pBase;
    • protected 접근 지정
      private 멤버protected 멤버public 멤버
      멤버를 선언한 클래스ooo
      파생 클래스xoo
      다른 클래스나 외부 함수xxo
    • 상속과 생성자, 소멸자
      • B::B(int x) : A(x + 3) { ... }
      • 기본 클래스의 디폴트 생성자가 호출되기 때문에 기본 클래스에 디폴트 생성자가 없을 시 컴파일 오류 발생 → 명시적으로 기본 클래스의 생성자를 호출할 수도 있음
    • 다중 상속
      • class MusicPhone **: public MP3, public MobilePhone** { … };
      • 하나의 파생 클래스가 여러 클래스를 동시에 상속받음
      • but 기본 클래스의 멤버가 중복 상속되어 컴파일 오류 발생 가능성이 있음 → 가상 상속으로 해결
    • 가상 상속
      • class In : **virtual** public BaseIO { … };
      • 컴파일러에게 파생 클래스의 객체가 생성될 때 기본 클래스의 멤버 공간을 오직 한 번만 할당 → 이미 할당되어 있으면 그 공간을 공유
  • 가상 함수

    • `virtual void f() { .. }`
    • 동적 바인딩 지시어로, 컴파일러에게 함수에 대한 호출 바인딩을 실행 시간까지 미루도록 지시함
      • 실행시간이 늦어짐
    • 상속받는 파생 클래스에서 구현해야 할 일종의 함수 인터페이스 제공
    • 기본 클래스에서 virtual 선언 시 파생 클래스에서는 키워드 생략 가능

    ++ 오버라이딩

    • 다형성의 한 종류로 함수 재정의라고도 함
    • 기본 클래스의 가상 함수의 존재감을 상실시키고 파생 클래스에서 오버라이딩한 함수가 호출되도록 동적 바인딩함

    ++ 동적 바인딩

    • == 실생 시간 바인딩(run-time binding), 늦은 바인딩(late binding)

    • 가상 함수 호출 코드를 컴파일 타임이 아닌 런타임에 오버라이딩된 가상 함수를 동적으로 찾아 호출함

      ++ 가상 소멸자

    • virtual ~MyClass(); 소멸자 호출 시 동적 바인딩 발생

    • 파생 클래스의 객체가 기본 클래스에 대한 포인터로 delete 되는 상황에서도 정상적인 소멸이 되도록 하기 위해서는 기본 클래스의 소멸자를 만들 때 가상 함수로 작성해야 한다.

  • 템플릿

    • 함수나 클래스를 일반화시키고 매개 변수 타입을 지정해 함수나 클래스 코드를 찍어내듯 코드를 생산하는 기법을 일반화(Generic)라고 한다

    • 이때 일반화하는 도구를 템플릿이라고 하며, template 키워드로 선언

    • 함수 코드의 재사용성이 높으나 포팅에 취약하다

      // 하나의 제네릭 타입
      template <{class|typename} T>
      T bigger(T a, T b) { ... }
      
      // 두 개 이상의 제네릭 타입
      template <{class|typename} T1, {class|typename} T2>
      T add(T data[], int n) { ... }
      
      // 중복 함수
      // char형 배열을 첫 번째 인자로 넣으면 두 개의 함수 중 밑에 있는 함수가 호출됨
      template <class T>
      void print(T array[], int n) { ... }
      void print(char array[], int n) { ... }
      // 선언
      template<class T>
      class MyStack {
      	int tos;
      	T data[100];
      public:
      	MyStack();
      	void push(T element);
      	T pop();
      };
      
      // 구현
      template<class T>
      void MyStack<T>::push(T element) { ... }
      template <class T> T MyStack::pop() { ... }
      
      // 구체화
      MyStack<int> stack;
  • 람다식

    • auto를 사용함으로써 복잡한 형식의 변수 선언을 간소하게 표현 가능
      vector<int>::iterator it;
      for (it = v.begin(); it != v.end(); it++)
      	cout << *it << endl;
      
      // 위의 복잡한 타입을 auto를 사용해 간소화
      for (auto it = v.begin(); it != v.end(); it++)
      	cout << *it << endl;
    • 람다는 이름 없는 익명 함수로 캡처 리스트, 매개 변수 리스트, 리턴 타입, 함수 바디로 구성됨
      [x]변수 x의 값[&x]참조 변수 x
      [=]모든 변수의 값[&]모든 참조 변수
      // 람다식의 구조 (리턴 타입 생략 가능)
      [ ] ( ) -> returntype { }
      
      // example
      [](int x, int y) {cout << x + y;}
      [](int x, int y) -> int {x + y;} (2, 3);

🧐 배운 것에 관련해서 내가 부족했던 점 Lacked

  • 개념은 이해했다고 생각했는데 왜인지 문제를 풀면 자꾸 틀린다. 내가 제대로 이해하지 못한 것! 오답 풀이를 하면서 이해하는 과정이 재미있다. 특히 상속에서, 여러 상속에 걸치거나 메인 함수에서 호출하는 등의 경우가 헷갈렸다.
  • 가상 소멸자를 통해 파생 클래스가 delete 되는 상황에서도 정상적인 소멸이 된다는 것을 처음 알았다. 사실 소멸자에 대해 크게 신경 쓰고 있지 않았는데 반성하는 시간도 쪼금 가졌다...
  • 제네릭 함수의 경우 클래스의 멤버 변수나 함수 접근은 불가능하다! 일반화할 수 없기 때문에...

📝 앞으로 무엇을 더 하면 좋을지 Longed for

  • 진도를 나가는 속도가 빠르기 때문에 복습이 필수일 것 같다. 하루 지나서 바로 까먹으면 안 되니까! 회고 작성을 꾸준히 하려 노력해야겠다.
  • L-value와 R-value의 경우, 교재보다는 저번 주차 회고에 올렸던 씹어먹는 C++에서 보다 자세히 다루기 때문에 이쪽을 한번 훑어봐야겠다.

VEDA 바로가기 : www.vedacademy.co.kr
VEDA(한화비전 아카데미) 영상으로 확인하기 : https://url.kr/zy9afd
본 후기는 VEDA(한화비전 아카데미) 1기 학습 기록으로 작성되었습니다.

2개의 댓글