본문 바로가기

C++ 응용

Chapter.09 객체와 클래스 (2)

인라인 함수(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