언어 자료구조 알고리즘/Escort C++

[C++] 2.2.1 접근 지정자

언제나휴일 2016. 4. 15. 12:49
반응형

 2.2.1 접근 지정자

 

  C언어의 구조체는 모든 곳에서 모든 멤버를 접근할 수 있습니다. 이러한 특징으로 인해 잘 정의된 함수를 이용하여 구현하기로 약속하였음에도 불구하고 직접 멤버를 사용하는 경우가 발생합니다. 예를들어 학생 구조체에 멤버 변수 iq가 있고 공부를 하면 특정 범위까지 iq가 올라가게 프로그래밍을 한다고 가정합시다. 이를 위해 다음과 같이 Stu.h Stu.c에 학생 구조체를 정의하고 학생이 공부하는 함수를 정의를 하였습니다.

 

Stu.h - Stu iq가 최대 200까지 올라갈 수 있음

typedef struct Stu   Stu;

#pragma once

#include <malloc.h>

#define MAX_IQ     200

#define DEF_IQ      100

struct Stu

{

    int iq;

    int num;

};

void Study(Stu *stu,int tcnt);

 

Stu.c - Study 함수에서 tcnt만큼 iq를 증가시킴. , 최대 IQ를 벗어날 수 없게 작성하였음

#include "Stu.h"

void Study(Stu *stu,int tcnt)

{

    stu->iq += tcnt;

    if(stu->iq > MAX_IQ)

    {

        stu->iq = MAX_IQ;

    }

}

  

 이 경우에 학생을 사용하는 곳에서 Study함수를 이용한다면 학생의 iq는 최대값을 벗어나지 않습니다. 하지만 사용하는 곳에서는 학생의 iq를 직접 접근할 수 있기 때문에 제공하는 Study함수를 이용하지 않고 직접 iq를 변경할 수도 있습니다. 다음은 Study함수를 사용하지 않고 직접 iq를 변경하는 예제 코드입니다. 결국 버그가 있는 프로그램을 만든 것입니다.

 

Program.c - Stu의 멤버 필드 iq를 직접 변경함. 최대 값을 벗어나는 버그 발생!!!

#include "Stu.h"

void main()

{

    Stu stu={1,100};

    stu->iq += 200;

}

 

 C++언어에서는 멤버들에 대한 접근 지정을 설정할 수 있습니다. 접근 지정자를 통해 직접 접근을 허용할 멤버와 허용하지 않을 멤버를 구분함으로써 신뢰성을 높이게 됩니다.

 

 다음의 예를 보면 Stu클래스 내에 iq의 접근성은 디폴트로 하고 나머지 멤버는 public으로 지정하였습니다. 클래스의 경우 디폴트 접근성은 private이기 때문에 iq의 접근성은 private이 되어 Stu 클래스내에서만 접근이 가능하고 다른 곳에서는 접근할 수가 없게 됩니다.

 

Stu.h - 멤버 필드 iq의 접근성을 private로 설정하고 Study 메서드의 접근성을 public으로 설정

#pragma once

#define MAX_IQ    200

#define DEF_IQ     100

class Stu

{

    int num;

    int iq;

public:

    Stu(int _num);

    void Study(int tcnt);

    ~Stu(void);

};

  

Stu.cpp - Study 메서드에서 공부한 시간만큼 iq를 증가. , 최대 IQ를 벗어나지 못하게 구현

#include "Stu.h"

Stu::Stu(int _num)

{

    num = _num;

    iq = DEF_IQ;

}

void Stu::Study(int tcnt)

{

    iq += tcnt;

    if(iq>MAX_IQ)

    {

        iq = MAX_IQ;

    }

}

Stu::~Stu(void)

{

}

 

Program.cpp - 사용자가 가시성이 없는 iq에 직접 대입하는 코드를 작성함.

#include "Stu.h"

void main()

{

    Stu *stu = new Stu(10);

    stu->iq += 200;

    delete stu;

}

  

 C++에서는 이와 같이 액세스 지정자를 무시하고 접근하였을 때 오류를 발생시킴으로써 신뢰성없는 코드를 수정하도록 도와줍니다.


private 접근 지정한 멤버에 접근할 때 오류

[그림 2.1]

 

 [그림 2.1]과 같이 Stu형식이 아닌 main함수에서 private으로 접근 지정된 멤버에 접근하려고 하면 컴파일 오류가 발생합니다. 물론 어떤 멤버를 private으로 지정하고 어떤 멤버를 public으로 지정해야 할 것인지에 대한 결정은 모두 개발자의 몫입니다. 습관적으로 멤버 필드는 private으로 접근 지정하고 이에 대한 값을 얻어오거나 설정, 변경이 필요한 경우에는 멤버 메서드를 정의하여 해당 메서드의 접근 지정을 필요한 수준으로 지정한다면 보다 신뢰성있는 프로그램을 작성할 수 있을 것입니다.

 

 그리고 C++에서 지정할 수 있는 접근 지정자는 public, protected, private이 있습니다. 여러분이 알고 있듯이 public은 모든 곳에서 접근이 가능하며 private은 해당 형식에서만 접근이 가능합니다. protected는 해당 형식과  파생된 형식에서 접근이 가능합니다. 이에 대한 부분은 일반화 관계에 대한 주제를 다루면서 자연스럽게 얘기가 나오므로 여기서는 설명을 생략하도록 하겠습니다.


2장 캡슐화 Part1 

2장 캡슐화 Part2 

(모든 동영상 강의는 무료입니다.)

반응형

'언어 자료구조 알고리즘 > Escort C++' 카테고리의 다른 글

[C++] 상수화 멤버  (0) 2016.04.15
[C++] 개체의 멤버와 형식의 멤버  (0) 2016.04.15
[C++] 소멸자  (0) 2016.04.15
[C++] 생성자  (0) 2016.04.15
[C++] 2.2.1 멤버 메서드  (0) 2016.04.15
[C++] 2. 1 캡슐화란?  (2) 2016.04.15
[C++] namespace  (0) 2016.04.15
[C++] 매개 변수명이 없는 입력 매개 변수  (0) 2016.04.15
[C++] 디폴트 매개 변수  (0) 2016.04.15
[C++] 함수 중복 정의(function overloading)  (0) 2016.04.15