C++ 클래스 이해

C++/C++ 문법 2019. 11. 23. 12:00
728x90

이제부터 본격적인 C++ 학습을 하게 되는 것인가 싶다.


구조체는 하나의 구조로 묶을 수 있는 데이터(변수들)의 집합이었다면, Class는 변수 뿐만 아니라 함수까지 포함시킬 수 있다고 해서 구조체의 확장된 버전이라고 설명한다.

struct 에서는 기본이 public 접근 권한인데,

Class에서는 접근을 제한할 수 있는 접근 제어 지시자 public, private, protected 가 추가되었다.

ㅇ 접근 제어 지시자는 객체 지향 프로그래밍의 특징 중 하나인 정보 은닉을 위한 키워드이다.

ㅇ public 영역은 모든 객체에서 접근할 수 있지만,

ㅇ private 영역은 해당 객체 내의 멤버 변수나 멤버 함수만이 접근할 수 있다.

ㅇ 클래스의 기본 접근 제어 권한은 private로 설정되어 있어, private 접근 제어 지시자는 생략할 수 있다.

ㅇ protected 접근 제어 지시자인 경우

    - protected 멤버는 파생 클래스에 대해서는 public 멤버처럼 취급되며,

    - 외부에서는 private 멤버처럼 취급된다.

생성자, 소멸자, 상속의 개념이 추가되었다.

ㅇ 생성자 : 객체가 생성될 때, 자동으로 호출되는 함수로써 객체를 초기화하는 함수이다.

ㅇ 소멸자 : 생성된 객체가 메모리 해제가 될 때 자동으로 호출되는 함수다.

ㅇ 생성자/소멸자는 public 속성을 가진다.

ㅇ 생성자는 클래스명과 같은 이름을 가지며, 매개변수를 가질 수 있다.

ㅇ 소멸자는 생성자와 동일하게 클래스명과 같은 이름의 함수이며, 생성자와 구분하기 위해 ~를 소멸자 앞에 붙인다.


클래스와 멤버
클래스 안에는 변수와 함수를 선언 할수 있다.
클래스 내의 변수를 멤버변수라고 한다.
클래스 내의 함수는 메서드 또는 멤버함수라고 한다.


클래스 선언
클래스 선언에는 class라는 키워드가 쓰이고, 중괄호를 사용하여 시작과 끝을 표시한다.
그리고 닫는 중괄호에는 꼭 세미콜론으로 끝내야 한다.
class Person {
    string name;   //멤버변수
    int age;       //멤버변수
    double height; //멤버변수

public: // 접근제어 지시자
    void SetPerson(string _name, int _age, double _height); // 멤버함수
    void showPerson(); // 멤버함수
};



예제 1

#include <iostream>
#include <string>
using namespace std;

// Person 클래스 선언
class Person {
//private: // 접근 제어 지시자 (private는 클래스 외부에서 접근 불가, private 접근 제어 지시자는 생략 가능)
    string name;
    int age;
    double height;

public:
    void SetPerson(string _name, int _age, double _height);
    void showPerson();

    Person() { // default 생성자
        cout << "=== 생성자 호출 : 인자값 없음 ===" << endl;
        age = 30;
        name = "홍길동";
        height = 170;
    }


   // 3개의 매개변수가 있는 생성자
    Person(string _name, int _age, double _height) { // 생성자 오버로딩(overloading)
        cout << "=== 생성자 호출 : 인자값 3개 ===" << endl;
        this->name = _name;
        this->age = _age;
        this->height = _height;
    }

    ~Person(){ // 소멸자
        cout << "=== 소멸자 호출 : 인자값 없음 ===" << endl;
    }

}; //세미콜론 필수

void Person::SetPerson(string _name, int _age, double _height) {
    this->name = _name;
    this->age = _age;
    this->height = _height;
}

void Person::showPerson() {
    cout << "성명 : " << name << endl;
    cout << "나이 : " << age << endl;
    cout << "키 : " << height << endl;
    cout << "나의 주소 : " << this << endl;
}

int main() {
    cout << endl << "=== main 함수 시작 ===" << endl;

    Person p = Person(); // 기본 생성자 사용 (1. 메모리 할당, 2. 메모리할당이 성공한 경우 객체의 생성자의 호출)
    p.showPerson();
    cout << "p의 주소 : " << &p << endl << endl;
   
    //Person p2("이순신", 41, 188); // 오버로딩 된 생성자 사용 (생성자 생성시 객체 전달)
    Person p2 = Person("이순신", 41, 188); // Person p2("이순신", 41, 188); 와 동일
    p2.showPerson();
    cout << "p2의 주소 : " << &p2 << endl << endl;
   
    p.SetPerson("김구", 48, 178); // 객체의 값을 변경
    p.showPerson();
    cout << "p의 주소 : " << &p << endl << endl;

    cout << "=== main 함수 종료 ===" << endl;
} 


this 는 객체 자신을 가리키는 포인터로 현 객체의 메모리 주소를 나타낸다.

따로 선언할 필요없이 객체가 생성되면 생성된 객체는 this 포인터를 가진다.


변수 p 의 주소값과 변수 p2의 주소값과 this 주소값을 서로 비교해볼 수 있도록 했으며, 실행순서를 알 수 있도록 출력문(cout)을 추가했다.



생성자 표기법

    Person() { // default 생성자
        cout << "=== 생성자 호출 : 인자값 없음 ===" << endl;
        age = 30;
        name = "홍길동";
        height = 170;
    }


   // 3개의 매개변수가 있는 생성자
    Person(string _name, int _age, double _height) { // 생성자 오버로딩(overloading)
        cout << "=== 생성자 호출 : 인자값 3개 ===" << endl;
        this->name = _name;
        this->age = _age;
        this->height = _height;
    }

    // default 생성자
    Person() : name("홍길동"), age(30), height(170) {
        cout << "=== 생성자 호출 : 인자값 없음 ===" << endl;
    }

    // 생성자 오버로딩(overloading)
    Person(string _name, int _age, double _height) : name(_name),age(_age), height(_height) {
        cout << "=== 생성자 호출 : 인자값 3개 ===" << endl;
    }

cout 출력줄을 없애면 생성자를 한줄로 표시할 수 있다.



변수 p 는 실제 존재하는 객체를 가리키는 참조자일 뿐이다.


객체지향에 대한 개념을 제대로 이해하고 싶다면, C#/유니티 기준으로 설명하는 클래스와 오브젝트 한방에 이해하기 동영상  https://www.youtube.com/watch?v=GwL5uUP7F1Y 를 강추한다.


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

C++ 연산자 오버로딩  (0) 2019.11.26
C++ static  (0) 2019.11.25
C++ namespace(네임스페이스)  (0) 2019.11.22
C++ 오버로딩  (0) 2019.11.22
C++ 참조 변수(reference)  (0) 2019.11.22
블로그 이미지

Link2Me

,