접근 지정자
클래스 선언부를 보면 public: 를 적고 난 후 멤버 함수와 멤버 변수를 쓰는 것을 볼 수 있는데, 이는 외부와의 접근 가능한 범위를 지정해 줍니다.
- private : 클래스 내의 멤버 함수들에게만 접근 허용
기본 디폴드 값으로 아무 접근 지정을 하지 않은 경우 자동으로 설정됩니다. 객체가 클래스의 멤버함수에 접근할 수 없게 만듭니다.
따라서 오직 생성자를 통해서만 객체가 접근 가능합니다. 또한 외부에서 객체를 생성할 수 없게 할 때도 사용합니다.
- public : 클래스 내외 모든 함수 접근 허용
클래스 외부에 객체를 생성하기 위해서 선언해줘야 하는 접근 지정자입니다. 멤버 함수를 보호하지 못하지만, 외부에서 객체를 생성해야 할 경우 public으로 선언하지 않으면 컴파일 오류가 발생합니다.
- protected : 클래스 내의 멤버 함수와 클래스를 상속받는 멤버 함수 (상속은 8장에서 다룹니다.)
다음은 접근 지정자 public와 private로 작성된 클래스를 작성할 때 오류가 발생하는 코드입니다.
include <iostream>
using namespace std;
class access{
private:
int a;
void x();
access();
public:
int b;
void y();
access(int c);
};
access::access(){
a=1;
b=1;
}
access::access(int c){
a = c;
b = c;
}
void access::x(){
a=2;
b=2;
}
void access::y(){
a=3;
b=3;
}
int main(){
access result_a; // 컴파일 오류
access result_b;
result_a.a=10; // 컴파일 오류
result_b.b=10;
result_a.x(); // 컴파일 오류
result_b.y();
return 0;
}
오류를 찾는 방법은 간단합니다. 접근 지정자의 설정과 접근 방식을 보면 됩니다.
메인함수 외부의 함수들은 각각 클래스 access로 접근하므로 타당치만 메인 함수 내에서 클래스의 생성자가 아닌 객체로 멤버에 접근한 result_a.a, result_a.x(), result_b.b, result_b.y() 중 private로 설정된 result_a.a=10; 과 result_a.x();에서 오류가 발생합니다.
또한 클래스 외부에서 선언 했지만 private로 설정한 access result_b;에서도 컴파일 오류가 발생할 것입니다.
인라인 함수
함수를 호출하고 리턴 받을때 생기는 수행시간이 클 때를 사용합니다. 말 그대로 함수를 메인함수 내에서 실행하는 효과를 가집니다.
함수를 불러오고 리턴하는데 시간이 걸려봐야 얼마나 걸리냐고 생각할 수 있지만, 단순한 연산을 함수로 만든 경우 그 연산의 속도보다 함수를 불러오고 값을 받는데 시간이 더 걸릴 수 있습니다.
한 번이 아니라 함수를 많이 불러야 하는 경우 간단한 연산을 불필요한 수행시간 때문에 오래 걸리게 하는 비효율적인 코드가 돼버립니다.
보통 짧게 이루어진 코드가 이런 문제를 가지기에 함수 앞에 "inline" 키워드를 붙여주면 컴파일러가 함수의 크기나 효율을 따져 해당 함수를 메인함수 내에서 함수 호출 없이 사용할 수 있게 만들어 줍니다. (효율을 따지기에 inline 선언이 무시될 수 있습니다.)
inline int odd(x){ int main(){
return x%2; for(int i=0;i<10000<i++){
} if(i%2)
...
int main(){ }
for(int i=0;i<10000;i++){ return 0;
if(odd(i)) }
...
}
return 0;
}
왼쪽의 inline 함수가 오른쪽 main() 내의 구현으로 바뀐 것을 확인할 수 있습니다.
그럼 무조건 인라인 함수를 쓰는 것이 좋지 않나요?
물론 위의 코드처럼 짧은 코드와 적은 호출에 대해서 인라인 함수를 쓰면 프로그램의 수행시간이 줄어 실행 속도가 빠른 효율적인 코드가 되지만, 호출이 많다면 계속해서 메인 함수로 불러 들어야 하기 때문에 컴파일러가 읽어야 하는 코드자체의 크기가 커지는 단점이 있습니다.
마지막으로 생성자를 포함해 클래스의 모든 멤버 함수가 인라인으로 선언될 수 있습니다.
하지만 컴파일러는 클래스의 선언부에 구현된 멤버 함수들에 대해 inline 선언이 없어도 인라인 함수로 자동 처리하기에 무조건 인라인 키워드를 붙여 함수를 선언하지 않아도 됩니다.
'프로그래밍 > C++' 카테고리의 다른 글
[C++] 4장. #2 this 포인터와 string 클래스 (0) | 2023.12.08 |
---|---|
[C++] 4장. #1 객체 포인터와 객체 배열 (0) | 2023.12.04 |
[C++] 3장. #1 클래스와 객체 (0) | 2023.12.02 |
[C++] 2장. #2 입력 받기 (0) | 2023.11.30 |
[C++] 2장. #1 기본 요소 (0) | 2023.11.28 |