C++ 05 : 접근 지정자, 인라인 함수

728x90

C++ 05 : 접근 지정자, 인라인 함수

 

접근 지정자

클래스 내에 선언되는 private, public, protected를 가리킴.

 

주로 멤버 변수에 대한 접근을 어느 범위까지 허용할 것인지를 지정할 수 있다.

 

private (디폴트 값) : 동일한 클래스 내부에서만 접근을 허용

public : 클래스 내/외부 모두에서 접근을 허용

protected : 클래스 내부 및 상속받은 자식 클래스에 대해서도 접근 허용

 

이런 방식으로 다른 클래스나 객체에서 함부로 접근할 수 없도록 보호하는 것을 캡슐화라고 한다.

 

#include <iostream>
using namespace std;

class Abc {
    private:
        int a;
        void f();
        Abc();  // 생성자
    
    public:
        int b;
        Abc(int x);
        void g();
};

Abc::Abc() {
    a = 1;
    b = 1;
}
Abc::Abc(int x) {
    a = x;
    b = x;
}
void Abc::f() {
    a = 5;
    b = 5;
}
void Abc::g() {
    a = 6;
    b = 6;
}

int main() {
    Abc abc1;    // 에러 : private 멤버를 외부에서 접근
    Abc abc2(100);
    abc2 = 10;    // 에러 : private 멤버를 외부에서 접근
    abc2 = 20;
    abc2.f();    // 에러 : private 멤버를 외부에서 접근
    abc2.g();
}

 

*생성자를 private로 선언하면 한 클래스에서 오직 하나의 객체만 생성할 수 있게 된다.

 

 

인라인 함수

 

다음과 같은 코드는 odd(i)가 10000번이나 호출되면서 엄청난 오버헤드 시간이 소모가 된다.

(함수는 호출될 때마다 발생하는 일정량의 성능 오버헤드가 있기 때문)

x%2를 계산하는 시간보다 odd() 함수 호출에 따른 오버 헤드가 더 크며, 루프를 돌게 되면 오버헤드가 가중되는 문제가 발생한다.

#include <iostream>
using namespace std;

int odd(int x) {
    return (x%2);
}
int main() {
    int sum = 0;
    for (int i = 0; i <= 10000; i++) {
        if(odd(i))
            sum += i;
    }
    cout << sum;
}

 

인라인 함수는 이렇게 자주 호출되지만 함수의 코드가 짧을 경우에 시간 소모를 줄일 수 있는 방안이 된다.

인라인 함수로 호출하면 함수 호출에 따른 오버헤드가 존재하지 않으며, 프로그램 실행 속도가 개선된다.

함수가 호출이 함수 자체 내용 복사본으로 대체되기 때문이다.

#include <iostream>
using namespace std;

inline int odd(int x) { // 인라인 함수로 선언
    return (x%2);
}
int main() {
    int sum = 0;
    for (int i = 0; i <= 10000; i++) {
        if(odd(i))
            sum += i;
    }
    cout << sum;
}

 

 

(코드로 입력한 메인 함수)

int main() {
    int sum = 0;
    for (int i = 0; i <= 10000; i++) {
        if(odd(i))  // 함수 호출 부분
            sum += i;
    }
    cout << sum;
}

 

(컴파일러가 자체적으로 함수 내용을 대체한 코드. 함수를 인라인 함수로 처리하기 때문에 오버헤드 문제가 해결된다.)

int main() {
    int sum = 0;
    for (int i = 0; i <= 10000; i++) {
        if(i%2)  // 컴파일러가 확장시킨 코드
            sum += i;
    }
    cout << sum;
}

 

 

인라인 함수를 사용하면 프로그램의 실행 시간이 빨라진다는 장점이 있으나, 컴파일된 전체 코드의 크기가 증가하기 때문에 함수의 내부 코드가 짧은 함수에 적합하다. 

 

만약 클래스의 선언부에 함수를 구현했다면 inline으로 함수를 선언하지 않아도 컴파일러에 의해 자동으로 인라인 처리가 된다. 생성자를 포함한 모든 함수가 자동 인라인 함수로 기능할 수 있다.

 

요즘 컴파일러는 자기가 알아서 성능이 향상될 것으로 예상되는 함수를 자동 인라인화 하기 때문에 inline 키워드를 사용할 필요가 없다고 한다.

728x90