• 접근 지정

접근 지정자(access specifier)란?


객체 지향 언어에서는 객체를 캡슐화하고, 외부에서 접근 가능한 공개 멤버와 외부의 접근을 허용하지 않는 비공개 멤버를 구분한다.

C++ 에서는 3가지 멤버 접근 지정자가 있다.

1. private(비공개)

클래스 내의 멤버 함수만 접근 가능하다.


2. public(공개)

클래스 내외를 막론하고 프로그램의 모든 함수에게 접근을 허용한다.


3. protected(보호)

클래스 내의 멤버와 상속받은 파생 클래스에만 접근을 허용한다.

이는 추후에 상속을 다룰때 설명하도록 하겠다.


이전 페이지의 클래스 부분에서 말했듯이, 클래스(class)의 기본(default) 지정은 비공개(private)이다.


클래스의 멤버 변수에 대해서는 public은 지양하고 private로 선언하는것이 바람직하다. 데이터는 외부로부터 숨기고 보호하여야 하기 때문에 아무데서나 접근하게 하면 안된다. 아래의 코드를 보자.

class Circle{

public:

    int radius;

    Circle();

    Circle(int r);

    double getArea();

};


Circle::Circle(){

    radius = 1;

}


Circle::Circle(int r){

    radius = r;

}


int main(){

    Circle waffle;

    waffle.radius = 5;

}

class Circle{

private:

    int radius;

public:

    Circle();

    Circle(int r);

    double getArea();

};


Circle::Circle(){

    radius = 1;

}


Circle::Circle(int r){

    radius = r;

}

int main(){

    Circle waffle(5);         //생성자에서 radius 설정

    waffle.radius = 5;       //private 멤버 접근 불가

}

멤버 변수를 public으로 선언한 나쁜 사례이다.

노출된 멤버는 마음대로 접근이 가능헤 데이터를 바꿀 수 있다.

이는 보안상의 문제가 있을 수 있다. 

멤버 변수를 private로 선언한 바람직한 사례이다.

이때 클래스 외부에서 객체를 생성하기 위해서는 생성자를 public으로 선언해야한다. 생성자가 public으로 선언되어 있지 않다면 컴파일 오류가 발생할 수 있다.




  • 인라인 함수

함수 호출을 하면 다음과 같은 과정을 거친다.

만약 짧은 코드를 함수를 만들어 그 함수를 for문으로 여러번 실행시키면, 엄청난 시간적 손해가 발생해 프로그램 실행 시간이 길어지는 원인이 된다.

이러한 함수에 대해 오버헤드를 줄일 수 있으면 프로그램의 실행 속도를 개선할 수 있을 것이다.


인라인 함수란?

짧은 코드로 구성된 함수에 대해, 함수 호출 오버헤드로 인한 프로그램의 실행 속도 저하를 막기 위해 도입된 기능이다.

인라인 함수는 함수 앞에 inline 키워드를 이용하여 다음과 같이 선언한다.

inline int odd(int x){    //odd 함수를 인라인 함수로 선언

return (x%2);

}

다음과 같이 인라인 함수로 선언을 하면 컴파일러는 인라인 함수를 호출하는 곳에 인라인 함수의 코드를 그대로 삽입하여 함수 호출이 일어나지 않게 한다. 이렇게 되면, 함수 호출 오버헤드가 없어지기 때문에 실행속도가 빨라진다.

inline int odd(int x){

    return (x%2);


int main(){

    ...

    for(int i=0; i<10000; ++i){

        if(odd(i))

            sum += i;

    }

    ....

}

int main(){

    ...

    for(int i=0; i<10000; ++i){

        if(i%2)

            sum += i;

    }

    ....

}

odd(i)함수 코드 그대로 확장 삽입하게 된다.

 인라인 함수를 실제 실행 했을 때 수행되는 코드이다.

C++코딩을 하다보면 객체지향인 만큼 비교적 작은 함수를 많이 만드는데, 그럼 인라인 함수의 장단점은 무엇일까?

장점 : 실행속도를 향상시킨다.

단점 : 호출하는 곳이 여러 군데 있으면 그 만큼 전체 코드 길이가 늘어나는 단점이 있다. 그래서 가능한 작은 함수를 인라인으로 선언하는 것이 현명하다.


인라인 함수의 제약 사항 : 인라인 선언은 컴파일러에게 주는 요청이지 강제 명령이 아니므로 상황에 따라 무시될 수 있다. 그리고 재귀함수, static변수, 반복문, switch문, goto문 등을 가진 함수는 인라인 함수로 허용하지 않는다.



  • 구조체

C++에서는 C언어와 호환성을 위해 구조체(struct)를 지원한다. C++구조체는 표준 C 구조체에 기능을 확장하여 클래스와 동일한 구조와 기능을 가진다. C++ 구조체는 struct 키워드로 선언하며, 멤버 변수와 멤버 함수를 가지고, 접근 지정도 해야한다.

이 때 구조체의 디폴트 접근지정은 클래스와 다르게 public 이다. 이 것은 구조체와 클래스의 유일한 차이점이다. C언어와의 호환성을 위해, 모든 멤버들이 공개적인 C 구조체를 C++에서 수용하기 위해서이다.


그럼 구조체와 클래스 중 어떤것을 사용하는것이 더 좋을까?


클래스이다!

사실 별 차이는 없지만 C 언어적 사고의 탈피를 위해 구조체의 사용을 피하는 것이 좋다. 굳이 둘 다 사용하면서 혼란을 줄 필요는 없다.


구조체가 더 궁금하다면 C언어에서 찾아보기 바란다.



  • C++의 바람직한 코딩 방법


1. 클래스마다 선언부는 헤더파일에, 구현부는 cpp파일에 분리하여 작성한다.

2. main함수 등 함수나 전역변수는 한 개 이상의 cpp 파일에 나누어 작성한다.


3. 헤더파일이 여러번 중복 선언되는것을 피하기 위해 아래와 같이 조건 컴파일 문을 삽입한다.

#ifndef CIRCLE_H        //조건 컴파일문. Circle.h를 여러 번 include해도 문제 없기 위함.

#define CIRCLE_H


class Circle{

...

};


#endif                    //조건 컴파일문.




Posted by Jyoel :