Canvas of Bliss

#include <iostream>

using namespace std;

int iA = 10;
int iB = 20;
int iRes = 0;

void Add()
{
iRes = iA + iB;
}

void main()
{
// 전역 변수
// 어떠한 중괄호 안에 포함되어 있지 않은 변수
// Data 영역에 할당되어 프로그램 시작 시 메모리에 등록이되고,
// 프로그램 종료 시 메모리에서 해제가 된다.
// 어떠한 중괄호 안에도 포함되어 있지 않아 어디서든 접근이 가능하다!

Add();
cout << iRes << endl;

}

 

#include <iostream>

using namespace std;

int iA = 10;
int iB = 20;
int iRes = 0;

void Add()
{
iRes = iA + iB;
}

void Func()
{
cout << iRes << endl;
}

void main()
{
// 전역 변수와 지역 변수의 이름이 같을 경우
// stack 영역에 해당 이름의 변수가 있는지 검사를 진행한다.
// 만약, 변수가 있다면 지역 변수에 접근한다.
// 하지만, 변수가 없다면 전역 변수에 접근한다.
// -> 우선적으로 stack 영역을 확인 후 Data 영역을 찾아본다.


cout << iRes << endl; // 전역 변수
Func(); // 전역 변수

cout << "-------------------------" << endl;

Add();

cout << iRes << endl; // 전역 변수
Func(); // 전역 변수

cout << "-------------------------" << endl;

int iRes = 0;
iRes = 999; // 지역 변수

cout << iRes << endl; // 지역 변수
Func(); // 전역 변수
}

 

#include <iostream>

using namespace std;

int Func()
{
//// 지역 변수
//int iA = 0;

// 정적 변수
// 초기화 문법은 최초 1회만 적용 후 무시된다.
static int iA = 0;

++iA;

return iA;
}

void main()
{
// static 변수 (정적 변수)
// 지역적인 특성과 전역적인 특성을 동시에 가지는 변수

// 지역적인 특성으로는 해당 지역 내에서만 접근이 가능하다.
// 전역적인 특성으로는 Data 영역에 등록이 된다.

// 프로그램 시작 시 메모리에 할당되고, 프로그램 종료 시 메모리에서 해제되지만
// 정적 변수가 선언된 지역 내에서만 접근이 가능하다.


// Func() 안에 있는 iA가 지역 변수일 경우
// -> 1, 1, 1, 1, 1

// Func() 안에 있는 iA가 정적 변수일 경우
// -> 1, 2, 3, 4, 5
for (int i = 0; i < 5; ++i)
cout << Func() << endl;

//// iA는 정적 변수이기 때문에 다른 지역에서는 접근이 불가능하다!!
//cout << iA << endl; // 불가능

// static 변수의 소멸 시점이 프로그램 종료 시이기 때문에
// 함수가 종료되었다고 해서 변수가 없어지지 않는다!!!



}

 

#include <iostream>

using namespace std;

// 선언부
int Add(int _a, int _b);

void main()
{
// 선언부와 정의부

// main에서 함수를 호출하기 위해서는 구현한 함수들이 main보다 위에 있어야만 한다.
// 만약, 다양하고 긴 함수를 구현했을 때 main은 가장 밑으로 내려갈 수 밖에 없다.
// main의 위치를 위로 올리면서 정상적으로 구현하고 싶을 경우 선언부와 정의부를 나누어서 구현하자!

// 선언부
// 함수의 반환 타입, 이름, 매개 변수 정보만 있는 코드
// 함수 작동을 위한 가장 기초적인 정보만 보여주는 구간
// 다른 함수에 자신이 존재한다고 알리는 역할

// 정의부
// 앞서 선언한 함수의 코드 블록을 포함한 부분이다.
// 정의부가 있어야만 정상적으로 프로그램을 실행할 수 있다!

cout << Add(10, 20) << endl;

}

// 정의부
int Add(int _a, int _b)
{
return _a + _b;
}

 

#include <iostream>

using namespace std;

//// 함수 오버로딩을 사용지 않을 경우
//int Add(int _a, int _b)
//{
// return _a + _b;
//}
//
//double Add_Double(double _a, double _b)
//{
// return _a + _b;
//}

