본문 바로가기
C++

C++ 언어의 기초

by ChocoPeanut 2017. 7. 11.

C++ 언어의 기초

 

주석은 프로그래머를 위한 것으로 컴파일러는 주석을 무시한다. 주석은 ///*를 사용하여 나타낼 수 있다.


C++은 세 단계를 거쳐서 빌드 된다. 전처리 작업으로 코드 내에 지시된 메타 정보를 인식하여 자동으로 코드를 수정하고 컴파일 작업으로 소스 코드를 기계어로 번역한다. 마지막 링크 작업으로 기계어로 된 여러 오브젝트 파일을 묶어서 하나의 실행 파일로 만든다. 전처리 지시자인 #include은 헤더 파일의 코드를 가져와서 현재 소스 파일에 삽입하도록 지시한다. #define은 상수나 매크로를 정의하는데 사용되고 #ifdef#ifndef는 헤더 파일의 중복 인클루드를 막는 경우에 사용된다.


main 함수는 프로그램을 실행할 때 가장 먼저 호출되는 시작점이다. main의 인자로는 argcargv가 올 수 있는데 argc는 프로그램을 실행할 때 명령 줄에서 넘겨진 인자의 개수이고 argv는 각 인자의 문자열 값이 들어간다.


I/O 스트림은 출력과 입력으로 구성된다. 출력은 coutcerr이 있다. cout는 출력할 데이터를 컨베이어 벨트에 밀어넣는 것이다. cerr은 표준 오류 출력 장치로 데이터가 출력된다. 연산자 <<은 밀어 넣는 역할을 수행한다. endl은 한 줄이 끝났음을 알린다. cin은 입력을 하는 함수로 >>연산자를 이용해서 적용시킬 수 있다.


네임스페이스는 코드 내에서 이름이 같은 변수명이나 함수명이 서로 충돌하는 문제를 해결하기 위해 고안된 방식이다. namespace <name>을 통해 지정하여 ::(스코프 설정 연산자)를 통해 해당하는 namespace에서 함수를 불러와서 사용할 수 있게 된다. using namespace <name>을 사용하게 되면 해당 이름에 대한 모든 함수를 불러다가 사용할 수 있게 된다. 대신 절대로 헤더 파일에는 using 선언을 하면 안 된다. 그렇게 하면 헤더 파일의 사용자에게 네임스페이스에 대한 선택권을 빼앗는 것이기 때문에 using 지시자의 존재 이유가 없어진다.


열거 타입은 어떤 숫자들을 나열할지 프로그래머가 마음대로 정할 수 있게 해주는 도구이다. enum <name>을 사용하여 정의한 후 열거 타입의 인자들은 정수 타입으로 처리된다. 지정을 하지 않을 시 처음 인자는 0으로 지정되고 지정을 하게 되면 그 숫자로부터 1씩 증가하게 값을 가지게 된다.


구조체는 하나 이상의 기본 타입 또는 다른 구조체를 조합하여 새로운 타입을 만들어낸다. 구조체의 각 항목은 ‘.’ 연산자를 통해 접근 가능하다.


반복문에는 while문과 for문이 있다. whiledo문과 같이 사용할 수 있다. for문은 구간 지정 for루프로도 사용할 수 있다. 이는 리스트를 순회하며 작업할 때 편리하다. 반복자인 iterator를 이용하여 사용하게 된다. STL에 있는 모든 컨테이너에서 사용 가능하다.


함수는 프로그램을 이해하기 쉽게 하기 위해서 코드의 일부를 의미 있는 단위로 쪼갠 것을 나타낸다. 함수는 변수와 마찬가지로 return 하는 값에 따라 타입을 지정해야하는데 auto를 사용할 수도 있다.


C++이 사용하는 메모리는 스택과 힙으로 나누어진다. 스택은 스택 프레임을 통해 현재 실행 중인 함수에 관련있는 정보를 가진다. 힙 메모리는 항상 존재해야하는 변수를 저장하는 공간이다. 동적 메모리는 컴파일 타임에 크기를 정할 수 없는 데이터를 이용할 수 있게 해준다. 포인터를 사용하면 동적으로 할당된 힙 메모리를 가리키는 화살표를 만들 수 있게 된다. nullptr로 초기화를 시켜 주어야한다. 메모리를 할당할 때는 new 연산자를 사용한다. 변수값에 접근하기 위해서 포인터를 역참조해야 한다. delete 연산자를 통해 할당을 해제해주어야 한다. 구조체를 역참조할 때에는 ->를 이용하면 접근할 수 있게 된다. 배열의 형태도 동적 할당을 할 수 있다.


스마트 포인터를 사용하면 여러 가지의 메모리 문제를 해결할 수 있다. 또한 자동으로 메모를 해제하는 작업도 수행하게 된다. <memory>라는 헤더 파일을 통해 사용할 수 있으며 unique_ptr, shared_ptr, weak_ptr로 구성된다. make_unique<typename>()을 선언하게 되면 타입 이름에 맞는 동적 할당을 할 수 있게 된다.


예외 처리try, throw, catch를 사용한다. try는 코드를 실행하는 부분이고 throw는 예외가 발생했을 시에 익셉션을 던지는 부분이고 catch는 이를 받아 필요한 뒤처리를 하는 부분이다.


const는 절대 변하지 않는 상수값에 이름을 부여하여 활용할 때 사용된다. #define을 사용하는 것 보다는 const를 사용하는 것이 더 좋다