✅함수 호출에 따른 오버헤드
짧은 코드를 함수로 만들게 되면, 함수 호출의 오버헤드가 상대적으로 커서 프로그램 실행 시간이 길어지는 원인을 제공한다. 이러한 짧은 코드를 다루는 함수에 대하여 오버헤드를 줄일 방법이 있다면 이것이 프로그램의 실행 속도 개선에 타개책이 될 것이다.
✅인라인 함수
: 짧은 코드로 구성된 함수에 대해, 함수 호출 오버헤드로 인한 프로그램의 실행 속도 저하를 막기 위해 도입된 기능
인라인 함수는 함수 앞에 inline 함수의 코드를 그대로 삽입해 함수 호출이 빨리 출력되는 것을 방지
인라인 함수의 장단점
대부분의 객체 지향 언어에서 비교적 작은 함수를 만든다.
C++ 역시 getter/setter라고 불리는 작은 멤버 함수들이 많이 존재하며, 이 멤버 함수를 호출하는 코드 역시 많이 존재한다.
위에서 언급했던 짧은 코드들에 대해 오버헤드를 줄일 방법이 바로, 이 인라인 함수인 것이다. 인라인 스케이트말고
작은 함수를 인라인으로 선언하면 C++ 프로그램의 실행 속도를 향상 시킬 수 있다.
인라인 함수를 호출하는 곳에 인라인 함수의 코드를 단순 삽입하므로, 호출하는 곳이 多라면 그만큼 전체 크기가 늘어나는 단점이 있다. 가능한 작은 함수를 인라인으로 선언하는 것이 현명하다.
인라인 함수의 제약사항
인라인 함수는 요청이지, 강제 명령이 아니다.
컴파일러에 따라 함수의 크기나 효율을 따져 불필요하다면, inline 선언을 무시할 수 있다.
컴파일러에 따라 어떤 함수인지에 따라 인라인 함수를 허용하지 않는다.
클래스 선언부에서 구현된 멤버 함수들은 inline 선언 없이 인라인 함수로 자동 처리한다.
✅C++ 구조체
; struct키워드로 선언하며, 멤버 변수와 멤버 함수를 가지고, 접근 지정도 해줘야한다.
클래스와 동일한 구조와 기능을 가진다.
struct structName{
//디폴트 접근 지정은 public, public 속성의 멤버 변수나 멤버 함수 선언
private:
//private 속성의 멤버 변수나 멤버 함수 선언
public:
//public 속성의 멤버 변수나 멤버 함수 선언
protected:
//protected 속성의 멤버 변수나 멤버 함수 선언
};
✅C++ 구조체 객체 생성
클래스 객체 선언 방식과 마찬가지로, 구조체 타입 뒤에 객체명을 지정하면 된다.
structName타입의 객체 stObj를 생성하며, C언어와 다르게 객체 생성 시 struct 키워드는 사용하지 않는다.
structName stObj; //structName 타입의 구조체 객체 생성
struct structName stObj; //C++에서 컴파일 오류. struct 키워드 사용 불가
✳구조체와 클래스의 차이
구조체는 디폴트 접근 지정이 private,
클래스는 디폴트 접근 지정이 public이다.
구조체와 클래스가 거의 같다면 가능하면 클래스를 사용하는 것이 좋다.
한 번 더 짚고 넘어가기
구조체의 default 접근 권한은 public, 클래스의 default 접근 권한은 private이다.
C++ 멋쟁이 사자처럼 작성하는 작성법
C++ 프로그램은 여러 클래스들과 전역 함수들로 구성된다.
클래스마다 선언부는 헤더 파일에, 구현부는 cpp 파일에 분리하여 작성한다
main() 등 함수나 전역 변수는 한 개 이상의 cpp 파일에 나누어 작성한다
클래스마다 클래스의 선언부와 구현부를 헤더 파일과 cpp 소스 파일로 분리하여 전체 프로그램을 쉽게 관리하며 클래스를 재사용하기 쉽다.
예로 코드를 하나 짜보자.
gaesalburger.h : gaesalburger 클래스 선언부
gaesalburger.cpp : gaesalburger 클래스 구현부
main.cpp : main()함수 등 나머지 코드
위처럼 코드를 분리하면 gaesalburger의 선언부를 gaesalburger.h로 분리했기 때문에, gaesalburger클래스를 활용하는 모든 코드(gaesalburger.cpp, main.cpp)에서는 다음과 같이 gaesalburger.h를 include해야한다.
#include "Circle.h"
또한 컴파일러는 cpp파일만 컴파일 하기 때문에 #include"~~.h"와 같이 꼭 넣어줘야한다.
헤더 파일을 나눠서 작성하다보면 중복되는 부분이 있다.
이 때문에 컴파일 오류를 방지하기 위해 헤더 파일에 조건 컴파일 문을 삽입한다.
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
#ifndef~~
#define ~~
~~
~~
~~
#endif
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
#ifndef #define 패턴을 이용해 순환참조나 중복 인클루드를 막을 수 있다.
만약 키워드가 정의되어 있다면 컴파일러가 #endif지시자가 있는 블록까지 코드를 건너뛴다.
그러나 해당 키워드가 정의되어 있지 않다면 정상적으로 코드를 인클루드한다.
위와 같은 상황의 메커니즘을 인클루드 가드(include guards)라고 한다.
if n def는 if(this header file is) not defined, then define it into (headerfile name)으로 해석할 수 있다.
//example.h
#ifndef CIRCLE_H
#define CIRCLE_H
class Circle{
private:
int radius;
public:
Circle();
Circle(int r);
double getArea();
};
#endif
//main.cpp
#include<iostream>
using namespace std;
#include "Circle.h"
#include "Circle.h"
#include "Circle.h"
int main(){
~~~~~~~~~~~~~~~
}
위의 경우, #include "Circle.h" 문만 처리되고 나머지 include문은 처리되지 않게 되어, Circle 클래스의 선언부가 한 번만 main.cpp에 확장되는 것이다.
'Language & Framework & GIT > C++' 카테고리의 다른 글
[씨앤씨뿔]C++ / 객체 포인터 &배열 &동적 생성 - 2 (0) | 2023.04.26 |
---|---|
[씨앤씨뿔]C++/ 객체 포인터& 배열& 동적 생성 - 1 (0) | 2023.04.24 |
[씨앤씨뿔]C++/ 클래스 & 객체 - 1 (0) | 2023.04.18 |
[씨앤씨뿔]C++/ C++의 기본 - 3 (0) | 2023.04.17 |
[씨앤씨뿔]C++/ C++의 기본 - 2 (0) | 2023.04.14 |
댓글