<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=%EC%81%A0%EB%8B%AC%EC%9E%90</id>
	<title>쁠달자 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=%EC%81%A0%EB%8B%AC%EC%9E%90"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=%EC%81%A0%EB%8B%AC%EC%9E%90&amp;action=history"/>
	<updated>2026-05-14T11:33:20Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=%EC%81%A0%EB%8B%AC%EC%9E%90&amp;diff=52227&amp;oldid=prev</id>
		<title>imported&gt;Unknown at 14:07, 16 February 2021</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=%EC%81%A0%EB%8B%AC%EC%9E%90&amp;diff=52227&amp;oldid=prev"/>
		<updated>2021-02-16T14:07:51Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;__TOC__&lt;br /&gt;
=== 소개 ===&lt;br /&gt;
* 쁠달자 (C에 +를 달자 ~~학점에도 쁠을~~)&lt;br /&gt;
* C++ 입문 스터디, 그러나 심도있게 진행&lt;br /&gt;
* [https://www.inflearn.com/course/following-c-plus/ 홍정모의 따라하며 배우는 C++]를 공부합니다.&lt;br /&gt;
* 미리 강의를 듣고 스터디날에 의견을 나누며 요약 정리 및 복습하는 방식으로 진행합니다.&lt;br /&gt;
* 이미 알고 있는 내용(C언어 내용)은 적당히 스킵합니다.&lt;br /&gt;
* 일정 : 월수금 3시 ~ 종료 시간 미정 (대략 2시간)&lt;br /&gt;
&lt;br /&gt;
=== 참가자 ===&lt;br /&gt;
* [[나종우]]&lt;br /&gt;
* [[주영석]]&lt;br /&gt;
* [[조예진]]&lt;br /&gt;
&lt;br /&gt;
=== 활동 ===&lt;br /&gt;
==== 20181224 ====&lt;br /&gt;
===== C++ 꼭 공부해야 할까? =====&lt;br /&gt;
# C++로 프로그래밍 기반을 다지기 좋다 (기반이 있어야 응용까지 가능)&lt;br /&gt;
# 예제를 풀면서 발생하는 문제를 해결하면서 실력이 증가&lt;br /&gt;
# C++은 다른 언어를 배울때도 빠르게 익힐 수 있게 도와준다.&lt;br /&gt;
&lt;br /&gt;
===== 프로그래밍 언어란 =====&lt;br /&gt;
* 프로그램(어플리케이션, 소프트웨어)를 만들기 위한 언어&lt;br /&gt;
* 저수준 언어 (기계와 가깝고 세부적으로 조작) : 기계어, 어셈블리어 등&lt;br /&gt;
* 고수준 언어 (인간에 가깝고 추상화된 구조) : C, C++, Python, Java 등&lt;br /&gt;
** 컴파일러 언어 : 코드 → 컴파일러 → 실행파일 → CPU (실행속도 빠름)&lt;br /&gt;
** 인터프리터 언어 : 스크립트 → 인터프리터 → CPU (실행파일 X, 실행속도 느림)&lt;br /&gt;
* 이식성&lt;br /&gt;
&lt;br /&gt;
===== C, C++ 언어 소개 =====&lt;br /&gt;
* 창시자 : C - 데니스 리치, C++ - 비야네 스트롭스트룹&lt;br /&gt;
* C++ 설계 철학 : 프로그래머를 믿어라&lt;br /&gt;
** 실용성, 스타일의 자유, 오용보다 다기능 중점, 명확하게 명시, C++ 아래에 다른 언어 없다&lt;br /&gt;
&lt;br /&gt;
===== 입출력 스트림과의 첫 만남 cin, cout =====&lt;br /&gt;
cin, cout : 대부분의 자료형 입출력 가능, 포인터 쓸 필요 X&lt;br /&gt;
 std::cin &amp;amp;gt;&amp;amp;gt; 변수1 &amp;amp;gt;&amp;amp;gt; 변수2 &amp;amp;gt;&amp;amp;gt; ...;&lt;br /&gt;
 std::cout &amp;amp;lt;&amp;amp;lt; &amp;quot;문자열&amp;quot; &amp;amp;lt;&amp;amp;lt; &amp;#039;문자&amp;#039; &amp;amp;lt;&amp;amp;lt; 변수 &amp;amp;lt;&amp;amp;lt; ... &amp;amp;lt;&amp;amp;lt; std::endl; // endl : 줄바꿈&lt;br /&gt;
 // &amp;amp;lt;&amp;amp;lt;와 &amp;amp;gt;&amp;amp;gt;는 스트림이 흘러가는 방향으로 기억하자 &lt;br /&gt;
&lt;br /&gt;
===== 선언과 정의의 분리 =====&lt;br /&gt;
* 선언(declaration) : 최소 형태로 대상의 존재를 컴파일러에게 알려주는 것 (여러개 존재 가능)&lt;br /&gt;
* 정의(definition) : 대상의 세부적인 실제 구현 사항 (하나만 있어야 함)&lt;br /&gt;
* 컴파일러는 소스를 위에서 아래로 읽기 때문에 선언이 필요하다.&lt;br /&gt;
* 함수의 선언과 정의를 분리하자. 함수를 사용하기 전에 선언을 한다. (전방 선언)&lt;br /&gt;
&lt;br /&gt;
===== 헤더파일 만들기 =====&lt;br /&gt;
* 파일을 분리하는게 좋은 습관 (프로젝트가 커지면 꼭 필요)&lt;br /&gt;
* 헤더파일에 선언, 소스파일에 정의&lt;br /&gt;
* 함수 등을 사용할 곳에서 필요한 헤더파일을 include&lt;br /&gt;
&lt;br /&gt;
===== 헤더 가드가 필요한 이유 =====&lt;br /&gt;
* 헤더 가드 : 중복 include를 방지 (#pragma once)&lt;br /&gt;
* 표준 방식대로는 #ifndef #define ~ #endif 식으로 구현&lt;br /&gt;
&lt;br /&gt;
===== 네임스페이스 (명칭 공간) =====&lt;br /&gt;
* namespace : 함수나 변수 등에 특정 공간을 부여하여 서로 겹치는 것을 방지&lt;br /&gt;
* 중첩하여 사용하는 것도 가능하다.&lt;br /&gt;
* 범위 지정 연산자(::)를 이용해 접근하지만, using 문을 쓰면 생략 가능&lt;br /&gt;
 namespace MySpace {&lt;br /&gt;
     namespace InnerSpace {&lt;br /&gt;
         void myFunction() { }&lt;br /&gt;
     }&lt;br /&gt;
     void myFunction() {&lt;br /&gt;
        //...&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 MySpace::myFunction();&lt;br /&gt;
 MySpace::InnerSpace::myFunction();&lt;br /&gt;
 &lt;br /&gt;
 // 네임스페이스 생략 방법&lt;br /&gt;
 // using namespace MySpace; → MySpace에 속한 모든 대상&lt;br /&gt;
 // using MySpace::myFunction; → myFunction만 지정&lt;br /&gt;
&lt;br /&gt;
==== 20181226 ====&lt;br /&gt;
===== 전처리기와의 첫 만남 =====&lt;br /&gt;
* 전처리기 : 컴파일 이전에 전처리문에 따라 소스를 수정한다. (일종의 문서 편집)&lt;br /&gt;
&lt;br /&gt;
* 매크로 함수는 단순 치환으로 작동하기 때문에, 함수 호출 과정이 없어 속도가 빠를 수도 있다.&lt;br /&gt;
   다만 단순 치환이라서, 인자로 수식 등을 넣으면 오작동할 수 있기 때문에 괄호로 감싸줘야 한다.&lt;br /&gt;
   현대 스타일에서는 잘 사용하지 않는다. 디버깅에 어려움이 있다.&lt;br /&gt;
 // #define은 단순 치환 기능 (단, 전처리문 안에서는 치환하지 않음)&lt;br /&gt;
 #define MAX(x,y) (((x)&amp;amp;gt;(y))?(x):(y)) // 매크로 함수, 비슷한 기능의 std::max가 있음&lt;br /&gt;
 #define MY_NUMBER 123123 // 매크로 상수&lt;br /&gt;
 &lt;br /&gt;
 // 조건부 컴파일 (멀티 플랫폼 프로그래밍 등)&lt;br /&gt;
 #define MY_PLATFORM&lt;br /&gt;
 #ifdef MY_PLATFORM&lt;br /&gt;
   int num = 1; // 여기서는 이게 컴파일 됨&lt;br /&gt;
 #else&lt;br /&gt;
   int num = 2;&lt;br /&gt;
 #endif&lt;br /&gt;
&lt;br /&gt;
===== 기본 자료형 소개 =====&lt;br /&gt;
* bool : 참(true), 거짓(false) - 1바이트&lt;br /&gt;
* nullptr (C++11) : 널포인터, 가리키는 대상이 없음을 표현 (NULL과 비슷하지만 NULL은 정수임)&lt;br /&gt;
* auto (C++11) : 컴파일 타임에 자동으로 자료형을 추론하여 정해줌&lt;br /&gt;
&lt;br /&gt;
* C++에서는 변수를 어느 곳에든 선언할 수 있다 (C언어는 블럭 첫부분에만 선언 가능)&lt;br /&gt;
* 변수 초기화 방법&lt;br /&gt;
 copy initialization : int a=1.23; // OK&lt;br /&gt;
 direct initialization : int b(4.56); // OK&lt;br /&gt;
 uniform initialization (C++11) : int c{7.89}; // error (축소 변환 X)&lt;br /&gt;
&lt;br /&gt;
===== 지역 변수, 범위, 지속기간 =====&lt;br /&gt;
* local variable : 어느 지역(블록)에 속하고, 범위를 벗어나면 접근 불가능한 변수 (스택 사용)&lt;br /&gt;
* scope, duration : 정의 ~ 블록(중괄호)의 끝&lt;br /&gt;
* static local variable은 예외임 (프로그램 종료시까지 지속되고, 데이터 영역 사용)&lt;br /&gt;
* variable shadowing : 같은 이름의 변수를 사용할때, 좁은 범위의 변수를 사용함&lt;br /&gt;
&lt;br /&gt;
===== 전역 변수, 정적 변수, 내부 연결, 외부 연결 =====&lt;br /&gt;
* global variable : 프로그램 전체에서 접근 가능 (데이터 영역 사용)&lt;br /&gt;
* static variable : 일정 범위에서 접근 가능 (데이터 영역 사용)&lt;br /&gt;
* global과 static의 duration : 정의 ~ 프로그램 종료&lt;br /&gt;
* internal linkage : 한 파일 안에서만 연결 (static, const) - const는 정의된 곳에서 extern 사용시 외부 연결 가능&lt;br /&gt;
* external linkage : 다른 파일로도 연결 (일반적인 전역 변수)&lt;br /&gt;
 [일반적인 전역 변수, 함수 사용법]&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;ABC.cpp&amp;amp;gt;&lt;br /&gt;
 #include &amp;quot;ABC.h&amp;quot;&lt;br /&gt;
 int x = 5; // 정의&lt;br /&gt;
 int something() { return 1; } // 정의&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;ABC.h&amp;amp;gt;&lt;br /&gt;
 extern int x; // 선언, external linkage 요청&lt;br /&gt;
 int something(); // 선언, 함수는 기본적으로 external이므로 extern 생략&lt;br /&gt;
 &lt;br /&gt;
 // 필요한 곳에서 #include &amp;quot;ABC.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== Using문과 모호성 =====&lt;br /&gt;
* 겹치지 말라고 만든 namespace를 using으로 막 생략하다 보면 모호성이 발생&lt;br /&gt;
** ex) using namespace std; 를 하면 변수 이름으로 count 사용 불가&lt;br /&gt;
* 해결법&lt;br /&gt;
** 범위 지정 연산자(::)를 사용&lt;br /&gt;
** namespace 전체가 아닌 원하는 대상만 생략하기 (using std::cout)&lt;br /&gt;
** 좁은 범위(블록)에서 using 문 사용&lt;br /&gt;
&lt;br /&gt;
===== auto 키워드와 자료형 추론 (C++11) =====&lt;br /&gt;
* auto 변수를 쓸 때는 초기화가 필수 (초기화를 안 하면 자료형 추론 불가능)&lt;br /&gt;
* 함수 반환형으로 auto를 쓸 수 있음 (반환값의 형식이 일정해야 됨)&lt;br /&gt;
* 함수 매개변수에는 auto 사용 불가능 (나중에 배울 template를 쓰자)&lt;br /&gt;
&lt;br /&gt;
===== 형변환 Type conversion =====&lt;br /&gt;
* 암시적 형변환 (implicit type casting) : 형변환을 직접 쓰지도 않았는데 컴파일러가 알아서 형변환&lt;br /&gt;
** 우선 순위 : 실수 &amp;gt; 바이트 수 &amp;gt; unsigned&lt;br /&gt;
* 명시적 형변환 (explicit type casting)&lt;br /&gt;
** int x = (int)3.14; // C-Style, 강제 형변환&lt;br /&gt;
* C++ Style Casts&lt;br /&gt;
 static_cast : [컴파일 타임에 오류 검사] C-Style과 비슷하지만 타입 오류를 잡아준다. 가장 많이 사용 &lt;br /&gt;
 dynamic_cast : [실행 중에 오류 검사] 다운캐스팅(부모 → 자식)에 사용 (객체지향 내용)&lt;br /&gt;
 reinterpret_cast : 비트열을 변경하지 않고 그저 타입만 변경(재해석) (정수-포인터, 포인터-포인터 변환에 사용)&lt;br /&gt;
 const_cast : const 속성 변환&lt;br /&gt;
&lt;br /&gt;
===== 문자열 std::string 소개 =====&lt;br /&gt;
* C의 char 배열을 대체하는 매우 편리한 문자열 사용 방법&lt;br /&gt;
* 클래스로 구현되어 있음 (객체지향 내용)&lt;br /&gt;
 #include &amp;amp;lt;iostream&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;string&amp;amp;gt; // string 클래스 존재&lt;br /&gt;
 using namespace std;&lt;br /&gt;
 &lt;br /&gt;
 int main() {&lt;br /&gt;
   string name = &amp;quot;Jack Jack&amp;quot;;&lt;br /&gt;
   cout &amp;amp;lt;&amp;amp;lt; name &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
 &lt;br /&gt;
   int age = 0;&lt;br /&gt;
   cout &amp;amp;lt;&amp;amp;lt; &amp;quot;Your age : &amp;quot;;&lt;br /&gt;
   cin &amp;amp;gt;&amp;amp;gt; age; // cin은 버퍼에 whitespace(\n, \t, &amp;#039; &amp;#039;)를 남김&lt;br /&gt;
   cin.ignore(32767, &amp;#039;\n&amp;#039;); // 따라서 버퍼에서 \n을 제거해야 getline이 정상적으로 동작&lt;br /&gt;
   &lt;br /&gt;
   cout &amp;amp;lt;&amp;amp;lt; &amp;quot;Your name : &amp;quot;;&lt;br /&gt;
   getline(cin, name); // getline은 버퍼에서 \n 이전까지 입력받고, \n은 버퍼에서 제거&lt;br /&gt;
   cout &amp;amp;lt;&amp;amp;lt; name &amp;amp;lt;&amp;amp;lt; &amp;#039;:&amp;#039; &amp;amp;lt;&amp;amp;lt; age &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
 &lt;br /&gt;
   string a = &amp;quot;Hello &amp;quot;, b = &amp;quot;world&amp;quot;;&lt;br /&gt;
   string c = a + b; // append&lt;br /&gt;
   cout &amp;amp;lt;&amp;amp;lt; c &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
 &lt;br /&gt;
   for (int i = 0; i &amp;amp;lt; c.size(); i++) {&lt;br /&gt;
     cout &amp;amp;lt;&amp;amp;lt; c[i] &amp;amp;lt;&amp;amp;lt; c.at(i) &amp;amp;lt;&amp;amp;lt; endl; // index로 접근&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   // compare&lt;br /&gt;
   if (c == &amp;quot;Hello world&amp;quot;) {&lt;br /&gt;
     cout &amp;amp;lt;&amp;amp;lt; &amp;quot;Hi!\n&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== 20181228 ====&lt;br /&gt;
===== 열거형 enumerated types =====&lt;br /&gt;
* enum : 정수를 기호화하여 의미 부여가 되고 기억하기 쉽고 유지보수에도 좋다&lt;br /&gt;
* 주의사항 : 식별자(identifier)가 겹치면 안 됨&lt;br /&gt;
 enum Color {&lt;br /&gt;
   // 매크로와 비슷하게 주로 대문자로 쓴다&lt;br /&gt;
   COLOR_BLACK,       // 0&lt;br /&gt;
   COLOR_RED,         // 1&lt;br /&gt;
   COLOR_BLUE,        // 2&lt;br /&gt;
   COLOR_GREEN = 7,   // 7&lt;br /&gt;
   COLOR_SKYBLUE,     // 8&lt;br /&gt;
   COLOR_ORANGE       // 9&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 int main() {&lt;br /&gt;
   Color myColor = COLOR_RED; // 열거형 변수 사용 (C언어는 enum Color myColor로 선언해야 됨)&lt;br /&gt;
   // Color myColor2 = 1; (error, 열거형 변수에 정수 직접 대입 불가능)&lt;br /&gt;
   int myColor3 = COLOR_RED, myColor4 = myColor; // 정수형 변수에 열거형을 대입할 수는 있음&lt;br /&gt;
 &lt;br /&gt;
   if (myColor4 == COLOR_RED) {&lt;br /&gt;
     // ok&lt;br /&gt;
   }&lt;br /&gt;
   return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===== 자료형에게 가명 붙여주기 =====&lt;br /&gt;
** 장점 : 자료형에 나만의 의미 부여 가능, 긴 자료형 축약 가능, 유지보수에 좋음&lt;br /&gt;
** typedef : &lt;br /&gt;
 typedef std::vector&amp;amp;lt;std::pair&amp;amp;lt;std::string,int&amp;amp;gt;&amp;amp;gt; pairlist_t;&lt;br /&gt;
** using (C++11) : &lt;br /&gt;
 using pairlist_t = std::vector&amp;amp;lt;std::pair&amp;amp;lt;std::string,int&amp;amp;gt;&amp;amp;gt;;&lt;br /&gt;
** 주의사항 : 블럭 안에 선언된 문장은 블럭 안에서만 효력 있음&lt;br /&gt;
&lt;br /&gt;
===== 구조체 struct =====&lt;br /&gt;
** 구조체는 여러 연관된 멤버를 포함하는 일종의 사용자 정의 자료형&lt;br /&gt;
** 중요 특징 : C++의 구조체에는 함수를 넣을 수 있음&lt;br /&gt;
** C++의 구조체는 C언어의 구조체와 많이 다르고, class에 가깝다 (기본 접근 제한자가 public인 class)&lt;br /&gt;
** 미세팁 : sizeof로 구조체의 크기를 구하면 예상보다 클 수 있다. 빠른 처리를 위해 padding이 들어가서 그렇다.&lt;br /&gt;
 #include &amp;amp;lt;iostream&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
 using namespace std;&lt;br /&gt;
 &lt;br /&gt;
 struct Person {&lt;br /&gt;
     // 멤버 변수&lt;br /&gt;
     double height;&lt;br /&gt;
     float  weight = 100.0f; // 초기화를 안해주면 default value로 설정&lt;br /&gt;
     int    age;&lt;br /&gt;
     string name;&lt;br /&gt;
 &lt;br /&gt;
     // 멤버 함수&lt;br /&gt;
     void print() {&lt;br /&gt;
         // 자신의 멤버에 접근할 수 있다&lt;br /&gt;
         cout &amp;amp;lt;&amp;amp;lt; height &amp;amp;lt;&amp;amp;lt; &amp;quot;, &amp;quot;  &amp;amp;lt;&amp;amp;lt; weight &amp;amp;lt;&amp;amp;lt; &amp;quot;, &amp;quot;&lt;br /&gt;
              &amp;amp;lt;&amp;amp;lt; age    &amp;amp;lt;&amp;amp;lt; &amp;quot;, (&amp;quot; &amp;amp;lt;&amp;amp;lt; name   &amp;amp;lt;&amp;amp;lt; &amp;#039;)&amp;#039; &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
     }&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct Family {&lt;br /&gt;
     // 구조체 안에 구조체를 넣는 것도 가능&lt;br /&gt;
     Person me, mom, dad; // 구조체 변수 사용 (C언어는 struct Person me로 선언해야 됨)&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 Person getMe() {&lt;br /&gt;
     // 함수 반환값이 구조체일 수도 있다&lt;br /&gt;
     Person me{178.5, 50.0, 20, &amp;quot;Jack Jack&amp;quot;}; // uniform initialization으로 편하게 초기화&lt;br /&gt;
     return me;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int main() {&lt;br /&gt;
     Person me_from_func = getMe();&lt;br /&gt;
     Person me2;&lt;br /&gt;
     me2.print(); // 멤버 선택 연산자를 사용하여 멤버 함수 호출&lt;br /&gt;
 &lt;br /&gt;
     // 구조체 간의 대입 (주의 : 기대한 대로 작동이 안 될 수도 있다! 깊은 복사 파트에서 배움)&lt;br /&gt;
     me2 = me_from_func;&lt;br /&gt;
 &lt;br /&gt;
     me2.print();&lt;br /&gt;
     return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===== std::cin 더 잘 쓰기 =====&lt;br /&gt;
사용자는 언제나 프로그래머가 원치 않는 입력을 넣기 때문에 유효성 검사 및 예외 처리를 잘 해줘야 한다.&lt;br /&gt;
반복문과 조건문을 활용해 올바른 입력을 받도록 처리하자. cin.fail(), cin.clear(), cin.ignore()를 써야 한다.&lt;br /&gt;
 int x;&lt;br /&gt;
 cin &amp;amp;gt;&amp;amp;gt; x;&lt;br /&gt;
 &lt;br /&gt;
 if (cin.fail()) { // cin의 오류 플래그 반환 (잘못된 입력이 들어왔으면 true 반환)&lt;br /&gt;
   // 오류 플래그가 true이면 cin을 쓸 수 없기 때문에 상태 플래그 초기화를 꼭 해줘야 함&lt;br /&gt;
   cin.clear(); // cin 상태 플래그 초기화 (주의 : 버퍼 비우기와 관련 없음!)&lt;br /&gt;
 &lt;br /&gt;
   // 버퍼 비우기 (\n이 나올때까지 최대 32767문자를 제거)&lt;br /&gt;
   cin.ignore(32767, &amp;#039;\n&amp;#039;);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===== 메모리 동적 할당 new와 delete =====&lt;br /&gt;
* 정적 할당 : 컴파일 타임에 크기가 결정되고, stack 또는 data 영역에 할당됨 (지금까지 써온 변수)&lt;br /&gt;
* 동적 할당 : 실행 중에 크기가 결정되고, heap 영역에 할당됨&lt;br /&gt;
* C언어의 malloc, free과 비슷하다. 하지만 C++에서는 최대한 new와 delete만 쓰자 (이유는 나중에)&lt;br /&gt;
 int *ptr = new int; // 동적 할당 (실패시 예외(오류) 발생)&lt;br /&gt;
 delete ptr; // 메모리 해제 (꼭 해줘야 한다! 습관처럼 미리 delete를 써두자)&lt;br /&gt;
 ptr = nullptr; // dangling pointer 방지&lt;br /&gt;
 &lt;br /&gt;
 double *ptr2 = new double(3.0); // direct initialization&lt;br /&gt;
 delete ptr2;&lt;br /&gt;
 ptr2 = nullptr;&lt;br /&gt;
 &lt;br /&gt;
 ptr = new int{5}; // uniform initialization&lt;br /&gt;
 ptr2 = new (std::nothrow) double; // nothrow : 예외를 발생시키지 않음 (실패시 nullptr 반환)&lt;br /&gt;
 delete ptr;&lt;br /&gt;
 delete ptr2;&lt;br /&gt;
 ptr = nullptr;&lt;br /&gt;
 ptr2 = nullptr;&lt;br /&gt;
 &lt;br /&gt;
 while (true) {&lt;br /&gt;
   // memory leak 발생 (이런 실수를 줄이자)&lt;br /&gt;
   int *test = new int;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===== 동적 할당 배열 =====&lt;br /&gt;
 int length;&lt;br /&gt;
 cin &amp;amp;gt;&amp;amp;gt; length; // 배열 크기를 사용자에게 입력받음&lt;br /&gt;
 &lt;br /&gt;
 int *arr = new int[length]; // 동적 할당 배열 생성&lt;br /&gt;
 delete[] arr; // 메모리 해제&lt;br /&gt;
 &lt;br /&gt;
 arr = new int[10](); // 길이가 10인 배열 생성, ()를 붙이면 모두 0으로 초기화&lt;br /&gt;
 delete[] arr;&lt;br /&gt;
 &lt;br /&gt;
 // uniform initialization&lt;br /&gt;
 arr = new int[5]{1, 2, 3}; // {num1, num2, ...} -&amp;amp;gt; 순서대로 num1, num2로 초기화, 남는 곳은 0으로 초기화&lt;br /&gt;
 delete[] arr;&lt;br /&gt;
&lt;br /&gt;
===== 포인터와 const =====&lt;br /&gt;
# &lt;br /&gt;
 const int *ptr&lt;br /&gt;
: const int에 대한 포인터. ptr이 저장하는 주소값을 변경하는건 가능, 가리키는 변수의 값을 바꾸는 것은 불가능&lt;br /&gt;
# &lt;br /&gt;
 int *const ptr&lt;br /&gt;
: int에 대한 const 포인터. 가리키는 변수의 값을 바꾸는 것은 가능, ptr이 저장하는 주소값을 변경하는건 불가능&lt;br /&gt;
# &lt;br /&gt;
 const int *const ptr&lt;br /&gt;
: const int에 대한 const 포인터. ptr이 저장하는 주소값 변경 및 가리키는 변수의 값 변경 둘 다 불가능&lt;br /&gt;
&lt;br /&gt;
* TIP : 거꾸로 읽고, *은 pointer to로 읽으면 의미를 파악할 수 있다. ([https://blog.naver.com/herbbread/220520281357 추가설명])&lt;br /&gt;
** ex) const int *const ptr : const pointer to int const (int const는 const int와 같은 의미이다)&lt;br /&gt;
&lt;br /&gt;
===== 참조 변수 reference variable =====&lt;br /&gt;
# C++의 참조 변수는 다른 변수를 참조할 때 사용한다. (포인터와 비슷)&lt;br /&gt;
# 참조 변수는 선언과 동시에 초기화(참조)가 반드시 되어야 하며, 참조하는 대상을 다른 대상으로 바꿀 수 없다.&lt;br /&gt;
# 참조 변수는 별명을 붙이는 것이라 생각하면 된다. 기존 변수에 또 다른 이름을 하나 부여하는 것이다.&lt;br /&gt;
# 참조 변수는 일종의 별명이기 때문에 일반 변수와 같은 방식으로 사용할 수 있다.&lt;br /&gt;
# 참조 변수를 초기화할 때 참조 가능한 대상이 들어와야 하지만, const 참조 변수의 경우 리터럴로 초기화할 수 있다.&lt;br /&gt;
# 참조 변수는 주로 함수 매개 변수로 많이 사용한다. (복사 과정이 없어 속도가 빠르다)&lt;br /&gt;
# [https://boycoding.tistory.com/207 추가설명]&lt;br /&gt;
 #include &amp;amp;lt;iostream&amp;amp;gt;&lt;br /&gt;
 using namespace std;&lt;br /&gt;
 &lt;br /&gt;
 void swap(int &amp;amp;amp;x, int &amp;amp;amp;y) {&lt;br /&gt;
   int tmp = x;&lt;br /&gt;
   x = y;&lt;br /&gt;
   y = tmp;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void printRef(const int &amp;amp;amp;x) {&lt;br /&gt;
   cout &amp;amp;lt;&amp;amp;lt; x &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int main() {&lt;br /&gt;
   int x = 5, y = 20;&lt;br /&gt;
   int &amp;amp;amp;ref = x; // 참조 변수&lt;br /&gt;
   cout &amp;amp;lt;&amp;amp;lt; &amp;amp;amp;x &amp;amp;lt;&amp;amp;lt; &amp;#039; &amp;#039; &amp;amp;lt;&amp;amp;lt; &amp;amp;amp;ref &amp;amp;lt;&amp;amp;lt; endl; // x와 ref의 주소값이 같음 (실제로 같은 변수이기 때문에)&lt;br /&gt;
 &lt;br /&gt;
   ref = 10;&lt;br /&gt;
   cout &amp;amp;lt;&amp;amp;lt; x &amp;amp;lt;&amp;amp;lt; &amp;#039; &amp;#039; &amp;amp;lt;&amp;amp;lt; y &amp;amp;lt;&amp;amp;lt; &amp;#039; &amp;#039; &amp;amp;lt;&amp;amp;lt; ref &amp;amp;lt;&amp;amp;lt; endl; // 10 20 10 출력&lt;br /&gt;
 &lt;br /&gt;
   ref = y;&lt;br /&gt;
   ref += 1;&lt;br /&gt;
   cout &amp;amp;lt;&amp;amp;lt; x &amp;amp;lt;&amp;amp;lt; &amp;#039; &amp;#039; &amp;amp;lt;&amp;amp;lt; y &amp;amp;lt;&amp;amp;lt; &amp;#039; &amp;#039; &amp;amp;lt;&amp;amp;lt; ref &amp;amp;lt;&amp;amp;lt; endl; // 21 20 21 출력&lt;br /&gt;
 &lt;br /&gt;
   const int &amp;amp;amp;cref = 10; // const 참조 변수는 리터럴로 초기화 가능 (리터럴이 임시변수에 저장됨)&lt;br /&gt;
   cout &amp;amp;lt;&amp;amp;lt; &amp;amp;amp;cref &amp;amp;lt;&amp;amp;lt; &amp;#039; &amp;#039; &amp;amp;lt;&amp;amp;lt; cref &amp;amp;lt;&amp;amp;lt; endl; // 주소값도 있고 값도 제대로 출력&lt;br /&gt;
 &lt;br /&gt;
   // int &amp;amp;amp;ref2 = 10; (error, 일반 참조 변수는 l-value로 초기화해야 됨)&lt;br /&gt;
   // cref = 30; (error, const 참조 변수는 값 변경 불가능)&lt;br /&gt;
 &lt;br /&gt;
   int a = 1, b = 2;&lt;br /&gt;
   swap(a, b); // 참조 변수를 활용한 함수 호출&lt;br /&gt;
   cout &amp;amp;lt;&amp;amp;lt; a &amp;amp;lt;&amp;amp;lt; &amp;#039; &amp;#039; &amp;amp;lt;&amp;amp;lt; b &amp;amp;lt;&amp;amp;lt; endl; // 2 1 출력&lt;br /&gt;
 &lt;br /&gt;
   printRef(12345); // 매개변수가 const 참조 변수이기 때문에 리터럴을 넣어도 된다.&lt;br /&gt;
   return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== 20190107 ====&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;Unknown</name></author>
	</entry>
</feed>