[C++기초] 9. 인라인 함수, static 키워드, 예외

INDEX

  1. 인라인 함수
  2. static 키워드
  3. 정적 멤버 함수
  4. 예외
  5. 예외 - 범위 이탈, 0으로 나누기
  6. 예외 생성자
  7. 예외 - C의 에러코드
  8. 예외 에러 코드보다 예외가 더 낫다
  9. 적절한 예외처리

인라인 함수

인라인 함수

함수 호출할 때

인라인 함수의 동작 원리

인라인 함수의 동작원리 1

인라인 함수의 동작원리 2

인라인 함수를 쓸 때 주의점

인라인 함수 사용법

멤버 아닌 인라인 함수 사용법

inline <return-type> <function-name> (<argument-list>)
{
    //...
};

인라인 멤버 함수

inline <return-type> <class-name>::<function-name> (<argument-list>)
{
    //...
};

static 키워드

static 키워드

extern 키워드

함수 속 정적 변수

예시

void Acc(int number)
{
    //초기화는 한번만 됨
    static int result = 0;
    result += number;
    std::cout<<"result = "<<result<<std::endl;
}
int main()
{
    Acc(10); // 10
    Acc(20); // 30
    return 0;
}

정적 멤버 변수

정적 멤버 변수 베스트 프랙티스

정적 멤버 함수

예외

C++에서의 예외

Java는 어딜 봐도 예외 투성이

C++의 예외는 어디서 올까?

예외 - 범위 이탈, 0으로 나누기

범위 이탈 예외

#include<exception>
int main()
{
    std::string myCatName = "Coco";
    try
    {
        char ch = myCatName.at(5);
    }
    catch(const std::out_of_range& e)
    {
        std::ceer<<"out of range: "<<e.what()<<std::end;
    }
    catch(const std::exception& e)
    {
        std::cerr<<"exception:" <<e.what()<<std::endl;
    }
    return 0;
}

try/catch가 없을 경우

try/catch가 없을경우

범위 이탈 예외 해결책

std::string myCatName = "Coco";
const size_t INDEX = 5;
if(INDEX < myCatName.size())
{
    char ch = myCatName.at(INDEX);
    //....이하 코드 생략....
}

컨트롤 할 수 있다! -> try/catch를 쓰는 건 낭비

0으로 나누기

NULL개체 참조

예외 생성자

예외 생성자

예외생성자

대부분의 예외는 불필요

생성자 예외 던지기

//Exception.h
#include<exception>
struct SlotNullEsception : public std::sxception
{
	const char* what() const throw()
	{
		return "Slot is NULL";
	}
};
//Inventory.cpp
Inventory::Inventory(int slotCount)
{
	mSlots = new int[slotCount];
	if (mSlots == NULL)
	{
		throw slotNullException();
	}
}
//Main.cpp
Inventory* myInventory = nullptr;
try
{
    myInventory = new Inventory(5);
}
catch(const SlotNullException& e)
{
    std::cerr << e.what() << std::endl;
}
catch(const std::exception& e)
{
    //다른 에러들
}

그럼 생성자에서 쓰는 예외는 괜찮을까?

예외 - C의 에러코드

C·++ vs 다른 언어들

예외 에러 코드보다 예외가 더 낫다

진실

적절한 예외처리

적절한 예외 처리 전략

  1. 유효성 검사/예외는 오직 경계에서만

    • 밖에서 오는 데이터를 제어할 수 없기 때문
    • 예) 외부에서 들어오는 웹 요청, 파일 읽기/쓰기, 외부 라이브러리
  2. 일단 시스템에 들어온 데이터는 다 올바르다고 간주할 것

    • assert를 사용해서 개발 중 문제를 잡아내고 고칠 것
  3. 예외 상황이 발생할 때는 NULL을 능동적으로 사용할 것

    • 하지만 기본적으로 함수가 NULL을 반환하거나 받는 일은 없어야 함
    • 코딩 표준 : 만약 NULL을 반환하거나 받는다면 함수의 이름을 잘 지을것

경계에서의 예외처리

//C# 방식
string ReadFileorNULL(string filename)
{
    if(!File.Exists(filename))
    {
        return null;
    }
    try
    {
        return File.LoadAllText(filename);
    }
    catch(Exception e)
    {
        return null;
    }
}

일단 시스템에 들어온 데이터는 다 올바르다고 간주

코딩 표준

const char* GetCoolName(const char* startWithOrNull) const;

const char* GetHobbyOrNull() const;

예외는 만병통치약이 아니다

개발 중 버그 잡기

시체보다는 좀비가 낫지 않나요?