티스토리 뷰

C,C++

C/C++ : 클래스(class)의 개념

Andrew Shin 2016. 4. 11. 21:00

본 자료는 숭실대학교 정보통신전자공학부 소속 소모임 BlindC에서 2학년을 대상으로 하는 C++ 스터디 진행을 위하여 작성합니다.

개인의 소중한 창작물이기 때문에 자료의 열람은 자유이고, 소스코드를 긁어갈 수 있도록 우클릭제한이나 기타 제한은 걸어놓지 않았으나, 외부 공개나, 2차 수정등은 자제해주시길 부탁드립니다.


C++ 클래스(class)의 개념


C에서 C++로 넘어오게 되면서 새로이 배우게 되는 문법중 가장 중요하고 핵심적인 문법이 바로 클래스입니다. 나머지는 이제 클래스에서 사용하는 콜론 초기화, 접근 제한자, 상속등 클래스를 알고 있어야만 이해할 수 있는 내용들이죠. 오늘은 클래스의 기본 개념에 대해서 살펴보도록 하겠습니다.


이전에 올렸던 구조체(struct)의 개념을 참고하시면 이해에 도움이 될 수 있습니다.

C/C++ : 구조체(struct)의 개념 http://andrew0409.tistory.com/150


지난 구조체 포스팅에서 클래스를 이해하기 위해서 구조체를 먼저 이해하는것이 도움이 될 것이라고 이야기 한 적이 있습니다.  왜냐하면 구조체가 확장된 버전이 클래스이기 때문이죠.

구조체와 다른점을 먼저 짚고 넘어가자면, 구조체는 하나의 구조로 묶일수 있는 데이터, 즉 변수들의 집합이었다면 ex) 사람(이름,나이,성별) 클래스는 변수뿐만 아니라 함수까지 포함시킬수 있다는 점 입니다. 그 외, 생성자와 소멸자, 접근 제한자까지 이 시간을 통해서 알아보도록 하겠습니다.


먼저 혹시나 클래스 작성이 생소하신 분들을 위해서 클래스 생성에 대해서 설명할게요.



1. 솔루션 탐색기에서 소스파일 폴더에 오른쪽클릭 -> 추가 -> 클래스



2. 위와 같이 클래스 추가 창이 뜬것을 확인, 아무것도 입력하지 말고 추가버튼 클릭



3. 클래스 이름에 Person을 입력하면 바로 오른쪽에 헤더파일이름도 동일한 이름으로 저절로 써짐, 확인하고 마침



4. 완료된 모습 위와같이 Person.h와 Person.cpp가 생겼다. 다른 두개의 cpp파일은 신경쓰지 말길.. 과제하다가 스샷을 찍어서 ^^;;


이제 클래스 내부를 채워볼게요.


1
2
3
4
5
6
7
8
9
10
11
12
class Person
{
    private// 접근 제한자(비공개)
        char* m_name;
        int m_age;
        bool m_gender;
    public//접근 제한자(공개)
        Person(); // 디폴트 생성자
        ~Person(); //소멸자
        void SetPerson(char* name, int age, bool gender); //함수도 선언 가능
        void ShowPerson();
};
cs


Person.h 파일입니다.


가장먼저 접근 제한자에 대해서 간략하게 알아볼텐데, 데이터 캡슐화라는 개념이 필요합니다.

캡슐화에 대한 개념이 아직 정립되지 않으신 분은

데이터 캡슐화, 데이터 은닉 기법http://andrew0409.tistory.com/137

이 포스트를 먼저 보고 오시기 바랍니다.


자, 위 링크된 포스트에서 충분히 설명한대로 기존에 구조체에서 p1.m_age = 20; 과 같은 코드는 main 함수 내에서 사용할 수 없게 됩니다. 왜냐하면 private 영역안에 있기 때문이죠. 이유를 간략하게 다시 설명드리자면 데이터 영역을 보호하기 위해서 입니다. 그래서 데이터를 변경하기 위해서는 인터페이스 함수를 사용해야 하죠.

