상세 컨텐츠

본문 제목

[C++] 클래스(Class)

C++ 문법

by simstealer 2022. 5. 30. 17:57

본문

○클래스

C++에서 클래스를 클래스 타입으로 구분한다.

class A
{
    // 클래스 내부에서 선언된 식별자는 클래스 범위(Class Scope)를 가진다.
    int     _data;
    double _data2;
 
    // 멤버로는 함수도 가질 수 있다.
    void foo();
};

//이 전처럼 struct와 같은 키워드를 작성하지 않아도 된다.
A a;
// a를 A에 대한 인스턴스라고 한다.

// 메모리에 표현되는 것은 C의 구조체의 그것과 같다.
// [ _data(4) ][ padding(4) ][ _data2(8) ]

Scope - cppreference.com - 클래스 범위

 

접근 지정자

- 접근 지정자에는 public(struct의 기본), private, protected가 있다.

 

// class의 기본 접근 지정자는 private이다.
class A
{
    // 이 아래는 private 영역이다.
    // private은 클래스 외부에서 접근할 수 없다.
    int _privateData;
 
    // 이 아래는 public 영역이다.
    // public은 클래스 외부에서 접근할 수 있다.
public:
    int PublicData;
};
 
A a;
 
a._privateData; // 컴파일 오류, 접근 불가능
a.PublicData; // 접근 가능

○기본 합성 메소드

- 클래스 타입이 기본적으로 갖고 있는 메소드.

- 기본 생성자와 기본 소멸자가 있다.

 

기본 생성자 - 생성자를 정의해주지 않아도 자동으로 컴파일러에 의해 만들어진다.

class A
{
public:
    // 반환타입을 갖지 않고, 타입의 이름과 동일하게 식별자를 사용한다.
    // 매개변수가 없는 생성자를 기본 생성자라고 한다.
    A()
     : _data(0) // 이 부분은 멤버 초기화 목록(Member Initializer List)이라고 한다.
    {
        _data = 10; // 여기는 초기화가 아니라 '할당'이다.
    }
 
private:
    int _data;
};
 
A a;   // 변수로 정의
A b(); // 함수 선언

복사 생성자 -  말 그대로 다른 인스턴스의 데이터를 완전히 복사하는 것이다.

class A
{
public:
    A(int data)
     : _data(data) { }
     
    A(const A& other)
     : _data(other._data) { }
 
private:
    int _data;
};
 
A a(10);
A a2(a); // 복사 생성자 호출 a2._data는 a._data와 동일하다.

기본 소멸자 - 객체의 수명이 다할 때, 자동으로 호출되어 자원을 정리하기 위해 사용된다.

class A
{
public:
    A() : _p(malloc(sizeof(int) * 3)) { }
   
    // 소멸자도 생성자와 마찬가지로 반환 타입이 없으며
    // 식별자는 타입 이름 앞에 ~를 붙이고
    // 아무런 매개변수도 적지 않는다.
    // 보통 이와 같이 자원을 정리할 때 사용한다.
    ~A() { free(_p); _p = nullptr; }
private:
    int*    _p;
};
 
{
    A a;
} // 이 부분에서 a.~A(); 가 호출된다.

 

'C++ 문법' 카테고리의 다른 글

[C++] explicit  (0) 2022.05.31
[C++] 오버로딩(OverLoadding)  (0) 2022.05.31
[C++] 레퍼런스(Reference)  (0) 2022.05.30
[C++] 객체 지향 프로그래밍이란?  (0) 2022.05.30
[C++] 별 찍기  (0) 2022.04.20

관련글 더보기

댓글 영역