*여러 자료를 찾아가며 정리한 것이라 간혹 오류가 있을 수 있습니다.
시작하기에 앞서
현재 나의 프로그래밍 경험
- 대학 수강 과목: 알고리즘(C), 객체지향프밍(Python), 프언(C), 임베디드시스템설계(Java) 등 학습
- 학부연구생 경험으로 Python 능숙
- C++은 접해본 적은 있으나 거의 초보
목표
- 한달 내 프로그래머스 C++ lv.1 문제 풀 정도의 실력
- 로봇 프로그래밍을 위한 실력 쌓기
- 메모리 관리에 대해 자세히 알고 싶음
참고 학습 자료
- C/C++ 강의 https://youtu.be/-h_uxJiiiqg
- 이것이 C++ 이다 https://youtu.be/8ZiSzteFRYc
학습 내용
C++ 특징
가상머신이 필요 없어 실행 속도가 빠름. 대신 개발자가 직접 메모리 관리를 해야함(장점이자 단점)
자료형
- 정수형: char(1byte=8bit), short(2), int(4), long(4), long long(8)
- 실수형: float(4), double(8)
- 양수 자료형: unsigned char, int, ...
- auto: 컴파일러가 자동으로 형식을 규정하는 자료형(ex. auto a = 10;)
Instance
C++에서는 C언어의 '변수' 대신 '인스턴스'라는 표현을 많이 쓴다. 예를 들어, int nData;에서 "nData는 int 형식에 대한 인스터스이다." 라고 말한다.
Namespace
함수, 구조체, 변수 이름 등의 '소속' 개념으로 생각하면 된다.
C++의 표준 입출력
#include "pch.h"
#include <iostream> //헤더 파일
int main()
{
// C의 기본적인 출력
printf("Hello World!\n");
// C++의 출력은 std::cout
std::cout << "Hello World!\n"; // std::cout은 std namespace에 속한다
// 서식 문자 필요 없음
int num = 10;
std::cout << num; // 10
std::cout << "number is: " << num; //number is: 10
// 개행
std::cout << "개행\n";
std::cout << "개행" << std::endl;
// 입력은 std::cin
int nAge;
std::cout << "나이를 입력하세요: \n";
std::cin >> nAge;
char nJob[32];
std::cout << "직업을 입력하세요: \n";
std::cin >> nJob;
std::string strName;
std::cout << "이름을 입력하세요: \n";
std::cin >> strName;
std::cout << "당신의 이름은 " << strName << "이고, " << "나이는 " << nAge << "살이며, " << "직업은 " << nJob << "입니다.\n";
return 0;
}
C++의 변수 선언 및 정의
// C언어 스타일의 선언 및 정리
int a = 10;
// C++ 스타일의 선언 및 정의
int b(10);
// 복사(clone) 가능
int b(a); // 10
// 이름이 없는 인스턴스 선언 및 정의도 가능
int (10);
// auto는 자료형을 모르더라도 알아서 따라감
auto b(a);
메모리 동적 할당
동적으로 메모리 할당하기 위해서 C언어에서는 함수의 일종인 malloc(혹은 calloc)을 사용했었다.
C++에서는 동적 할당을 위해 연산자 new를 새로 도입하였다.
// C언어 스타일의 동적할당
int* pnData = (int*)malloc(sizeof(int));
free(pnData);
// C++ 스타일의 동적할당
int* pnNewData = new int;
// 삭제는 delete를 사용
delete pnNewData;
// 만약 배열이라면,
int* pnNewData2 = new int[5];
delete [] pnNewData2 // delete 뒤에 []를 붙여서 배열 전체를 삭제한다
이 new 사용의 장점은 자료형의 크기를 신경쓰지 않아도 된다는 것이다.
참조자(Reference)(*중요*)
참조자는 할당된 하나의 메모리 공간에 다른 이름을 붙이는 것을 의미한다. 즉, 별명과 같은 역할을 한다.
'&'을 사용하여 참조자를 나타내며, 변수와 참조자는 같은 메모리 주소를 가진다.
int num = 10; // 혹은 int nData(10);
int &ref = num;
std::cout << num << std::endl; // 10
std::cout << ref << std::endl; // 10
// 메모리 주소 값 출력
std::cout << &num << std::endl; // 007CFBFC
std::cout << &ref << std::endl; // 007CFBFC
- 참조자를 선언하기 위한 조건
- 반드시 선언되어 있는 변수에 대해서만 참조가 가능하다.
- 한 번 누군가를 참조했다면 참조의 대상을 바꿀 수 없다. (포인터는 변수라 참조 대상이 바뀔 수 있다)
- 아무것도 참조하지 않는 형태, 즉 NULL로 초기화 할 수 없다.
- 상수 참조(Const Reference)
일반적으로 참조자는 상수를 참조할 수 없다. 그러나 const를 이용하면 상수도 참조가 가능하다.
다음과 같은 예시를 살펴보면, Add 함수의 매개변수를 const 참조자로 받는 경우, 따로 변수를 선언할 필요 없이 상수로 함수를 호출할 수 있다.
// const 참조자가 있는 경우
int Add(const int& num1, const int& num2) {
return num1 + num2;
}
int main() {
std::cout << Add(1, 2) << std::endl;
return 0;
}
그러나, const 참조자를 사용하지 않는 경우, num1과 num2 변수를 선언하여 전달해야하는 번거로움이 발생한다.
// const 참조자가 없는 경우
int Add(int& num1, int& num2) {
return num1 + num2;
}
int main() {
int num1 = 1;
int num2 = 2;
std::cout << Add(num1, num2) << std::endl;
return 0;
}
- 참조자와 함수의 관계
"Call By Value, Call By Reference(값에 의한 호출, 참조에 의한 호출)"은 함수의 호출 방식을 뜻하는 말이다. C에서 참조에 의한 호출은 포인터를 사용하였지만, C++에서는 참조자를 사용하여 '참조에 의한 호출'을 나타낼 수 있다.
Call By Value의 경우, 함수 외부에 선언된 변수에 대한 접근이 불가능하다. 따라서 num1과 num2의 값은 바뀌지 않는다.
void Swap(int a, int b) {
int temp = a;
a = b;
b = temp;
}
int main() {
int num1 = 1;
int num2 = 2;
Swap(num1, num2);
// 출력 결과 변화 없음
std::cout << num1 << std::endl; // 출력 결과 = 1
std::cout << num2 << std::endl; // 출력 결과 = 2
return 0;
}
참조자를 사용한 Call By Reference의 경우, 변수와 참조자가 같은 메모리를 공유하기 때문에 num1과 num2의 값이 교환된다. 그리고 함수를 벗어나면 참조자 형태인 a와 b라는 이름은 사라진다.
void Swap(int& a, int& b) {
int temp = a;
a = b;
b = temp;
}
int main() {
int num1 = 1;
int num2 = 2;
Swap1(num1, num2); // num1과 num2의 값이 교환
std::cout << num1 << std::endl; // 출력 결과 = 2
std::cout << num2 << std::endl; // 출력 결과 = 1
return 0;
}
위의 예시에서 각각 사용된 메모리를 따져보면, Call By Value는 num1, num2, a, b가 네 개의 공간에 각각 할당되었을 것이고 Call By Reference는 num1과 a, num2와 b가 묶여 두 개의 공간에 할당된다. 따라서, 참조자를 사용하였을 때, 메모리를 절약할 수 있다.
- R-Value 참조
R-Value란 대입 연산자의 두 피연산자 중 오른쪽에 위치한 연산자를 말하는 것으로, 일반적인 변수와 상수 모두 해당될 수 있다. <이후에 자세히 다루면 다시 작성할 예정>
'C++ > C++ 기초 공부' 카테고리의 다른 글
2장. 함수와 네임스페이스 (0) | 2023.08.05 |
---|