인라인 함수(inline function) : 내부에서 작성된 코드의 속도와 함수의 장점을 결합
inline 키워드 -> 컴파일러에서 함수를 인라인 함수로 처리하도록 요청
목적 : c++프로그램의 실행 속도 향상
-> 짧은 코드의 함수 호출 오버헤드로 인한 실행 속도 저하 방지
=> c++에는 짧은 코드의 멤버 함수가 많기 때문
인라인 함수에 대한 처리
- 인라인 함수를 호출하는 곳에 인라인 함수 코드를 확장 삽입
-> 매크로와 유사 + 코드 확장 후 인라인 함수는 사라짐
- 인라인 함수 호출
-> 함수 호출에 따른 오버헤드 존재x
= 함수 호출이 함수 자체의 내용 복사본으로 대체되어 함수 오버헤드가 제거
=> 프로그램의 실행 속도 개선
- 컴파일러에 의해 이루어짐
* 제약사항
- inline은 컴파일러에게 주는 요구 메세지
- 컴파일러가 판단하여 inline 요구를 수용할 지 결정
- recursion(재귀함수), 긴 함수, static 변수, 반복문, switch문, goto문 등을 가진 함수는 수용x
함수가 클래스 정의 안에서 구현될 때 -> 자동적으로 인라인 함수가 됨
class A {
public :
A() {
// 어떤 작업 수행;
}
double f1() {
// 값 반환
}
double f2();
};
생성자와 함수f1은 자동적으로 인라인 함수가 되지만
함수 f2는 일반 함수가 됨
-> 함수 f2는 구현되지 않았기 때문에
클래스 구현 파일에서 인라인 함수 정의
// 인라인 함수 구현
inline double A::f2() {
// 값 반환
}
작은 크기의 함수를 호출하면 함수 실행 시간에 비해 호출을 위해 소요되는 부가적인 시간 오버헤드가 상대적으로 큼
+ 루프를 돌게 되면 오버헤드는 가중
-> 긴 함수보다는 짧은 함수를 인라인 함수로 하는 것이 좋음
=> 인라인 함수 코드의 삽입으로 컴파일된 전체 코드 크기 증가
- 데이터 필드 캡슐화(data field encapsulation)
: 속성에 대한 직접적인 수정을 피하기 위해서 접근지시자 private키워드를 사용하여 필드를 선언
-> 데어터가 함부로 수정될 가능성이 존재하며 클래스 유지가 어렵고 버그도 발생하기 쉽기 때문
목적
- 객체 보호, 보안
- c++에서 객체의 캡슐화 전략
-> 데이터 멤버(멤버 변수)에 대한 보호 / 중요한 멤버는 외부 접근에 대해 보호 / 외부와의 인터페이스를 위해 일부 접근 허용
접근 지정자
- private(비공개) : 동일한 클래스의 멤버 함수에만 접근 허용
- public(공개) : 모든 다른 함수들에 접근 허용
- protected(보호) : 클래스 자신과 상속받은 자식 클래스의 멤버 함수에만 접근 허용
중복 접근 지정 가능
class Sample {
private :
// private 멤버 선언
public :
// public 멤버 선언
private :
// private 멤버 선언
};
default : private
class Circle {
// private: 이 생략되어 있어도 있는 것과 같음
int radius;
public:
Circle();
Circle(int r);
double getArea();
};
- get 함수 (getter, accessor) : 전용 데이터 필드의 값을 반환
= 접근자
-> returnType getPropertyName() 형식
- set 함수 (setter, mutator) : 전용 데이터 필드를 새로운 값으로 설정
= 변경자
-> void setPropertyName(dataType propertyValue) 형식
- 변수의 범위
1. 전역 변수 : 모든 함수들 바깥에 선언되고 모든 함수에서 접근이 가능
-> 전역 변수의 범위는 선언에서 시작하며 프로그램 끝까지 계속됨
= 클래스의 데이터 필드 (변수로 선언되며 모든 생성자와 함수에서 접근 가능)
2. 지역 변수 : 함수의 안에서 정의
-> 지역 변수의 범위는 선언에서 시작하며 변수를 포함하고 있는 블록의 끝까지 계속됨
3. 정적 지역 변수 : 함수의 다음 호출에서도 사용될 수 있도록 프로그램에 영구히 저장
* 데이터 필드에 대한 변수는 한 번만 선언할 수 있지만, 함수 안에서 선언한 변수 이름은 다른 함수에서 여러 번 선언할 수도 있음
-> 지역변수와 데이터 필드의 이름이 같을 경우가 존재
#include <iostream>
using namespace std;
class Foo {
public:
int x; // 데이터 필드
int y; // 데이터 필드
Foo() {
x = 10;
y = 10;
}
void p() {
int x = 20; // 지역 변수
cout << "x is " << x << endl;
cout << "y is " << y << endl;
}
};
int main() {
Foo foo;
foo.p();
return 0;
}
결과값 :
x is 20
y is 10
x는 Foo 클래스 안에서 데이터 필드로 선언되었으나 함수 p()안에서 20의 초기값을 갖는 지역 변수로도 선언되어있다.
-> 데이터 필드와 지역 변수가 같은 이름을 가지면 지역 변수가 우선권을 가지기 때문에 20이 출력
- 클래스 추상화와 캡슐화
클래스 추상화 (abstraction) : 클래스 사용과 클래스 구현을 분리하는 것
클래스 개발자 : 클래스에 대한 내용을 설명문으로 제공하여 사용자가 클래스를 잘 사용하도록 함
-> 클래스 규약(class contract)형태로 제공
클래스 사용자 : 클래스 구현에 대해 알 필요가 없음
ex) 컴퓨터 시스템 구축 - 각 부품이 어떻게 사용되는지와 어떻게 상호 동작하는지만 알면 됨
= 부품이 내부적으로 어떻게 동작하는지는 알 필요가 없다.
=> 부품 내부의 실행은 사용자에게 캡슐화되어 감춰져 있음
클래스 캡슐화 (class encapsulation) : 클래스 구현에 대한 세부적인 내용은 사용자에게 캡슐화되어 감춰진 형태로 있게 됨
클래스 헤더파일 - 클래스 사용자에게 제공
클래스 구현파일 - 클래스 개발자가 작성
'C++ 응용' 카테고리의 다른 글
Chapter.09 객체와 클래스 (1) (0) | 2024.10.04 |
---|