integer의 약자인 int로 변수를 선언한다. 위와 같이 숫자 앞에 0과 b, x를 불여 다양한 진수의 형태로 정수를 저장 할 수 있다. short shor int
실수형 >float, double, long double을 통해 변수를 선언한다. 부동 소수점 > 실수를 표현할 때 소수점의 위치를 고정시키지 않고 지수부와 가수부를 나타내어 표현한 것이다. 10진수 실수를 부동 소수점으로 표현하는 법 > 10진수를 2진수로 변환
char 로 선언하며 1byte의 크기를 차지한다.문자형은 아스키코드에 따라서 숫자를 문자로 표현한 것으로,실제로는 정수형의 형태를 띄고 있다.코드 실행 결과a97abool 로 선언하며 논리적 참과 거짓을 나타낸다.코드 실행 결과10truefalsetrue
cstdio 헤더파일 안의 함수이며 이 함수를 이용하여 출력을 할 수 있다.코드 실행 결과1 1.5000 a Hello World위 코드 처럼 %로 시작하는 서식과 맞는 변수타입을 맞추어 출력을 한다.각 변수 타입별 서식 문자코드 실행 결과
cout > iostream 헤더 파일을 선언해야 하며 C++ 표준출력을 함수이다. 시프트 연산자를 오버로딩 하여 어떻게 출력할지를 결정함. ` 코드 실행 결과 > 1 a a aa Hello \*\\\\\\\1 +1 1 16진수 10 8진수 20 \\\\\\\+1.1
기본적인 사칙연산을 나타낸다결합 법칙은 단항 연산을 제외하면 왼쪽에서 오른쪽을 따른다.두 변수의 값을 비교하여 논리적 참과 거짓을 도출한다.결합 법칙은 왼쪽에서 오른쪽을 따른다.삼단비교 <=> : C++ 20에 추가된 구문으로 여러 함수에 적용 하여 다양한 방법으
조건문의 논리적인 참과 거짓을 구분하여 참 일때 실행하고 거짓일 때 실행을 안한다.괄호안의 인티저 값에 따라 case를 설정하여 그 case에 있는 종속문을 실행한다.코드 실행 결과badswitch문은 int값만 받기 때문에 이외의 자료형은 사용할 수 없지만 예외로 문
반복문으로 조건을 만족할 때까지 설정한 변수를 갱신(가감) 하고 그 횟수만큼 반복한다.초기화조건(true 일시 다음 단계, false 일시 break)반복할 구문 수행갱신조건확인 반복코드 실행 결과0 1 2 3 4 5 6 7 8 90 2 4 6 8 10while() 조
배열 - 자료형[상수] > [ ] 안의 상수의 크기만큼 배열의 공간을 할당하고 그 공간 1개의 크기는 자료형의 크기와 같다. ex) int a[10]의 크기 = 4 * 10 byte [ ] 안에는 변수가 들어 올 수 없으며 항상 상수만을 받는다. 코드 실행 결과
char str = "문자열" 로 표현하며char형 배열에 문자를 넣은 것이다.문자열은 항상 끝에 NULL 문자를 넣어 문자열이 끝이 났음을 표시 해야한다.코드 실행 결과abc4< cstring > 헤더파일내의 함수로 C언어에서 주로 사용한다코드 실행 결과str
구조체 struct > struct를 이용하여 새로운 자료형을 만들어 그 자료형 내에 다양한 자료형을 활용할 수 있다. 코드 실행 결과 > 키 : 172.8 몸무게 : 58.2 이름 : Ryu 등급 : 3 왼쪽 시력 : 0.1 오른쪽 시력 : 0.12 person
코드 실행 결과12abcProduct0의 크기 : 20Product1의 크기 : 16ID의 크기 : 12구조체의 크기는 구조체내의 가장 큰 크기를 가진 자료형 크기의 배수로 가질 수 밖에 없지만 공동체를 사용하여 그 크기를 줄인 모습이다.
정수형을 순서대로 저장하거나 각각의 값을 매긴다코드 실행 결과Red : 255Green : 128Blue : 64SIZE : 3Text Bold : 1text Bold : 3
< array > 헤더파일내의 함수이며 std::array로 선언한다.array<자료형, 크기>의 형태를 띈다.코드 실행 결과arr0 : 0arr.at(1) : 1arr.size() : 5arr.front() : 0arr.back() : 4Smallerarr
for문의 초기화식, 조건식, 증감식을 생략하고for(변수 : 배열)의 형태로 배열의 처음부터 끝까지 출력한다.코드 실행 결과1 2 3 4 5114.3 | 152.4132.1 | 162.4for문 안의 변수는 배열 원소의 참조자의 역할을 한다.
포인터 > 자료형* 변수 의 형태를 띄며 메몰리 주소를 저장하고 있는 변수이다. ex) 위 처럼 포인터는 값을 저장하고 있는 변수의 주소값을 저장한다. 코드 실행 결과 >
기존의 지역 변수는 자동 주기를 가지며 정의되는 시점에서 생성되고 초기화되며 정의된 블록이 끝나는 지점에서 소멸한다.하지만 정적 지역 변수는 주기가 자동 주기에서 정적 주기로 바뀌며 생성된 스코프(=범위, 블럭)이 종료된 이후에도 해당 값을 유지한다.또한, 정적 변수는
포인터에 할당하는 값으로 아무것도 가리키지 않겠다는 의미코드 실행 결과00000251C9FD68500000000000000000
void는 비어 있다는 의미로 형이 없다는 것을 나타낸다.코스 실행 결과10
vector< 자료형 > 변수명 의 형식으로 선언하며자동으로 메모리가 할당되는 동적 배열이다.stack의 구조와 비슷한 구조를 띄고 있다.코드 실행 결과0000000000 11111 01000002227F1C685012000002227F1D7460230000022
포인ㅌ코스 실행 결과101010 202020 303030 404040참조자와 포인터가 가리키는 값을 변경해도 원본의 값과 원본이 참조하는 값, 포인터가 가리키는 값이 변경되는 것을 볼 수 있다.이를 vector와 arr에도 동일하게 적용할 수 있다.코드 실행 결과123
함수란 특별한 목적의 작업을 수행하기 위해 독립적으로 설계된 코드의 집합이다함수를 사용하는 가장 큰 목적은 반복적인 프로그래밍을 피하는 것이다.코드 실행 결과1012good30함수를 정의할 때 주의할 점매개변수의 자료형이 일치하여야함함수를 정의하기 전에 먼저 사용한다면
함수 내부에서 함수가 자기 자신을 또 다시 호출하는 것재귀 호출을 중단할 조건문이 없다면 끝없이 반복되므로 조건이 변경될 명령문이 필요하다코드 실행 결과3 02 11 20 30 31 22 13 0 5! = 120fibonacci 5 th = 8 012345689노드의
코드 실행 결과x = 10y = 20x addr = 000000ADE32FF694y addr = 000000ADE32FF6B4 px addr = 000000ADE32FF670py addr = 000000ADE32FF678 x = 10y = 20x addr = 00000
함수 포인터를 이용해 주소를 매개변수로 받아 기존의 복사된 개체를 변경하는 것이 아닌 주소가 가리키는 값을 변경한다.코드 실행 결과10202010코드 실행 결과2030abcdefgh
참조에 의한 전달 방법은 인수로 전달된 변수의 값을 복사하는 것이 아닌, 원본 데이터를 직접 전달하는 것이다.코드 실행 결과2010000010.11
함수 매개변수의 기본값은 미리 정의할 수 있으며 함수를 호출할 때 인수를 전다랗지 않으면, 함수는 자동으로 미리 정의되어 있는 디폴트 인수값을 사용한다.코드 실행 결과91367.1154.220.1123.2
함수 오버로딩은 같은 이름의 함수를 중복하여 정의하는 것을 의미한다함수 이름은 같아도 매개변수의 형태와 개수에 따라 함수의 기능이 달라진다.이는 다형성에 해당코드 실행 결과56 함수 이름은 같지만 매개변수에 따라 결과가 5와 6으로 나뉘었다.
함수 포인터는 함수의 시작 주소를 가리키는 포인터 상수이다코드 실행결과3333게임 속 케릭터가 데미지를 입는 것과 죽었을 경우 저장해둔 diecallback 함수를 실행한다.코드 실행 결과damaged!character health : 100damaged!charact
ESP : 스택의 가장 마지막 값을 가리키는 주소값EBP : 레지스터 베이스 포인터EIP : 다음에 실행할 메모리 주소함수 호출에는 Callstack 과정이 이뤄진다.sum 함수를 호출하는 과정 1\. 매개변수 y, x 순으로 저장 2\. EIP 주소, return
인라인 함수는 호출될 때 일반적인 함수의 호출 과정을 거치지 않고, 함수의 모든 코드를 호출된 자리에 바로 삽입하는 방식이다.inline 함수가 길 경우에는 컴파일 빌드에서 나온 결과물의 크기가 커지게 된다.호출시간은 절약되나 호출 과정으로 생기는 여러 이점을 포기하므
유효 범위란 하나의 변환 단위 내에서 해당 변수가 사용될 수 있는 범위를 나타낸다.함수 내에서 선언된 변수는 함수 내에서만 사용할 수 있고, 함수 밖에서 선언된 변수는 변수가 선언된 이후에 나오는 모든 함수에서 사용할 수 있다.코드 실행 결과0000000D9C3AFFB
자동 변수 : 블럭을 벗어나면 해제가 된다 stack에 할당됨.정적 변수 : 데이터 영역에 저장되며 프로그램이 실행되는 도중에 한번만 초기화가 되고 프로그램이 종료될 때 해제가 된다동적 변수 : 이름이 없기 때문에 new로 할당을 해야하며 사용 이후 사용자가 반드시 해
객체 지향 프로그래밍에서는 모든 데이터를 객체(object)로 취급하며, 객체가 바로 프로그래밍의 중심이 된다.코드 실행 결과HelloWorldhelloworld
외부에서 접근이 불가 개발자 간의 의사소통의 혼동을 줄임(캡슐화)public을 사용하여 접근 허용맴버 함수 매소드를 이용하여 private에 접근 가능맴버 변수는 property라고 칭함메소드를 이용하여 private 내의 \_helath, \_power, \_name
특별 맴버 함수생성자가 전혀 정의되어 있지 않으면 컴파일러가 자동으로 디폴트 생성자를 만든다생성자의 오버로딩울 보여줌과 동시에 다양한 형태로 인스턴스를 선언한다.실행 결과Player 200, 50Player 300, 100Player 400, 20Player 100,
소멸자는 객체의 수명이 끝나면 컴파일러에 의해 자동으로 호출되어 사용이 끝난 객체를 정리해준다.소멸자의 이름은 해당 클래스의 이름과 같으며 이름 앞에 물결 표시(~)를 붙여 생성자와 구분한다.소멸자의 특징 1\. 소멸자는 인수를 가지지 않는다. 2\. 소멸자는 반환
인라인이 아닌 함수나 멤버함수, 전역변수, 정적데이터멤버는 한 프로그램내에서 단 한 번만 정의 되어야한다.클래스형(구조체, 유니온포함)과 인라인 함수는 적어도 한 번역 단위(translation unit)마다 한 번씩 정의되어야 하며 모든 정의는 동일해야 한다.함수는
C++에서는 모든 멤버 함수가 자신만의 this 포인터를 가지고 있으며this 포인터는 해당 멤버 함수를 호출한 객체를 가리키게 되며, 호출된 멤버 함수의 숨은 인수로 전달된다.이렇게 함으로써 호출된 멤버 함수는 자신을 호출한 객체가 무엇인지 정확히 파악할 수 있게 되
const는 상수를 의미하며 한번 초기화하면 그 값을 변경할 수 없는 멤버 변수를 의미한다.상수 멤버 함수란 호출한 객체의 데이터를 변경할 수 없는 멤버 함수를 의미한다.함수의 원형에 const를 붙여서 사용const의 사용이 가능한 경우const 사용이 불가한 경우
클래스에는 속하지만 객체 별로 할당되지 않고 클래스의 모든 객체가 공유하는 멤버를 의미한다.멤버 변수가 정적으로 선언되면 멤버 변수가 정적 공간에 저장 되고 해당 클래스의 모든 객체에 대해 하나의 데이터만이 유지가 된다.프로그램 실행중에 메모리 할당이 한번 되며 프로그
멤버 함수 포인터는 기존 함수 포인터와 같이 함수를 가리키는데, 클래스의 멤버 함수를 가리킨다는 점이 다르다.멤버 함수 선언은 위처럼 하게되며 표현함에 있어 난해한 부분이 있어 다른 형태로 바꿔 쓸 수 있다.typedef, usingfunctional 헤더 이용예외 적
오버로딩이란 같은 일을 처리하는 함수를 매개변수의 형식을 달리하여 하나의 이름으로 작성할 수 있게 하는 것으로, 연산자 오버로딩은 하나의 연산자를 여러 의미로 사용할 수 있게 해준다. 함수 문법우선 클래스안의 백터와 맴버함수를 public으로 선언하여 연산이 자유로울
비교 연산자를 이용하여 불리언타입으로 반환을 한다.3방향 비교 연산자는 두 객체를 비교하여 std::strong_ordering, std::weak_ordering, std::partial_ordering를 반환한다.여기서 strong_ordering, weak_ord
or 연산자는 앞이 true 일때 뒤의 문을 실행하지 않고and 연산자는 앞이 false 일때 뒤의 문을 실행하지 않는다.ex) true || func() false && func() func()를 실행하지 않는다.실행 결과emptys0 = falses1 = tr
실행 결과0 0 00 0 02 4 82 4 8\-1 -1 -10 0 02 4 84 8 161 2 4
변수에 다른 변수의 값을 대입하기 위해서는 대입 연산자를 사용하며 이는 복사라고 볼 수 있다. 하지만 대입 연산자를 이용한 복사는 얕은 복사로 수행된다.얕은 복사란 값을 복사하는 것이 아닌 값을 가리키는 포인터를 복사하는 것이다. 따라서 변수 생성에서는 문제가 되지 않
실행 결과abcdef실행 결과A1B1C1D1실행 결과1
Vector를 이용한 첨자 연산 문자열을 이용한 첨자 연산 hashtable을 이용한 첨자 연산
실행 결과2001m2.001km65
실행 결과 > virtual로 함수를 선언했을 때   Base   Derived   Derived   Derived   Derived   virtual로 함수를 선언안했을 때   Base   Der
기존의 재정의가 가능한 함수를 가리키는 가상 함수와 다르게 순수 가상 함수는 파생 클래스에서 반드시 재정의해야 하는 멤버 함수를 의미한다.일바적으로 함수의 동작을 정의하는 본체를 가지고 있지 않다.하나 이상의 순수 가상 함수를 포함하는 클래스를 의미한다.실행 결과314
is a 관계 : (도형과 원) public 상속has a 관계 : (사각형과 선분) private 상속도형 is 원, 사격형 has 선분실행 결과102010vector를 private 상속일때사용자가 public으로 정의한 멤버함수만 노출이 된다.외부에서 부모의 멤버
위와 같은 방법으로 에러 해결위와 같은 형태로 상속이 되며 가장 하위 클래스인 C는 A인 부모가 2개라고 인식이 된다.실행 결과Base(10)BaseABase(20)BaseBDerived Base의 생성자를 2번 호출한 것을 알 수 있다.위와 같이 virtual 상속을
자료형, 함수의 매개변수 type.id데이터 손실, demotion, 축소변환축소변환이 일어나는지 확인을 하려면중괄호를 이용해 컴파일이 되는지 확인을 한다.실행 결과정수의 형변환은 기본적으로 int로 형변환이 된다.산술 연산과정에서는 더 큰 자료형으로 형변환이 일어난다
형변환은 위험하지만 C스타일의 형변환은 많이 일어난다.compile 타임에 형변환에 대한 타입 오류를 잡아준다.암시적인 형 변환위 코드에서는 정상적으로 컴파일이 된듯 보이지만static_cast를 이용하여 잘못된 형 변환을 방지 할 수 있다.실행 결과실행 결과01exp
포인터 또는 참조형의 상수성을 잠깐 제거해주는데 사용한다.volatile 키워드를 잠깐 제거해주는데에도 사용한다.컴파일 시간을 최적화하지 않겠다고 선언하는것.지역적 프로그래밍의 흐름과는 관계없이 외부에서 변수를 바꿀 수 있다.증가 연산 없이 바로 3을 eax로 move
부모 클래스의 포인터에서 자식 클래스의 포인터로 안전한 다운 캐스팅 해주는 연산자 성공할 경우 : new_type의 value를 return 합니다. 실패할 경우(new_type = pointer) : null pointer 실패할 경우(newtype = refere
임이의 포인터 타입끼리 변환을 허용하는 연산자 특정 디바이스의 주소를 가리킬 수 있다. 실행 결과 > 1.4013e-45 1.4013e-45 1
C style casting은 권장하지 않는 형 변환임.위 같은 형식으로 c style casting을 구현할 수 있다.\\하지만 const casting을 예시로 들었을 때C 스타일 보다 어떠한 캐스팅인지 식별하는데에 명확하다는 장점이 있으며 다른 캐스팅도 마찬가지다
어떠한 함수를 호출 했을 때 오류가 났을 시에 해야할 조치 강제 종료 실행 결과 실행 결과 > 0
throw > 예외가 발생 했음을 알리는 문장의 구성에 사용된다. try 문에서 발생한 오류에 대한 정보를 전달. 예제 실행 결과 > Terminated (코드: 123개) try catch > catch(...)은 throw의 반환 값과 상관 없이 실행된다.
RAII (Resource Equation Is Initialization) - 자원을 얻는 것은 초기화다.스코프를 벗어나면 소멸자를 호출하는 메커니즘을 이용해 자원을 초기화 하는 것.자원을 사용하고 해제 할때 사용하는 기법실행 결과exception동적 할당을 하게 되
noexcept 함수에서 어떠한 예외처리를 호출하게 되면 std::terminate()를 호출 하여 강제 종료 한다.기본적으로 대부분의 함수들은 noexcept(false)의 형태를 취하고 있다.소멸자와 같이 예외처리 되면 치명적인 문제가 발생하는 경우는 noexcep
타입에 의존하지 않고 하나의 값이 여러 다른 데이터 타입을 가질 수 있는 것.프로그램의 알고리즘에 그 중점을 둔다.type이 파라미터로 작용하여 템플릿이 type을 추론하여 바꿔준다명시적으로 선언하기 위해선 함수 옆에 < > 안에 타입을 넣어준다ex) swap&l
클래스의 일반화된 선언이다.함수 템플릿과 동작은 같으며, 그 대상이 클래스라는 점만 다르다.하나 이상의 템플릿 인수를 가지는 클래스 템플릿을 선언할 수 있다.클래스 템플릿에 디폴트 템플릿 인수를 명시할 수 있다.클래스 템플릿를 기초 클래스로 하여 상속할 수 있다.실행
ㄴㅇㄱㄹㄴㅇㅁ
객체에 대한 특정한 변형을 정의하고 이름을 붙인 후 그것을 물리적인 어떤 장소에 위치시키는 드으이 작업을 톻클래스 템플릿을 클래스로 사용하기 위해서는 instantiate를 해야하고함수 템플릿을 함수로 사용하기 위해서는 instantiate를 해야한다.함수 템플릿을 헤
실행 결과100위 결과를 보았을 때 sum 함수가 return 하는 값이 for문이 실행 될 때 마다 바뀌는 것을 알 수 있다.100100.9처음 받는 인자의 타입에 따라 반환 type T가 달라져 반환하는 타입이 달라진다.
데이터 타입에 맞추어 동작을 시키는 것이 목적.type이 포인터인지 아닌지를 bool 타입으로 나타내준다.위와 마찬가지로 is_X<type>::value 는 value가 X가 맞는지 판별한다. data type은 bool이다.실행 결과falsetrue위와 같이 구
런 타임에 어떤 타입을 결정해주는 메커니즘 Run Time Type Information Run Time Type Idification 위와 같이 RTTI를 사용하지 않았을 경우 위 코드를 실행 할 때 컴파일이 되지 않는다. 이유는 typeid와 dynamic_ca
STL은 알고리즘을 일반화한 표현을 제공하여, 데이터의 추상화와 코드를 재활용할 수 있게 한다.container, iterator, algorithm 3가지 구성요소의 템플릿을 제공한다.같은 타입의 여러 객체를 저장하는 일종의 집합이라 할 수 있다.컨테이너는 클래스 템
v.push_back(<data>)vector의 최후위에 값을 추가한다.v.insert(<iterator>, <data>)vector의 인덱스에 값을 추가한다.이때 인덱스의 파라미터는 iterator type의 데이터만 받는다.v.reserve(<
list는 양방향 linked_listhead <-> node1 <-> node2 <-> tailnode의 주소가 제각각이기 때문에 첨자 연산자를 사용할 시 시간복잡도가 높아져 허용하지 않는다.std::advance(<iterator>, <i
각 노드가 key와 value의 쌍으로 이루어진 트리구조이며 중복을 허용하지 않는다.\`std::map<, > m\`map\[key]의 형태로 value를 호출할 수 있지만const로 선언된 map의 경우 호출이 불가하다.2개의 객체를 하나의 객체로 취급할 수 있
노드 기반의 컨테이너이며 균형 이진트리의 구조이다.std::set<\[type]> smap과 마찬가지로 중복을 허용하지 않으며 삽입 할 시에 정렬이 된다.실행 결과2false10true1 2 3 4 10std::multset<\[type]> ms중복이 허용되
key와 value로 데이터를 저장하는 자료구조로 내부적으로 배열(bucket)을 사용하여 데이터를 저장한다.시간복잡도는 O(1)로 O(log n)인 BST보다 빠르다.이렇게 빠른 검색이 가능한 이유는 각각의 key값에 해시함수를 적용해 배열의 고유한 index를 생성
container::iterator itercontainer에 접근하여 요소를 순회하는데 사용하는 포인터와 같은 객체이다.iterator를 이용해 저장/삭제/탐색을 할 수 있다.실행 결과01230실행 결과truefalsetrue falsetypename TIterato
Container의 반복자를 이용해 정렬, 탐색, 삭제 등의 작업을 쉽게 수행할 수 있도록 도와주는 라이브러리or첫번째 파라미터는 Iterator의 시작두번째 파라미터는 Iterator의 끝세번째 파라미터는 특정한 조건을 추가인자로 받는 경우가 있으며 이를 서술자(Pr
decltype(<타입을 나타내는 식>)decltype은 () 안의 식이 나타내는 타입으로 치환되어 타입을 알아내거나 혹은 같은 타입으로 선언, 참조 등을 할 때 용이하다.decltype(auto) num7 = 70; decltype의 식에 auto를 넣어도 ty
\[캡쳐](매개변수) -> <반환type> {함수동작}(호출인자)일반 함수에서 함수 이름이 없어지고 동작만 있는 함수lambda는 사실상 함수 객체라고 봐도 무방하다.매개변수, 반환타입, 호출인자는 생략 가능하다.실행 결과3010매개변수가 없는 람다 : \[] {
컴파일 타임에 실행하여 객체나 함수의 반환값을 컴파일 타임에 값을 알 수 있게 해준다.이를 상수식이라 부르며 constexpr로서 표현한다.위 예제를 보면 constexpr로 상수식을 표현했을 때 컴파일타임에 sum함수가 실행이되어 런타임 에는 함수호출 조차 안된것을
좌측값(L value) : 어떠한 메모리 위치를 가리키는데, & 연산자를 통해 그위치를 참조할 수 있다.우측값(R value) : 좌측값이 아닌 값들위와 같이 정의가 가능하다.좌측값은 어떠한 메모리 위치를 가리키는데, & 연산자를 통해 그 위치를 참조할 수 있다. 우측
함수 탬플릿의 매개 타입이 T&&형태이고 T가 추론될 경우, 객체를 auto&& 타입으로 선언한 경우 그 매개변수나 객체는 보편 참조이다.실행결과goo(int&)인자로 들어온 10을 lvalue로 판단하여 goo(int&)가 실행되었다.수정할 시에 goo의 인자인 va
포인터처럼 동작하는 클래스 탬플릿으로, 사용이 끝난 메모리를 자동으로 해제해준다.unique_ptrshared_ptrweak_ptr위 3가지 종류가 있다.하나의 스마트 포인터만이 특정 객체를 소유할 수 있도록 독점 소유권을 가진다.해당 객체의 소유권을 가지고 있을 때만
Callable들을 객체의 형태로 보관할 수 있는 클래스이다.std::function<\[return type](\[parameter type])> func위와 같은 형태로 func이라는 객체에 Callable을 보관할 수 있다.실행 결과int \_\_cdecl(
thread의 정의 프로세스 내에서 실제로 작업을 수행하는 주체로, CPU 코어에서 돌아가는 프로그램의 단위이다. 실행 결과 > thread ID : 45796 thread ID : 43432 thread complete Complete thread를 생성한 후
미래에 쓰레드가 원하는 데이터를 돌려주겠다는 약속이이라고 볼수 있다.promise가 future한테 값을 보내준다고 본다.실행 결과10future에서 get을 호출하면 설정된 객체가 이동되기 대문에 get을 두번 호출할 수 없다.set_value와 get()은 한번만