[이것이 C++이다] Part 02. 객체지향 프로그래밍 (1)

Part 02. 객체지향 프로그래밍

Chapter 03. 클래스

  • 객체지향 프로그래밍의 개념을 이해합니다.
  1. 클래스
  2. 생성자와 소멸자
  3. 메서드

3.1 객체지향 프로그래밍 개요

  • C++ 객체지향 프로그래밍
    • 사용자의 편의성을 극대화 해야 합니다.
    • 사용자의 실수 가능성을 제작자가 차단해야 합니다.

3.2 클래스 기본 문법

  • 클래스는 ‘함수를 포함하는 구조체’로 표현할 수 있습니다.
  • 다만, 구조체와 다른 점은 접근 제어 지시자로 멤버 접근을 통제할 수 있는 것과 생성자로 ‘제작자’가 멤버를 초기화 할 수 있다는 것입니다.

3.2.1 멤버 선언 및 정의

  • 생성자
    • 반환 자료형이 없습니다.
    • 호출되는 시점이 문법적으로 정해져 있습니다.
  • 클래스 함수 선언과 정의를 분리할 수 있습니다.

  • 멤버 변수 초기화
    • 초기화 목록 사용할 수 있습니다. 이 때, 멤버변수가 참조자 형식이면 반드시 초기화 목록을 이용해 초기화 해야 합니다.
    • C11 부터 선언과 동시에 멤버 변수를 초기화 할 수 있습니다.

3.2.2 접근 제어 지시자

  • 기본은 private
  • 생성자도 접근 제어 지시자의 영향을 받습니다.

3.3 생성자와 소멸자

  • 생성자와 소멸자는 반환 형식이 없고, 문법적으로 호출되는 시점이 정해져 있는 함수입니다.
  • 생성자는 다중 정의(오버로딩)할 수 있지만 소멸자는 그럴 수 없습니다.

3.3.1 동적 객체의 생성과 소멸

  • 배열로 작성한 객체들은 반드시 배열로 삭제해야 합니다.

    CTest *pData = new CTest[3];
    delete[] pData;
    

3.3.2 참조 형식 멤버 초기화

  • 참조자는 반드시 선언과 동시에 초기화 해야 합니다. 이 때, 반드시 생성자 목록을 사용해 초기화 해야 합니다.
    • 단순 대입 연산자와 초기화의 의미를 구분합시다.
  • 사라질 코드에 대한 주의를 기울여야 합니다.

3.3.3 생성자 다중 정의

3.3.4 명시적 디폴트 생성자

3.4 메서드

  • 일반 / 상수화(const) / 정적(static) / 가상(virtual)

3.4.1 this 포인터

  • hidden parameter

3.4.3 상수형 메서드

  • 상수형 메서드 원리는 this 포인터를 상수형 포인터로 변경하는 것 입니다.
    const CTest *this;
    
  • 멤버 변수에 접근은 가능하지만 쓰기는 허용되지 않는 메서드 입니다.

    int getdata() const { 
      return m_ndata;  // 멤버 변수의 값은 읽을 수 있지만 쓸 수 없다. (대입도 안됨)
    }
    

3.4.5 상수형 메서드의 예외 사항

  • mutual
  • const_cast<새 형식=""> (대상)

3.4.6 멤버 함수 다중 정의

  • 함수의 다중 정의는 사용자가 호출 실수를 범할 수 있으므로 delete 예약어를 사용애 명시적으로 디폴트 메서드를 삭제하는 것이 더 좋을 때도 있습니다.

    void setdata(double dparam) = delete;
    

3.5 정적 멤버

  • 정적 멤버 함수는 인스턴스를 선언하지 않고, 직접 호출할 수 있습니다. 그러나 this 포인터를 사용할 수 없습니다.
  • 정적 멤버 변수는 반드시 선언과 정의를 분리해야 합니다.