Chapter.3 클래스

  • 객체지향 프로그래밍 개요
    • 객체란 변수들과 그와 관련된 메서드들이 모여서 이룬 하나의 꾸러미! ( 객체 = 동작이나 상태를 나타내는 단위 )
    • 클래스란 C의 구조체에서 확장된 변수, 함수를 포함한 하나의 틀 이다 ( 클래스 = 찍어내기 위한 틀 )
    • 인터페이스 함수 : 내부로 직접 접근 못하는 사용자를 대신하여 내부안에서 기능을 수행하게 해주는 함수
  • 클래스의 기본 문법
    • 클래스의 기본 형태
      • class 클래스 이름    {
      • 접근제어 지시자:    // public, private, protected
      •     맴버변수 선언;
      •     맴버함수 선언 및 정의;
      • };
    • 맴버 선언 및 정의
      • 클래스는 '생성자'를 이용해 초기화 할 수 있음! - 생성자의 특징
        1. 반환하는 자료형이 없다
        2. 호출하는 함수가 아니라 적절한 시기에 자동으로 호출되는 함수
      • '사용자가 객체를 선언하면 자동으로 호출됨!' -> 따라서 맴버가 자동으로 초기화 가능
      • 선언법 // 클래스와 같은 이름의 함수를 선언 해주면 됨 
        • class Ctest {
        • public:
        •     Ctest() { ~ }
        • }
      • 생성자 사용시 초기화 목록 이용하는 법 -> 생성자 선언 뒤 콜론: 입력후 변수(값) 의 형태로 입력한다
        • class CTest {
        • public:
        •     CTest() : m_nData(10), m_nData2(20) { ~ }
        • }
    • 접근제어 지시자
      • 클래스의 특정 요소에 사용자가 접근할 수 없게 하기 위해 활용한다
        1. public : 멤버에 관한 모든 외부 접근이 허용됩니다
        2. protected : 멤버에 관한 모든 외부 접근이 차단됩니다 단 상속 관계가 있는 파생 클래스에선 접근 허용
        3. private : 외부 접근, 파생 클래스 접근 차단, 별도의 접근제어 지시자가 없을때 private로 간주됨
      • 이때 생성자도 접근제어 지시자의 영향을 받는다 ( 별도의 목적이 없다면 생성자는 public 으로 설정하자 )
  • 생성자와 소멸자
    • 객체가 생성, 소멸될 때 '자동으로' 호출됨, 반환 형식이 없음, 함수와 이름이 같다(소멸자의 경우 ~함수이름() 이다)
    • 매개변수가 없는 생성자를 디폴트 생성자 라고 한다
    • 생성자와 소멸자를 기술하지 않으면 컴파일러가 알아서 디폴트 생성자와 소멸자를 넣어준다
    • 선언된 블록 범위가 끝나면 자동으로 소멸된다 ex) 메인에서 호출후, 메인이 끝나면 -> 소멸자가 실행된다
      • main() 함수가 호출되기 전에 생성자가 호출될 수 있다(전역 변수로 선언한 클래스의 경우)
      • 생성자는 다중 정의 할 수 있다 (오버로딩)
      • 소멸자는 다중 정의 할 수 없다
      • main() 함수가 끝난 후에 소멸자가 호출될 수 있다
      • 생성자와 소멸자는 생략할 수 있으나 생략할 경우 컴파일러가 디폴트 생성자와 소멸자를 만들어 넣는다
      • 새로운 생성자를 만들면 디폴트 생성자를 생략할 수 있다(컴파일러도 만들어 주지 않음)
    • 동적 객체의 생성과 소멸
      • C++에서 동적 객체의 생성과 소멸은 new 와 delete 이다
      • 이때 클래스를 동적 객체로 생성하면, new 실행시 생성자가, delete 실행시 소멸자가 실행된다
    • 참조 형식 멤버 초기화
      • 참조자는 반드시 선언과 동시에 초기화 해야한다!
      • 이때 생성자 초기화 목록을 이용해 초기화 해야 한다
        • ex) CTest(int &rParam) : m_nData(rParam) { }; // int &m_nData(참조형 맴버변수)
    • 생성자 다중 정의
      • 생성자는 다중 정의 할 수 있다
      • 이때 생성자 위임 이라는 편리한 기능을 사용할 수 있다 
        • ex) CMyPoint(int x) { ~ } / CMyPoint (int x, int y) :CMyPoint(x) { ~ }
        • 즉 생성자 CMyPoint 실행 시 생성자 CMyPoint(int x) 또한 추가로 호출 될 수 있도록 위임 한 것
    • 명시적 디폴트 생성자
      • 디폴트 생성자가 필요할 때 다중 정의를 해 놓으면 디폴트 생성자가 만들어 지지 않으므로, 일부러 명시 해 준다
      • ex) CTest(void) = default; // CTest() 라는 생성자는 디폴트 생성자 이다!
      • delete 로 생성자 함수를 삭제할 수도 있다 ex) CTest(void) = delete; // 디폴트 생성자 삭제
  • 메서드(Method)
    • 매서드 = 맴버 함수 = 인터페이스 함수 // 클래스가 제공하는 기능! 방법! 을 뜻한다
    • this 포인터
      • 작성중인 클래스의 실제 인스턴스에 대한 주소(본인)
