본문 바로가기
C++/Unmanaged C++ 강좌 노트

[C++]bool과 참조 C++ 새로운 기능

by 계양구놈팽이 2023. 3. 1.

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

참조에 의한 호출 (C)

 함수를 콜하면서 그림에서 나온것처럼 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