C-language

c++ 클래스란 무엇일까

전자둥이 2021. 1. 24. 16:00
반응형

일반적으로 c++의 클래스는 구조체 보다 더 효과적인 문법입니다. 구조체와 클래스는 거의 흡사하게 동작하지만, 클래스에는 내부적으로 '함수' 등을 포함할 수 있습니다.

 

 또한 클래스는 상속 등의 개념을 프로그래밍에서 그대로 이용할 수 있다는 점에서 객체 재향 프로그래밍을 가능하도록 해주는 기본적인 단위입니다.

 

여기서 상속이라는게 무엇일까요? 저희가 아는 상속이라는 의미와 일맥상통하다고 생각하시면 될 거 같아요! 

 

그럼 구조체와 클래스의 차이점을 코드를 통해 알아볼까요

구조체

------------------------------------------------------

#include <iostream>

#include <string>

 

using namespace std;

 

 struct Person {

    string name;

    int age;

};

 

int main(){

    struct Person a;

    a.name = "김동빈";

    a.age = 20;

    cout << a.name << ":" <<a.age << "살\n";

}

------------------------------------------------------

클래스

------------------------------------------------------

#include <iostream>

#include <string>

 

using namespace std;

 

class Person{

private:

    string name;

    int age;

public:

    Person(string n, int m) { name = n; age = m;}

    void show() {cout << name << " : " << age << "살\n"; }

};

----------------------------------------------------------

이상으로 구조체와 클래스의 형태의 차이점을 살펴보았고요!

 

그럼 c++의 클래스의 특징을 살펴보겠습니다.

첫 번째로 멤버(Member)라고 불리는 놈이 있는데요.

 

이 멤버 변수를 속성, 혹은 프로퍼티(property)라고도 부릅니다.

그리고 멤버 함수를 메서드(Method)라고도 부릅니다.

좀 더 이해하기 쉽게 코드를 통해서 살펴보죠

----------------------------------------------------------------

class Person {

private:

    string name;

    int age;

public:

    Person(string n, int s) { name = n; age = a;}

    void show() {cout << name << " : " << age << "살\n";}

};

--------------------------------------------------------------------

여기서 사람은 여러 가지 특징들로 나타낼 수 있겠죠 나이, 이름, 사는 곳 등등,,,

그중에서 이 코드상에는 이름과 나이를 멤버 변수로 설정한 것이고 멤버 함수로는 Person과 show()가 있는 거죠!

 

두 번째로 인스턴스라는 놈도 있습니다.

c++에서는 클래스를 활용해 만든 변수를 인스턴스(Instance)라고 합니다. 실제로 프로그램 상에서 객체가 살아서 동작하도록 해줍니다. 그리고 하나의 클래스에서 여러 개의 서로 다른 인스턴스를 만들 수 있습니다. 이번에도 역시 코드에서 살펴보도록 하죠

---------------------------------------------------------------------

int main(){

    Person a = Person("김동빈", 20};

    a.show();

}

--------------------------------------------------------------------

여기서 a라는 변수가 인스턴스라고 불리는 거죠. 그리고 a 뿐만 아니라 다음과 같은 형태로 다른 여러 개의 변수를 만들 수 있는 겁니다.

 

세 번째로는 접근 한정자라는 놈도 있습니다. 이렇게만 보면 클래스가 엄청 복잡한 거처럼 보이지만 막상 살펴보면 크게 복잡하지 않으니 걱정 마세요!

 

public: 클래스, 멤버 등을 외부로 공개합니다. 해당 객체를 사용하는 어떤 곳에서도 접근할 수 있습니다.

private: 클래스, 멤버 등을 내부에서만 활용합니다. 외부에서는 해당 객체에 접근할 수 없습니다.

 

클래스는 기본적으로 멤버를 private형태로 간주합니다. 반대로 구조체는 기본적으로 멤버를 public으로 간주합니다. 따라서 클래스에서 private부분을 제외하면 멤버는 자동으로 private문법을 따르게 됩니다. 그래서 c언어에서 구조체를 사용했을 때 외부에서 쉽게 접근할 수 있었던 것입니다.

이렇게 글로만 읽게 되면 감이 잘 안 올 수도 있습니다.

 

따라서 이번에도 코드에서 살펴보도록 하겠습니다.

---------------------------------------------------------------------

#include <iostream>

#include <string>

 

using namespace std;

 

class Person {

private:

    string name;

    int age;

    string residence;

    int getAge() {return age;} // 정보 은닉

public:

    Person(string n, int e, string h){

        name = n;

        age = e;

        residence = h;

    }

    void show() {cout << name << "사는 곳:" << residence << "나이: " << getAge() << endl; }

};

int main(){

    Person a = Person("김동빈",20, "서울"); //변수 a로 인스턴스

    a.show();  // 동작함

    cout << a.getAge(); //에러 발생 getAge는 private이므로 외부에서 접근 불가

}

---------------------------------------------------------------

마지막으로 this 포인터라는 놈도 있습니다.

 기보적으로 하나의 클래스에서 생성된 인스턴스는 서로 독립된 메모리 영역에 멤버 변수가 저장되고, 관리됩니다. 다만 멤버 함수는 모든 인스턴스가 공유한다는 점에서, 함수 내에서 인스턴스를 구분할 필요가 있습니다.

c++의 this 포인터는 포인터 자료형으로, '상수'라는 점에서 값을 변경할 수 없습니다.

이번에도 역시 좀 더 쉽게 이해하기 위해서 코드에서 살펴보겠습니다.

----------------------------------------------------

class Person {

private:

    string name;

    int age;

    string residence;

    int getAge() {return age;} // 정보 은닉

public:

    Person(string name, int age, string residence){

        this->name = name; // 앞서서 class에서는 name, int, residence의 매개변수 이름이 멤버 변수와 달라서 구분되어 문제가 없었지만 다음과 같이 멤버 변수와 매개변수의 이름이 같을 경우에는 구분이 안되기 때문에 this포인터를 사용하여 구분해줘야 합니다.

        this->age = age;

        this->residence = residence;

    }

    void show() {cout << name << "사는 곳:" << residence << "나이: " << getAge() << endl; }

};

------------------------------------------------------------------

 

이상으로 c++클래스에 대해서 살펴보았습니다. 지금까지 포스팅을 봐주셔서 감사합니다!

반응형