윈플

클래스는 객체를 사용하기 위한 틀.


[순서]
1. 클래스 정의
2. 클래스 생성 및 사용
3. 멤버함수 알아보기
4. 생성자, 소멸자

위 순서대로 진행하겠습니다.



1. 클래스 정의

이름과 키, 몸무게를 멤버변수로 가지고 있으며,
이름을 출력하는 멤버함수를 가지고 있는 '사람' 이라는 클래스를 정의하겠습니다.


class People
{
public:                                                       // 접근권한 설정 ( 정보은닉, 캡슐화 )
                                                                // public : 모두 허용 ( 접근 범위 제한 X )
                                                                // private, protected : 접근 범위 제한 O ( 자세한 설명은 나중에 따로 )
   
// 멤버변수
    string P_name;
    float P_tall;
    float P_weight;


    // 멤버함수
    void PrintOfName()
    {
         cout << "이름 : " << P_name << endl;
    }

};                                                // 반드시 class 선언 뒤에는 세미 클론(;)




2. 클래스의 생성 및 사용


int main()
{
           // 객체 생성
           // People 이라는 클래스(틀)로 One, Two라는 객체를 생성했다.


           People One, Two;
           
          // 객체 초기화하기. ( 다른 방법도 존재.. 생성자에서 다루겠습니다.)
          One.P_name = "한놈";
          One.P_tall = 180.4;
          One.P_weight = 68.5;

          // 멤버함수를 사용하여 출력
          One.PrintOfName();

          return 0;
}




3. 멤버함수 알아보기

: 멤버함수는 기본적으로 일반함수와 같지만 약간은 다르다. ( 클래스의 멤버이기 떄문에...)

1. 멤버함수를 호출하려면 객체의 이름을 명시해야한다.
2. 멤버함수 안에서는 객체의 이름을 명시하지 않아도 접근이 가능하다.
3. 멤버함수 안에서는 외부에서 접근을 거부한 멤버에도 접근이 가능하다.
( 외부에서는 볼 수 없는 멤버도 안에서는 볼 수 있다는 의미.  ---- 접근 제어와 관련 나중에 더! )


멤버함수를 선언하는 방식.
( 2번째 방식이 좀 더 깔끔하다. )
첫번째 방식
 
class People
{
public:                                                       
    
// 멤버변수
    .
    .
    .
    // 멤버함수
    void PrintOfName()
    {
         cout << "이름 : " << P_name << endl;
    }

};       


 
2번째 방식

class People
{
public:                                                       
    
// 멤버변수
    .
    .
    .
    // 멤버함수
    void PrintOfName();
};       
 
// 클래스명 :: 멤버함수명
void People::PrintOfName();
{
         cout << "이름 : " << P_name << endl;
}
  


4. 생성자, 소멸자 

생성자와 소멸자는 특별한 멤버 함수라고 생각하시면 됩니다.

생성자 : 객체 생성 시 자동으로 호출되는 함수.
소멸자 : 객체 소멸 시 자동으로 호출되는 함수.

-> 생성자 : 준비 , 소멸자 : 정리
: 동작할 수 있게 준비, 다 사용한 뒤 정리. 


생성자는 인자가 있냐 없냐로 구분합니다. ( 디폴트 생성자, 인자가 있는 생성자 )


class People
{
public:                                                       
    
// 멤버변수
    .
    .
    .
    // 멤버함수
    ...
    //생서자들
    //클래스명과 동일, 반환값이 없다.

    People();
    People(string name, float tall, float weight);  
 
};        

People::People()
{
     P_name="";
     P_tall = 0.0;
     P_weight = 0.0;


People::People (string name, float tall, float weight)
{
     P_name=name;
     P_tall = tall;
     P_weight = weight;
int main()
{
           // 객체 생성
           
People One;
           
          // 객체 초기화하기(직접)
          One.P_name = "한놈";
          One.P_tall = 180.4;
          One.P_weight = 68.5;

           // 객체 초기화하기(자동 - 디폴트 생성자).  
          People Two;          

           // 객체 초기화하기(인자가 있는 생성자)  
          People Three("세번째",160.5,55.4);

          return 0;



각 각 출력을 하면 

One은 직접 입력한데로
Two는 디폴트 생성자가 모두 0으로 초기화 했으므로 0
Three는 집어넣은 인자로 출력됩니다.


 
 


생성자를 사용해 초기화하거나 생성하면서 바로 집어넣는 방법도 사용 가능합니다.
그렇다면 위와 같이 사용하지 않을 때는 생성자가 필요없다?
보통 그렇지만, 꼭 생성자가 필요한 경우가 존재합니다.

const 속성을 가진 변수와 레퍼런스 변수를 가지고 있을 경우.
( 이 경우 반드시 변수들이 초기화가 되어있어야 하기 때문에 반드시 생성자로 생성시 자동으로 초기화를 해주어야 합니다. )


소멸자는 생성자의 이름 앞에 ~를 붙인 형태.
오직 하나만 존재 가능. 


별거 없는 클래스.

Comment +2