변수와의 첫 만남
객체(objects): 메모리에 저장이 돼 있는 정보가 객체로써 존재함
변수(variables): 수학에서 얘기하는 변수처럼 기능하나, 내부적으로 작동할 때는 메모리에 담겨 있는 객체의 이름
Left-values / Right-values: 메모리 변수에 직접 접근할 수 있느냐
초기화(initialization)와 대입(assignment)
초기화를 안 했을 때의 문제점
#include <iostream>
int main()
{
int x; // X: 메모리에 있는 어떠한 공간의 이름, 정수 하나 담을 크기(integer)
x = 123; // =: assignment operator, '대입'
x = x + 2; // 우측의 x는 R-value
std::cout << x << std::endl;
std::cout << &x << std::endl; // ampersand
int y = 123; // initialization
//int y(123); 가능
y = 5; // assignment
return 0;
}
Release 모드에서는 컴파일러가 초기값을 넣어 준다.
메모리는 공유된다. 새로 할당받았다고 생각하지만, 쓰레기(Garbage) 값이 들어가 있을 수 있다.
프로젝트가 커진 경우에는 찾기가 힘들다. 변수는 항상 초기화를 하자!!!
#include <iostream>
int main()
{
int x = 1;
x = x + 2;
std::cout << x << std::endl; // #1
// 출력: 3
int y = x;
std::cout << y << std::endl; // #2
// 출력: 3
// is (x + y) l-value or r-value? => r-value
std::cout << x + y << std::endl; // #3
// 출력: 6
std::cout << x << std::endl; // #4
// 출력: 3
int z;
std::cout << z << std::endl; // #5
// 빌드 오류가 난다... 선생님은 하셨는데 나는 왜 안 되는지 잘 모르겠음
return 0;
}
입출력 스트림과의 첫 만남 cin, cout
cin: console in
cout: console out
endl: end line
#include <iostream> // cout, cin, endl...
#include <cstdio> // printf
int main()
{
int x = 1024;
double pi = 3.141592;
// cout, endl 등의 함수는 std라는 이름공간 안에 정의되어 있다.
// 그 안에 있는 것을 사용하기 위하여 콜론 두 개(::)를 넣어 준다.
// <<: output operator, 출력하고 싶은 내용이 스트림을 타고 cout으로 들어간다.
std::cout << "I love this lecture!" << std::endl;
std::cout << "x is " << x << " pi is " << pi << std::endl;
// \t: tab, 어떠한 기능을 수행하는 문자
// \n: new line
std::cout << "abc" << "\t" << "def\n\n" << std::endl;
std::cout << "ab" << "\t" << "cdef\n" << std::endl;
// namespace 사용을 선언하면, 해당 namespace 이름을 생략해도 컴파일러가 처리한다.
using namespace std;
cout << "without std" << endl;
// \a: audio 소리 출력
cout << "\a";
int y = 1;
cout << "Before your input, y was " << y << endl;
// >>: input operator, 입력받은 내용이 스트림을 타고 해당 변수로 들어간다.
cin >> y;
cout << "Your input is " << y << endl;
return 0;
}
함수와의 첫 만남
함수(function)
리턴값(return values)
매개변수(parameters)
인수(arguments)
함수 이름을 변경하고 싶을 때, 함수 이름 우클릭 시 rename 메뉴가 존재한다. 해당 기능을 이용하여 함수 이름을 변경하면, 호출된 모든 코드에서 변경된 함수 이름을 직접 수정할 필요가 없어진다.
함수를 실행시킬 때, 메모리에 저장되어 있는 함수를 load해서 가져온다.
#include <iostream>
using namespace std;
// 반환형 함수이름(매개변수,parameter)
// 함수 이름 변경 - 함수 이름 우클릭 Rename...
int multiplyTwoNumbers(int num_a, int num_b)
{
// 덧셈을 곱셉 등으로 변경하고 싶을 때, main 함수가 아니라
// 해당 함수의 코드만 수정하면 된다.
// ex) int sum = num_a - num_b;
int sum = num_a * num_b;
return sum;
}
// return 할 것이 없기 때문에 반환형은 void
void printHelloWorld()
{
cout << "Hello World " << endl;
return; // return을 만나면 무조건 반환해서 main 함수로 돌아간다.
cout << "Hello World 2" << endl;
}
void print()
{
cout << "Hello" << endl;
}
int addTwoNumbers(int a, int b)
{
/*
cpp는 함수 안에서 함수를 정의할 수 없다.
void print()
{
cout << "Hello" << endl;
}
*/
print();
return a + b;
}
int main()
{
/*
숫자 두 개를 더하고 그 결과를 출력하는 패턴이 반복되고 있다.
cout << 1 + 2 << endl;
cout << 3 + 4 << endl;
cout << 8 + 13 << endl;
*/
// 함수이름(인수,argument)
cout << multiplyTwoNumbers(1, 2) << endl;
cout << multiplyTwoNumbers(3, 4) << endl;
cout << multiplyTwoNumbers(8, 13) << endl;
printHelloWorld();
int sum = addTwoNumbers(1, 2);
return 0;
}
이래저래 각색해서 풀어 본 연습 문제!
// 두 개의 정수를 입력받아서 더하고 출력하는 함수를 만들어 보자.
// 1. main 입력 + 반환하는 함수
// 2. main 입력 + 출력하는 함수
// 3. 입력받는 함수 + 출력하는 함수
// 4. 3번을 여러 번 반복되게끔
#include <iostream>
using namespace std;
int addTwoNumbersReturn(int num_a, int num_b)
{
return num_a + num_b;
}
void addTwoNumbersPrint(int num_a, int num_b)
{
cout << "입력한 정수: " << num_a << ", " << num_b << " / 덧셈 결과: " << addTwoNumbersReturn(num_a, num_b) << endl;
}
void addTwoNumbersAll()
{
// 포인터 개념은 사용하지 않았다.
int a, b;
cout << "두 정수를 입력하세요." << endl;
cin >> a >> b;
addTwoNumbersPrint(a, b);
}
int main(void)
{
int a = 0, b = 0;
cout << "[1. main 입력 + 반환하는 함수]" << endl;
cout << "두 정수를 입력하세요." << endl;
cin >> a >> b;
cout << "입력한 정수: " << a << ", " << b << " / 덧셈 결과: " << addTwoNumbersReturn(a, b) << endl;
cout << "\n\n[2. main 입력 + 출력하는 함수]" << endl;
cout << "두 정수를 입력하세요." << endl;
cin >> a >> b;
addTwoNumbersPrint(a, b);
cout << "\n\n[3. 입력받는 함수 + 출력하는 함수]" << endl;
addTwoNumbersAll();
cout << "\n\n[4. 여러 번 반복하기]" << endl;
// 반복문 개념은 사용하지 않았다.
addTwoNumbersAll();
addTwoNumbersAll();
addTwoNumbersAll();
return 0;
}
키워드와 식별자 이름짓기
메모리 주소를 프로그래머가 인식할 수 있는 이름으로 바꿔 준다.
C++ 키워드(예약어)
https://en.cppreference.com/w/cpp/keyword
변수명은 너무 길지 않으면서도 의미를 충분히 표현할 수 있는 것이 베스트!
변수명은 띄어 쓸 수 없기 때문에, 언더바(_)를 사용한다.
void GetNumber()
{
// 무슨 기능을 하는지 설명할 때 보통 동사+명사
// 첫 글자는 대소문자 무관함, 같이 하는 사람들에게 맞춰서 하기
// 함수명이 길어질 수밖에 없는 경우, 짧게 하고 주석을 달아 놓자
}
class MyClass
{
public:
int m_variable;
int _variable;
int variable;
int variable_;
};
int main()
{
int n_apples;
int nApples;
int VALUE; // 1. 번거롭고 2. 매크로에 사용해서 변수명에 대문자를 잘 사용하지 않음
int _apples;
int total;
int _orange;
int VALUE;
// int my variable name;
int TotalCustomers;
// int void;
int numFruit;
// int 2some;
int meters_of_pipe;
}
지역 범위
#include <iostream>
using namespace std;
int main()
{
int x = 0;
// int x = 1; error!
cout << x << " " << &x << endl;
{
// int x = 1; // 새로운 변수 출력
x = 1; // 기존 변수 출력
cout << x << " " << &x << endl;
}
cout << x << " " << &x << endl;
{
int x = 2;
}
return 0;
}
#include <iostream>
using namespace std;
void doSomething(int x)
{
x = 123;
cout << x << endl; // #2
// 123 출력
}
int main()
{
int x = 0;
cout << x << endl; // #1
// 0 출력
doSomething(x);
cout << x << endl; // #2
// 0 출력
return 0;
}
해당 포스트는 '홍정모의 따라하며 배우는 C++' 강의를 수강하며 개인 백업용으로 메모하였습니다.
인프런: https://www.inflearn.com/course/following-c-plus