본문 바로가기
Software/C++&MFC 핵심노트

[C++/MFC 핵심노트] Class (클래스) 접근범위 제한 - PART 2

by lovey25 2019. 1. 10.
반응형
클래스 두번째 파트입니다. 클래스에서 또하나 중요한 개념인 접근범위 제한에 대해서 정리해 보겠습니다.
클래스가 만들어지면 그 용도에 따라 다양한 형태로 사용될 수 있는데, 클래스를 설계한 사람이 어떻게 내부구조를 만드느냐에 따라 어떤 멤버는 클래스 내부에서만 사용가능하고 어떤 멤버는 외부에서도 바로 접근할 수 있도록 만들수도 있습니다. 
만약 이런 제한이 없다면 클래스는 단순히 코드의 가독성을 높여주기 위한 도구 정도에 불과할텐데, 클래스의 인터페이스를 클래스 설계자가 의도한 대로 제한함으로써 사용시 오류도 줄이고 코딩의 생산성도 높이는 효과를 얻을 수 있습니다.
(저는 그리 복잡한 코딩을 해본적인 없기 때문에 대부분 public으로 사용해서 크게 와닫는 부분은 없었습니다.)

클래스 접근범위 제한

지금부터 사용 범위를 한정해 주는 3가지 접근범위 제한에 대해서 알아보겠습니다.
클래스의 접근범위 제한에는 "public", "private", "protected"라는 속성이 있고 각 키워드 뒤에 콜론을 써서 접근 속정을 지정합니다. 3가지 속성을 요약해 보면 다음과 같습니다.

제한속성 3가지

public:

publilc은 말 그대로 해당 모든 멤버가 공개되어 있어 다른 클래스에서 이 멤버에게 접근을 할수 있는 상태를 말합니다. 접근뿐만 아니라 외부 클래스에서 변경도 가능한 모드입니다.

private:

private 속성의 멤버는 외부 클래스에서는 접근을 할수가 없습니다. 접근 속성을 지정하지 않게 되면 기본적으로 멤버들은 private 속성을 가지게 됩니다.

protected:

protected 속성은 private처럼 외부 클래스에서 접속을 하지 못하는건 같으나, 하위 상속 클래스에서는 접근을 할수 있는 상태를 만들어 줍니다.
 

Class의 Data Member에 접근하기

클래스의 멤버인 내부 데이터에 접근하는 방법에 대해서 알아보겠습니다.

public 속성 사용예제

public 속성의 멤버는 완전 공개된 상태이기 때문에 이전 포스팅에서 설명되었던 것처럼 점(.) 연산자를 통해 간단히 접근할 수 있습니다. ("[C++/MFC 핵심노트] Class (클래스) 정의,선언 - PART 1" 참고)

[실습코드 #1]

class Student
{
public:
int m_number;
CString m_name;
};

void CMyFirstProgramDlg::OnBnClickedButton1()
{
    // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
    
    // ↓↓↓ << 실습용 코드가 시작되는 위치 입니다. >> ↓↓↓
    // ------------------------------------------------------
Student A;
Student B;
A.m_number = _T("1");
A.m_name = _T("Jone");

B.m_number = _T("2");
B.m_name = _T("James");

list_result.AddString(A.m_number + _T(": ") + A.m_name);
list_result.AddString(B.m_number + _T(": ") + B.m_name);
    // ------------------------------------------------------
    // ↑↑↑ << 실습용 코드가 끝나는 위치 입니다. >> ↑↑↑
    
    UpdateData(FALSE);
}

private 속성 사용예제

private는 외부 접근을 제한하는 속성이기 때문에 내부에 값을 읽고 쓸수 있는 멤버함수를 통해서 접근하는 형태를 사용합니다.

[실습코드 #2]

class Student
{
private:
    CString m_number;
    CString m_name;

public:
    CString getNumber()
    {
        return m_number;
    }

    void setNumber(CString i)
    {
        m_number = i;
    }
};

void CMyFirstProgramDlg::OnBnClickedButton1()
{
    // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
    
    // ↓↓↓ << 실습용 코드가 시작되는 위치 입니다. >> ↓↓↓
    // ------------------------------------------------------
    Student A;
    
    A.setNumber(_T("1"));
    
    list_result.AddString(_T("지정 번호: ") + A.getNumber());
    // ------------------------------------------------------
    // ↑↑↑ << 실습용 코드가 끝나는 위치 입니다. >> ↑↑↑
    
    UpdateData(FALSE);
}
이번에는 멤버 변수들이 "private"속성으로 되어 있기 때문에 "public"의 경우처럼 "A.m_number"로 직접 멤버변수에 접근하려고 하면 컴파일 에러가 납니다. 그래서 "public"속성의 함수를 이용해서 클래스 내부에서 변수를 읽고 쓰도록 하였습니다.

protected 속성 사용법

"protected" 속성은 상속된 자식 클래스에서만 접근권한이 있기 때문에 자식클래서에서 "public"속성에 접근하듯 간단히 점(.) 연산자로 멤버접근을 하면 되겠습니다. 그리고 그 외 외부 클래스는 "protected"멤버에 접근권한이 없기 때문에 "private"와 마찬가지 방법을 사용하면 되겠습니다.
class Mother // 부모 클래스
{
protected:
    CString m_name;
    
public:
    Mother()
        :m_name(_T("Julia"))
    {     }

    CString getName()
    {
        return m_name;
    }
};

class Son : public Mother // 자식 클래스
{
public:
    CString getMotherName()
    {
        return m_name;
    }

};

void CMyFirstProgramDlg::OnBnClickedButton1()
{
    // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
    
    // ↓↓↓ << 실습용 코드가 시작되는 위치 입니다. >> ↓↓↓
    // ------------------------------------------------------
    Mother mother;
    Son son;
    
    list_result.AddString(_T("엄마가 알려주는 엄마 이름: ") + mother.getName());
    list_result.AddString(_T("아들이 알려주는 엄마 이름: ") + son.getMotherName());
    // ------------------------------------------------------
    // ↑↑↑ << 실습용 코드가 끝나는 위치 입니다. >> ↑↑↑
    
    UpdateData(FALSE);
}
클래스의 접근제한은 이정도로 마무리 하겠습니다.
 
PART 2 끝!
반응형

댓글