다시 말해서, private: 이하 영역은 외부에 노출되지 않는, 공개되지 않는 정보이기 때문에 외부에서 변경하거나, 참조할 수 없으며, 반대로 public: 이하 영역은 외부에서도 참조할 수 있기 때문에 이 public 영역안에 있는 함수를 이용하여 private 영역에 있는 데이터 변수를 바꾸곤 합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include "Person.h"
 
Person::Person()
{
}
 
Person::~Person()
{
}
 
void Person::SetPerson(char* name, int age, bool gender)
{
    this->m_name = name;
    this->m_age = age;
    this->m_gender = gender;
}
 
void Person::ShowPerson()
{
    printf("이름 : %s, 나이 : %d, 성별 : "this->m_name, this->m_age);
    if(this->m_gender == true)
        printf("남성\n");
    else
        pring("여성\n);
}
cs


Person.cpp 파일 입니다.

클래스를 작성할때 헤더파일과 cpp파일을 별도로 분리해서 작성하는것이 좋습니다.


총 4개의 함수에 대한 정의가 있습니다. 순서대로 생성자, 소멸자, Person 객체를 초기화시켜주는 SetPerson 함수, 데이터값을 화면에 출력해주는 ShowPerson 함수입니다.

생성자는 이 Person 객체가 생성될때, 자동적으로 사용되는 함수로서 아직 아무 기능도 정의하지 않았지만, main함수에서 Person p1; 과 같은 형태로 선언하여 생성한 순간에 자동으로 호출되는 함수입니다. 반대로 소멸자는 main함수에서 return을 하거나, 별도 로컬함수에 정의되어있으면 로컬함수가 끝나는 시점에서 생성된 객체가 없어지면서 자동으로 호출되는 함수입니다. 보통 소멸자에서는 메모리에 대한 정리를 합니다.


다음으로 SetPerson 함수 내부 내용자체는 평이해서 따로 설명할 필요가 없을 것 같습니다. 여기에서는 콜론 생성자와 this 포인터에 대해서 알아보도록 합시다.


먼저 생소한 코드가 있을것입니다. this-> 이렇게 써놓은 부분인데요. 사실 이 this를 사용한것과 사용하지 않은것은 차이가 전혀 없습니다.

this->m_name은 해당 클래스에 있는 멤버변수 m_name을 가리키는 것인데, 그냥 m_name이라고 입력해도 무방하다는 뜻이죠. 그런데 왜 썼을까요?

명시적으로 해당 클래스 내부에 있는 멤버변수임을 표시하기 위해서 입니다. 멤버변수의 이름과 전달인자로 넘어오는 파라미터의 이름이 같을 경우도 있기때문에 혼란을 피하기 위해서지요. 작명을 할때 멤버변수에 m_ 을 붙이는 이유도 마찬가지 입니다. 혼란은 최대한 피하고, 가독성을 높이는것이 좋은 코드라고 할 수 있습니다.


위에 있는 SetPerson 함수를 다음과 같이 작성할 수도 있습니다.


1
2
3
4
void Person::SetPerson(char* name, int age, bool gender)
    : m_name(name), m_age(age), m_gender)
{
}
cs


바로 콜론초기화를 이용한 것인데요. 콜론초기화를 이용하면 메모리를 절약하여 더 빠른 속도로 프로그램이 동작할 수 있게 됩니다.

사용방법은 중괄호가 시작되기 전에 ":" 콜론을 넣어주고 대입할 멤버변수(파라미터) 와 같은 식으로 사용하면 바로 멤버변수에 저장이 됩니다. 


아래는 main.cpp 코드


1
2
3
4
5
6
7
8
int main()
{
    Person p1;
    p1.SetPerson("홍길동",20,true);
    p1.ShowPerson();
 
    return 0;
}
cs


클래스를 이용해서 작성하니 main함수가 훨씬 깔끔해 지는 것을 느낄 수 있습니다.


접근 제한자와 인터페이스 함수, 콜론초기화에 대해서 간단하게 배워봤습니다. 생성자와 소멸자에 대해서는 다음 포스팅을 통해서 조금더 자세하게 배워보도록 하겠습니다.


도움이 되셨다면, 위 아래에 붙어있는 광고를 한번씩만 클릭해주세요! 작성자에게 큰 도움이 됩니다...

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함