관리 메뉴

c0smicb0y

녹슨 C++ 코드에 모던 C++로 기름칠하기 본문

프로그래밍/C/C++

녹슨 C++ 코드에 모던 C++로 기름칠하기

2015. 10. 29. 02:02

모던 c++이란 c++ 11/14를 말한다


녹슨 C++ 코드란

succeed() 등으로 떡칠 된 코드 등등


고치고 싶지만...

이미 고치기엔 길어져버린 코드

어디서부터 손을 써야 할 지 모름

코드는 점점 산으로...


어디에 기름칠을 할까?

전처리기

리소스관리 

함수

타입, 반복문

기타 등등...


전처리기

#if, #ifdef, #ifndef 등등

많이 쓰면 복잡해진다.

많이 쓸수록 이해하기 어렵다

많이 쓸수록 유지보수하기 어렵다

-> 템플릿을 이용하여 기름칠


조건부 컴파일에서 케이스 바이 케이스

개선하지 못하고 #ifdef를 사용해야 되는 경우도 있다.

반드시 사용해야 된다면, 코드를 단순화하는 것이 좋다.

중첩 #ifdef를 피하는게 좋음, 함수의 일부를 조건부 컴파일에 넣지 않도록 한다.


매크로

#define

변수 대신 사용하는 매크로

함수 대신 사용하는 매크로 

수많은 문제를 일으키는 장본인

컴파일러가 타입에 대한 정보를 갖기 전에 계산됨

필요 이상으로 많이 사용(반드시 필요한 경우도 있음)


변수 대신 사용하는 매크로

대문자로 변경하면 일시적으로 문제 해결 가능

혹은 열거체를 사용

열거체도 완벽하지 않음

열거체끼리 더하는 문제

열거체를 두개를 만드는데 겹치는게 생기면 오류가 발생 (열거체가 전역으로 인식되기 때문)


열거체의 문제점

묵시적인 int 변환

열거체의 타입을 명시하지 못함

이상한 범위 적용

-> 열거체 클래스의 등장

묵시적인 int 변환이 안됨 -> 명시적으로 해야함


열거체 클래스를 사용하자

묵시적인 int 변환 -> 명싲거인 int 변환

열거체의 타입을 명시하지 못함 -> 타입 명시 가능

이상한 범위 적용 -> 범위 지정 연산자를 통해 구분


함수 대신 사용하는 매크로

c++에서는 인라인이 기본적으로 지원 -> 이 함수가 인라인으로 쓸때가 효과적이라고 판단되면 알아서 바꿔줌


열거체, 함수를 사용하자

변수 대신 사용하는 매크로에는 열거체를 사용하자

열거체에서 발생할 수 있는 문제는 열거체 클래스로 해결

열거체 대신 static const 변수를 사ㅛㅇ하는 방법도 있음

함수 대신 사용하는 매크로에는 함수를 사용하자

읽기 쉽고, 유지보수하기 쉽고, 디버깅하기 쉽다.

성능에 따른 오버헤드도 없다.


FAILED() 사용


중첩 if문 뒤에 Release() 사용 -> 번거로움

동적할당은 반드시 메모리 해제를 해주어야함


RAII

자원 획득은 초기화다 (Resource Acquisition Is Initialization)

객체의 생성에 맞춰서 메모리와 시스템 리소스를 자동으로 할당

객체의 소멸에 맞춰 메모리와 시스템 리소스를 자동으로 해제


소멸자에서 메모리 해제를 해주면 소멸될때 알아서 해제됨


다시 발생하는 문제

파일 입출력과 관련한 예외 처리를 간편하게 하기 위해 file 클래스를 만들어 생성자와 소멸자로 처리했다.

하지만 정작 FILE 클래스를 동적으로 할당하는 경우 소멸자가 호출되지 않아 파일을 닫지 않는 문제가 발생한다.

->스마트 포인터의 등장!


스마트 포인터

좀 더 똑똑한 포인터

스마트 포인터를 사용하면 명시적으로 해제할 피요가 없다.

사용하는 이유

적은 버그, 자동 청소, 자동 초기화


unique_ptr

객체의 소유권은 딱 하나만 가짐


shared_ptr

리소스 관리는 스마트 포인터로

RAII를 사용하자!

C++ 코드 품질을 향상시키는 가장 쉬운 방법

기왕이면 스마트 포인터로!


함수

람다 식 사용


람다식

개시자 | 인자 | 반환 타입 | 함수의 몸통


람다식을 사용하자

짧고, 간결하고, while 문과 같은 행사 코드 없이 깔끔하게 작성할 수 있다.

수십줄의 코드를 1~2 줄로 간추릴 수 있다.

functor, callback function을 대체해서 사용할 수 있다.

반복저긍로 사용하는 함수가 아니라면 람다식을 사용하자.


간단하게 적용가능한 기능들


auto 키워드

컴파일 타임에 타입을 추론해 어떤 타입인지 결정한다.

컴파일 타임에 추론이 불가능하다면, 오류가 발생한다. (자바스크립트의 var와는 다름)


범위 기반 for 문


정리

대체할 수 있는 조건부 컴파일은 템플릿으로!

매크로는 가급적 사용하지 말고 열거체와 함수로!

리소스 관리에는 RAII 기왕이면 스마트 포인터로!

일회성으로 사용하는 함수는 람다식으로!

복잡한 타입에는 auto로!

반복 횟수에 고통받지 말고 범위기반 for문으로!



Comments