Cplusplus 공부 1일차
카테고리: Cpp
C++1
CPlusPlus 공부하기.
게임 프로그래머에게 있어서 C++은 필수적인 언어다. 유니티를 써서 C#을 쓴다고 해도, 코어 부분은 C++로 이루어져 있기도 하고 또 듣기로는 만든 코드를 뜯어내어 C++ 상에서 다시 작성하는 경우가 있다고도 하고… 언리얼 엔진, 자체엔진을 쓰는 경우는 말할 것도 없다.
아무튼, 이전에 공부해둔 C++에 대해 정리할 생각이다.
std::cout<< "하이하이";
int a;
std::cin>> a;
std::cout<<"하이하이"<<std::endl;
아주 간단하게 알아보자. cout는 출력하는데 쓰이는 것이다. c out이라고 읽는 편이긴 하다.
또한 int형, char형, string형등 모두 출력할 수 있으며, 사용자 정의 형은 나중에 연산자 오버로드를 통해서 출력해줄수도 있다.
cin도 동일하다.
endl은 개행이라고 생각하자. 그러면 ‘\n’하고 다른 게 뭘까하면 출력 버퍼를 비워준다, 비워주지 않는다로 생각하면 된다.
\n의 경우 버퍼를 비우지 않는다. 다만 구현체에 따라서 std::endl처럼 버퍼를 비우도록 처리하도록 하는 경우도 있다. 그렇지만 장담할 수 없으므로, 버퍼를 비우고 싶으면 std::endl 을 사용해야 한다.
using namespace std;
using namespace <name>;
namespace
어떤 공간에 이름을 정의해준다. 좀 풀어서 설명을 하면 수많은 개발자가 커다란 프로그램을 만들다 보면 함수나 구조체 등에서 이름이 같은 경우가 생긴다.
이런 충돌이 발생하지 않도록 영역을 나누는 느낌이라고 생각하면 된다. 함수, 구조체등의 소속을 딱 정해서 그걸 명시적으로 보여주는 것이라고 보면 된다.
네임 스페이스의 처음은 소문자이다.
pragma once
#pragma once
//내용
헤더 파일 include를 한 번만 해준다. 다만, pragma once는 표준이 아니기에, 지원하지 않는 컴파일러도 존재한다.
조정자(Manipulator).
std::cout과 «(insertion)을 같이 사용하여 특정 수를 원하는 진법으로 나타내는 것이다.
int num = 52;
std::cout << std::dec << num << std::endl; // 10진수
std::cout << std::hex << num << std::endl; // 16진수
std::cout << std::oct << num << std::endl; // 8진법.
std::cout << std::showbase << std::showpos << std::endl; //showbase는 0x,나 0과 같은 16진수, 8진수의 기호를 보여주고,
//showpos는 +, -와 같은 기호를 양수일때도 확실히 명시한다.
std::cout << std::dec << num << std::endl;
std::cout << std::hex << num << std::endl;
std::cout << std::oct << num << std::endl;
추가적으로 setw, left, right, internal을 알아보자.
#include
// showpoint, setprecision
double decimal1 = 100;
double decimal2 = 100.2;
double decimal3 = 123.42123;
std::cout << decimal1 << std::endl; // 100
std::cout << decimal2 << std::endl; // 100.2
std::cout << std::showpoint; // 소수점 아래의 표시여부를 표현한다.
std::cout << decimal1 << std::endl; // 100.000
std::cout << decimal2 << std::endl; // 100.200
std::cout << std::setprecision(5) << decimal3 << std::endl; // 123.42
// setw, left, right, internal
// setw는 출력의 영역 길이를 지정해준다. 그런 느낌??
int num = -77;
std::cout << "|" << std::setw(6) << std::left << num << "|" << std::endl; // |-77 |
std::cout << "|" << std::setw(6) << std::internal << num << "|" << std::endl; // |- 77|
std::cout << "|" << std::setw(6) << std::right << num << "|" << std::endl; // | -77|
// setfill
std::string str = "hello";
std::cout << "|" << std::setfill('*') << std::setw(8) << str << "|" << std::endl; // setw의 빈 공간을 *로 채운다 |***hello|
std::cout << "|" << std::setfill('*') << std::setw(8) << std::left << str << "|" << std::endl; // |hello***|
길게 주저리 설명은 안해도 될 것 같다. 위의 주석으로 적어둔 결과로 모두 이해가 될 것이다.
입력스트림
우선, Scanf는 안전하지 않다! 이것부터 알고 넘어가도록 하자.
갑자기 무슨 이야기냐, C를 계속 써오신 분들은 무슨 말이냐 하겠지만 일단 차근차근히 설명하겠다.
char firstName[4];라는 배열이 있다. 여기다가 “asas”라는 문자열을 입력해서 scanf로 넣는다고 해보자.
그런데 scanf는 입력을 넣으면 null string을 끝에 넣어준다.
그런데 이상하지 않는가? firstName의 길이는 4다. 그런데 asas의 길이도 4인데, scanf로 넣으면 마지막에 null string까지 넣으면 길이가 5가 된다.
다시말해 firstName이 소유한 메모리를 넘어선 곳에다가 덮어쓴다.
조금 더 명시적으로 말하자면 **scanf는 경계검사를 하지 않는다.** 라는 의미가 된다.
cin에 대해서
cin을 보자.
cin.clear() // 스트림을 비워준다.
cin.ignore() // 들어온 문자 1개를 버린다. 매개변수로 버릴 걸 결정할수도 있다.
cin.ignore(10, '\n'); // 문자 10개를 버린다. 그 이전에 \n(new line)을 만나면 멈춘다.
또 get이나 getline이 있는데,
get()은 뉴라인 문자를 만나기 직전까지 모든 문자를 가져온다. 다만, 뉴라인 문자는 입력스트림에 그대로 남아있다.
getline() -> 이건 뉴라인 문자를 입력 스트림에서 버린다.
댓글 남기기