Udemy에서 C++ 언매니지드 프로그래밍을 수강하면서 배운 내용을 정리한것 입니다.
초기 C++의 새로운 기능들
- bool 데이터형
- true / false
- 참조(refernce)
- 매우 중요. 성능 유지 하면서 값을 참조
- 개체(객체)지향 프로그래밍(OOP)
C++의 새로운 기능들
- C++ 표준 위원회 "너가 뭘 좋아하는지 몰라서 다 준비해 봤어"
- 많은 기능이 나왔지만, 쓰이지 않는 기능 또한 많다.
C++의 진짜 전문가는 사용하지 말아야 할 기능을 아는 사람이다.
Bool 데이터형
OLD
// 만약 student가 아니면
if(IsStudent() == 0)
{
//...
}
// 만약 student라면
if(IsStudent() == <non-zero>) // <---C 표준상 0이 아닌값이 true이다 1이건 2건 상관없다.
{
//...
}
NEW
// 만약 student가 아니면
if(IsStudent() == false)
{
//...
}
// 만약 student라면
if(IsStudent() == true)
{
//...
}
참조 (Reference)
C++에만 있는 독특한 기능이라고 볼 수 있다. JAVA에서 포인터를 대신하여 할려고 했던 기능을 C++에서 안정성을 보장하면서 구현해 내었다.
C++에서 포인터연산이 필요 없을때 ( 주소변경이 필요 없을때) 참조를 사용하면 좋다.
값에 의한 호출 (C/Java/C#)
void swap(int arg1, int arg2)
{
int temp = arg1;
arg1 = arg2;
arg2 = temp;
}
int main()
{
int num 1 = 10;
int num 2 = 20;
swap(num1, num2);
}
프로그래밍을 하면서 변수를 생성하거나 새로운 오브젝트를 만들때 스텍이나 힙이라는 메모리에 들어간다.
함수에서 생성한 지역변수는 전부 스택으로 들어간다.
Swap함수가 실행되면, 원본(num1 과 num2)는 바뀌지 않고 스택에 할당된 변수만 해지된다.
참조에 의한 호출 (C)
void swap(int* arg1, int* arg2)
{
int temp = *arg1;
*arg1 = *arg2;
*arg2 = *temp;
}
int main()
{
int num 1 = 10;
int num 2 = 20;
swap(&num1, &num2);
}
포인터는 주소를 저장하는 변수.
swap(&num1, &num2) 에서 나온것처럼 매게변수로 주소를 전달해준다.
&num 1 => 2
&num 2 => 3
함수를 콜하면서 그림에서 나온것처럼 num1과 num2의 주소가 복사되었다.
int temp = *arg1 // arg1 주소에 있는 값을 읽어와서 temp 변수에 저장
*arg1 = *arg2 // arg1 주소에 있는 값을 arg2 주소에서 가져온 값으로 덮어쓰기
*arg2 = temp // temp에 임시저장한 값을 arg2의 주소에 저장
C에서는 이렇게 * 표시가 있는지 없는지로 값에 의한 호출인지, 참조에 의한 호출인지 명확히 알 수 있다.
값에 의한 호출은 모든 타입(개체를 포함)에 똑같이 동작(C/C++)
좀더 쉽게 정리하면 다음과 같이 구분해보자
- 값에 의한 전 : 사본을 고치느냐
- 참조에 의한 전달: 원본을 고치느냐
C++에는 더 좋은 해결책이 있다!!!
참조란?
- 별칭
int number = 100;
int &ref_number = number // number의 다른 이름 별명
- NULL이 될 수 없음 (포인터 처럼 null pointer라는게 존재할 수 없다.)
- 초기화 중에 반드시 선언되어야함
- 참조하는 대상을 바꿀 수 없음
int number 1 = 100;
int number 2 = 200;
int& reference = number1;
reference = number2; // 세 변수 값이 모두 200이됨
포인터 변수가 포인터형 이라고 불리듯이, 참조 변수를 참조형이라고 한다.
참조형의 소소한 장점
- 참조형은 null이 될 수 없으며, null 체크가 필요 없다.
- 우리가 소유하지 않은 메모리 장소를 가리킬 수 없다.
컴퓨터는 참조가 뭔지 알까??
컴퓨터 어셈블리어단 까지 가면 참조와 포인터는 다른가?
- 모름
- 포인터와 참조는 같은 어셈블리 명령어를 생성함
- 참조는 오직 인간을 위한 것임
- 컴파일러는 참조를 포인터로 바꿔 줌(메모리 indirection). 기계가 이해할 수 있도록
C에 없지만 다른 언어에 있는 기능은 다른 엔지니어가 로우레벨 언어(대표적으로 C) 구현한 것이다.
'C++ > Unmanaged C++ 강좌 노트' 카테고리의 다른 글
[C++]인라인 함수 (0) | 2023.03.04 |
---|---|
[C++]Static(정적) 키워드 (0) | 2023.03.03 |
[C++]파일 입출력(I/O) (4) | 2023.03.01 |
[C++]std::string C++의 신 기능은 항상 우월한가? (0) | 2023.03.01 |