// 함수 오버로딩을 사용할 경우
int Add(int _a, int _b)
{
cout << "int Add" << endl;
return _a + _b;
}
int Add(int _a, float _b)
{
cout << "int Add" << endl;
return _a + _b;
}
//float Add(int _a, int _b)
//{
// cout << "int Add" << endl;
// return _a + _b;
//}
double Add(double _a, double _b)
{
cout << "double Add" << endl;
return _a + _b;
}

void main()
{
// 함수 오버로딩
// 동일한 이름으로 함수를 재정의하는 문법
// 단, 매개 변수의 정보를 다르게 작성한다.

//// 타입 별로 함수를 모두 만들고, 사용자 정의 자료형까지 있을 경우
//// 함수의 이름이 길어지고 복잡해지는 문제가 발생한다.
//cout << Add(10, 20) << endl;
//cout << Add_Double(3.5, 3.5) << endl;


cout << Add(10, 20) << endl;
cout << Add(3.5, 3.5) << endl;


// 함수 오버로딩 사용 시 주의 사항
// 반환 타입에 따른 오버로딩은 존재하지 않는다.



}

 

#include <iostream>

using namespace std;

//// 디폴트 매개변수를 사용하지 않을 경우
//// 인자 정보에 따른 함수를 매번 구현해주어야 한다!!!! -> 불편함
//int Add(int _a, int _b)
//{
// return _a + _b;
//}
//int Add(int _a, int _b, int _c)
//{
// return _a + _b + _c;
//}


// 디폴트 매개 변수 사용할 경우
int Add(int _a, int _b = 0, int _c = 0);

void main()
{
// 디폴트 매개변수
// 매개 변수의 값이 기본적으로 설정되어 있는 것.
// 함수 오버로딩과 마찬가지로 프로그램에 유연성을 가져다주는 문법
// 디폴트 값은 사용자가 설정하는 것에 따라 다르게 설정할 수 있다.

//// 인자의 개수가 부족할 경우 디폴트 값이 매칭이 되고,
//// 인자의 개수가 부족하지 않을 경우 넘겨주는 값으로 매칭이 된다.
//cout << Add(10, 20) << endl;
//cout << Add(10, 20, 30) << endl;


// 디폴트 매개 변수 사용 시 주의 사항
// ##1. 오른쪽 끝에서부터 순차적으로 채워 나가야 한다.
// ##2. 함수의 선언부에서만 명시하고, 정의부에서는 명시할 수 없다!



}

int Add(int _a, int _b, int _c)
{
return _a + _b + _c;
}

 

#include <iostream>

using namespace std;

void Recursion(int _n)
{
if (1 > _n)
return;

cout << "재귀 호출!" << endl;
Recursion(--_n);
}

void main()
{
// 재귀 함수
// 함수 내부에서 자신을 다시 호출하는 함수
// 탈출 조건이 없을 경우 무한 반복이 발생하기 때문에 탈출 조건이 필수이다!!!


Recursion(3);
}

 

#include <iostream>

using namespace std;

void Plus_One(int _n);
void main()
{
// 포인터
// 단순 변수이다!!!!!!!!!!!!!
// int형 변수는 정수를 저장했다!
// 포인터는 주소를 저장한다!
// -> 주소를 저장하는 변수이다!!

// 주소란?
// 컴퓨터의 메모리 영역은 1byte당 하나의 주소가 할당되어 있다!
// 메모리의 주소를 저장할 수 있는 변수가 포인터이다!

// 포인터를 사용하는 이유
// stack과 stack을 넘어 가면 값이 복사 된다.
// 복사본에 낙서를 해도 원본의 값어치는 변하지 않는다!!
// -> 원본의 값어치를 바꾸기 위해 포인터를 활용하자!
int iA = 1;
Plus_One(iA); // call by value
cout << iA << endl;
}

// int _n = iA;
void Plus_One(int _n)
{
_n += 1;
}

'개발 공부 > C++' 카테고리의 다른 글

C++ 포인터  (0) 2020.10.08
c++ 자판기 프로그램 2  (0) 2020.10.07
C++ 삼항연산자, 함수  (0) 2020.10.07
C++ for이용해서 별찍기  (0) 2020.10.07
C++ for, for문 이용하여 구구단 출력  (0) 2020.10.07

이 글을 공유합시다

facebook twitter kakaoTalk kakaostory naver band