본문 바로가기

Stupid Computer/2. C 언어

C++ Class개념과 생성자 ! (예제)

출처  : http://ra2kstar.tistory.com/146

  클래스 (class)

OOP의 가장 핵심적인 개념인 클래스는 "구조체가 확장 된 것"이라 생각하면 된다. 

C에서 구조체는 타입이 다른 변수의 집합이라 보았다면, C++에서 클래스는 타입이 다른 변수의 집합뿐만 아니라, 함수까지 포함 된 것이다. 

선언 방법은 C의 구조체 선언문에서 struct 를 class로 바꾸면 되며, public 이나 private 와 같은 엑세스 지정자도 추가 할 수 있다. 


// People 클래스 선언

class People{

// 엑세스 지정자

private:

        int age;

        char* name;

        double height;

public:

// 함수도 포함이 가능하다

        void set_People(int _age , char* _name , double _height);

        void show_People();

}; //세미콜론은 까먹지 말고



  생성자 (Constructor)

클래스를 선언하게 되면 그 클래스는 메모리에 객체로써 자리를 잡게 된다. 그러나, 이 객체는 해당 메모리에 자리만 잡고 있을 뿐이지, 초기화는 되지 않으므로, 생성자를 통해서 초기화를 해줄 필요가 있다. 

기본적으로 객체를 선언하였다면, 객체를 이루는 변수들에 값을 대입함으로써 객체를 초기화 할 수 있지만, 객체가 생성될때 마다 값을 대입하는 행동은 귀찮고 비효율적이다. 

이런 비효율 적인 활동을 간단하게 해결 할 수 있게 하는 것이 바로 생성자이다. 

생성자는 스스로 자기 자신의 객체를 초기화 하는 방법을 정의하는 것으로써, 생성자의 이름은 항상 클래스명과 동일해야 한다. 또한 오버로딩을 통해서 인자값을 받을 수 있으나, 리턴값을 가질 수 없는것이 특징이다. 


생성자를 호출하는 방법은 다음과 같다. 

생성자명 객체명(인자값);

생성자명 객체명 = 생성자명(인자값); 


ex)

People peo(나이 , "이름" , 키);

People peo = People(나이, "이름" , 키);


class People{

private:

        int age;

        char* name;

        double height;

public:

        void set_People(int _age , char* _name , double _height);

        void show_People();


// 기본 생성자 

        People(){

                char* t = "naddru";

                cout << "=== 생성자 호출 : 인자값 없음 ===" << endl;

                age = 30;

                name = "naddru";

                height = 182;

        }

// 생성자 오버로딩 (인자값을 지정해줄 수 있다)

        People(int _age , char* _name , double _height){

                cout << "=== 생성자 호출 : 인자값 3개 ===" << endl;

                age = _age;

                name = _name;

                height = _height;

        }

};



  생성자 오버로딩

오버로딩과 오버라이딩 개념은 항상 헷갈리지만, 이 두 개념에 대한 정리는 다음으로 미룬다. 

일단 생성자에선 생성자 오버로딩이 가능하며, 이것을 통해서 인자값을 전달 할 수 있다. 


간단하게 함수를 재정의하는 것을 오버라이딩(Overriding) 이라하며, 이것은 기존의 함수가 행해왔던 활동을 다른 활동으로 변경하는 것을 의미한다. 또한 오버로딩(Overloading)은 기존의 함수에 인자값이 다른 함수를 중복 정의 하는 것이라고 보면 된다. 



다음은 기본 생성자와, 오버로딩을 통하여 인자값을 받는 생성자를 구성한 간단한 소스이다. 


  소스코드

#include <iostream>

using namespace std;


class People{

private:

        int age;

        char* name;

        double height;

public:

        void set_People(int _age , char* _name , double _height);

        void show_People();


        People(){

                char* t = "naddru";

                cout << "=== 생성자 호출 : 인자값 없음 ===" << endl;

                age = 30;

                name = "naddru";

                height = 182;

        }

        People(int _age , char* _name , double _height){

                cout << "=== 생성자 호출 : 인자값 3개 ===" << endl;

                age = _age;

                name = _name;

                height = _height;

        }

};


void People::set_People(int _age, char* _name , double _height){

        age = _age;

        name = _name;

        height = _height;

}

void People::show_People(){

        cout << "나이 : " << age << endl;

        cout << "이름 : " << name << endl;

        cout << "키 : " << height << "  이었으면 좋겠다. ㅎ "<<endl << endl;

}


int  main(){

// 기본 생성자 사용

        People p = People();

        p.show_People();


// 오버로딩 된 생성자 사용

        People p2(31 , "lina" , 168);

        p2.show_People();


//p 객체의 값을 변경 

        p.set_People(18 , "child" , 178);

        p.show_People();

        return 0;

}


  출력화면