종류 일반 상수화 정적 가상
관련 예약어 - const static virtual
this 포인터 접근 가능 가능 불가능 가능
일반 멤버 읽기 가능 가능 가능(제한적) 가능
일반 멤버 쓰기 가능 불가능 가능(제한적) 가능
적정 멤버 읽기 가능 가능 가능 가능
적정 멤버 쓰기 가능 불가능 가능 가능
특징 보편적인 메서드 멤버 쓰기 방지가 목적 C의 전역함수와 유사 상속 관계에서 의미
    • 상수형 메서드
      • 멤버 변수에 읽기 접근은 가능하지만 쓰기는 허용하지 않은 메서드
      • ex) int GetData() const { ~ } // 이렇게 함수의 원형 뒤에 const 만 선언해 주면 된다
    • 상수형 메서드의 예외사항
      • 상수화 된 메서드 로도 멤버변수에 접근할 수 있게 맴버변수 선언을 해준다
        • mutable int m_nData = 0; // mutable 선언으로 GetData
      • 상수형 참조를 일반 참조로 형변환 한다
        • const int &nParam 으로 입력받은 것을 int &nParam 으로 변경시킴
        • int &nNewParam = const_cast<int &>(nParam);
        • [ const_cast<새형식> (대상) ]
    • 멤버 함수 다중정의
      • 메서드 또한 다중정의 될 수 있다
      • 다중정의시 잘못된 실 인수가 들어오면 delete 로 과감히 삭제하자
        • ex) void GetIntData(double dParam) = delete; // double 형 실인수가 들어오면 소멸자 실행
    • 정적멤버
      • 정적 변수는 전역변수나 함수와 마찬가지, this 포인터 사용 불가
      • static 예약어로 사용 ex) static int GetCount(); / static int m_nCount; / int CTest::m_nCount = 0;
      • 이때 정적변수는 반드시 선언과 정의를 분리해야 한다
        • 원래 CTest a(5) 선언 후 a.GetCount(); 로 선언해야 하지만 그냥 GetCount(); 로 정적 멤버에 접근 가능하다

연습문제

1. 클래스 접근 제어 지시자 중에 private 이 의미하는 것은 무엇인가? = 외부, 상속 클래서에서 접근 불가

2. 클래스 인스턴스가 생성될 때 자동으로 호출되는 함수와 그 함수의 원형의 가장 큰 특징은? = 생성자, 반환형이 없다

3. 다음 코드에서 m_nData(nParam) 이 속한 부분을 무엇이라 부르는지 답하시오 = 초기화 목록

CTest(int nParam)

    : m_nData(nPatam) // 초기화 목록

{ ~ }

4. 다음 코드에서 잘못된 점과 개선방법 = 참조형 변수를 초기화 할때는 초기화 목록으로 초기화 해야 한다 CRefTest(int &rPatam) : m_nData(rParam) { ~ }

5. 메서드 함수 내부에서 실제 클래스 인스턴스의 주소를 가리키는 포인터는? = this

6. 상수형 메서드에서 할 수 없는 일은 무엇인지 답하세요 = 멤버변수 쓰기(읽기는 허용)

7. 정적 멤버에서는 '이것'을 사용할 수 없다. 이것은? = this 포인터

'IT공부 > 이것이 C++이다' 카테고리의 다른 글

객체의 관계 규정과 설계_1  (0) 2022.03.16
객체지향 프로그래밍_2  (0) 2022.03.12
C에서 C++ 문법 전환하기_2  (0) 2022.03.09
C 에서 C++로 문법 전환하기_1  (0) 2022.03.07

+ Recent posts