Chapter.3 클래스
- 객체지향 프로그래밍 개요
- 객체란 변수들과 그와 관련된 메서드들이 모여서 이룬 하나의 꾸러미! ( 객체 = 동작이나 상태를 나타내는 단위 )
- 클래스란 C의 구조체에서 확장된 변수, 함수를 포함한 하나의 틀 이다 ( 클래스 = 찍어내기 위한 틀 )
- 인터페이스 함수 : 내부로 직접 접근 못하는 사용자를 대신하여 내부안에서 기능을 수행하게 해주는 함수
- 클래스의 기본 문법
- 클래스의 기본 형태
- class 클래스 이름 {
- 접근제어 지시자: // public, private, protected
- 맴버변수 선언;
- 맴버함수 선언 및 정의;
- };
- 맴버 선언 및 정의
- 클래스는 '생성자'를 이용해 초기화 할 수 있음! - 생성자의 특징
- 반환하는 자료형이 없다
- 호출하는 함수가 아니라 적절한 시기에 자동으로 호출되는 함수
- '사용자가 객체를 선언하면 자동으로 호출됨!' -> 따라서 맴버가 자동으로 초기화 가능
- 선언법 // 클래스와 같은 이름의 함수를 선언 해주면 됨
- class Ctest {
- public:
- Ctest() { ~ }
- }
- 생성자 사용시 초기화 목록 이용하는 법 -> 생성자 선언 뒤 콜론: 입력후 변수(값) 의 형태로 입력한다
- class CTest {
- public:
- CTest() : m_nData(10), m_nData2(20) { ~ }
- }
- 클래스는 '생성자'를 이용해 초기화 할 수 있음! - 생성자의 특징
- 접근제어 지시자
- 클래스의 특정 요소에 사용자가 접근할 수 없게 하기 위해 활용한다
- public : 멤버에 관한 모든 외부 접근이 허용됩니다
- protected : 멤버에 관한 모든 외부 접근이 차단됩니다 단 상속 관계가 있는 파생 클래스에선 접근 허용
- 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 |