1. 변수, 자료형, 함수의 변경
1.1 변수 및 자료형
- 변수 선언을 어디에서든 할 수 있다.
- 자료형 검사가 엄격해 졌다.
sub (int n) { ... return 0; } (X)
int sub(int n) { ... return 0; } (O)
- bool 형태 변수형이 도입되었다.
- 구조체가 태그 하나만으로 선언이 가능하다.
1.2 레퍼런스
레퍼런스(reference) : 변수에 별명(Alias)을 붙이는 것.
#include <iostream>
using namespace std;
int main() {
int var;
int &ref = var; //레퍼런스 선언
var = 10;
cout << "var의 값 : " << var << endl;
cout << "ref의 값 : " << ref << endl;
ref = 20;
cout << "var의 값 : " << var << endl;
cout << "ref의 값 : " << ref << endl;
return 0;
}
레퍼런스는 처음 선언할 때 초기화 해야하며, 이후 변경이 불가능하다.
참조에 의한 호출을 보여주는 함수 SWAP
#include <iostream>
using namespace std;
void swap(int &rx, int &ry);
int main() {
int a = 100, b = 200;
cout << "swap() 호출전: a = " << a << ", b = " << b << endl;
swap(a, b);
cout << "swap() 호출후: a = " << a << ", b = " << b << endl;
return 0;
}
void swap(int &rx, int &ry) {
int tmp;
cout << "In swap() : rx = " << rx << ", ry = " << ry << endl;
tmp = rx; rx = ry; ry = tmp;
cout << "In swap() : rx = " << rx << ", ry = " << ry << endl;
}
객체의 크기가 큰 영우, 값에 의한 호출로 매개변수로 넘기면 객체를 복사하기 때문에 시간이 오래걸린다. 이 때 레퍼런스로 처리하는 것이 유리하다,
레퍼런스를 통한 변경을 막고싶으면 const를 앞에 붙인다.
void sub(const int &p) {
p = 0; // 오류!!
}
일반적으로 레퍼런스를 사용하는 편이 쉽지만 참조하는 대상이 수시로 변경되는 경우에는 포인터를 사용한다. 주소값이 NULL이 될 가능성이 있는 경우에도 포인터를 사용한다.
1.3 디폴트 매개변수
디폴트 매개변수 : 인자를 전달하지 않아도 디폴트 값을 대신 넣어주는 기능. 뒤에서부터 앞쪽으로만 정의할 수 있다.
void sub(int p1, int p2, int p3=30);// OK!
void sub(int p1, int p2=20, int p3=30);// OK!
void sub(int p1=10, int p2=20, int p3=30);// OK!
void sub(int p1, int p2=20, int p3);// 컴파일 오류!
void sub(int p1=10, int p2, int p3=30);// 컴파일 오류!
#include <iostream>
using namespace std;
int calc_deposit(int salary=300, int month=12);
int main() {
cout << "0개의 디폴트 매개 변수 사용"<< endl;
cout << calc_deposit(200, 6) << endl;
cout << "1개의 디폴트 매개 변수 사용" << endl;
cout << calc_deposit(200) << endl;
cout << "2개의 디폴트 매개 변수 사용" << endl;
cout << calc_deposit() << endl;
return 0;
}
int calc_deposit(int salary, int month) {
return salary*month;
}
1.4 중복 함수 (Overloading Functions)
중복 함수는 같은 이름을 가지는 함수를 여러 개 정의하는 것이다. 자료형에 따라 여러 함수를 정의하면 호출할 때 매개변수의 자료형에 따라 자동으로 적합한 함수가 호출된다. 매개변수의 자료형이 다를 때만 중복 함수를 만들 수 있으며 매개변수의 자료형이 같으면 반환형이 다르더라도 중복 함수를 만들 수 없다.
int sub(int);
int sub(int, int); // 중복 가능!
int sub(int, double); // 중복 가능!
double sub(double); // 중복 가능!
double sub(int); // 오류!! - 반환형이 다르더라도 중복 안됨!
float sub(int, int); // 오류!! - 반환형이 다르더라도 중복 안됨!
1.5 인라인 함수(Inline Function)
인라인 함수는 함수 호출을 하지 않고 함수 몸체를 호출한 곳에 삽입한다.
2. 동적할당과 이름공간
2.1 동적할당 메모리
프로그램이 메모리를 할당받는 방법에는 정적(Static)과 동적(Dynamic)이 있다. 정적 메모리 할당은 프로그램이 시작되기 전에 미리 정해진 크기의 메모리를 할당 받는 것이다. 메모리의 크기는 프로그램이 시작하기 전에 결정된다. 처음에 결정된 크기보다 더 큰 입력이 들어온다면 처리하지 못하고 더 작은 입력이 들어온다면 남은 메모리 공간이 낭비된다.
동적 메모리는 실행 도중에 동적으로 메모리를 할당받는 것이다. 사용이 끝나면 시스템에 메모리를 반납해야한다. 필요한 만큼만 할당받기 때문에 메모리를 효율적으로 사용할 수 있다. new와 delete키워드를 사용한다.
#include <iostream>
using namespace std;
int main() {
int *pi; // 동적 메모리를 가리키는 포인터
pi = new int; // ① 동적 메모리 할당
*pi = 100; // ② 동적 메모리 사용
delete pi; // ③ 동적 메모리 반납
return 0;
}
배열 동적할당
double *pd = new double[10];
…
delete[] pd;
메모리 누수
void sub() {
int *pi = new int; // ①
*pi = 67;
pi = new int; // ②
*pi = 99;
} //잘못된 버전
void sub() {
int *pi = new int; // ①
*pi = 67;
delete pi;
pi = new int; // ②
*pi = 99;
delete pi;
} //올바른 버전
const 포인터
- const int *p1;
- p1은 const int에 대한 포인터로 p1이 가리키는 내용이 상수가 된다.
- 따라서 *p1 = 100; (X) //p1 자체는 바뀔 수 있으나 *p1은 바뀔 수 없다
- int *const p2;
- 정수를 가리키는 p2가 상수라는 의미이다.
- p2의 내용이 변경될 수 없다.
- 따라서 p2 = p1; (X)
2.1 이름공간
이름공간은 식별자들이 존재하는 공간이다. 같은 이름의 식별자는 한 이름공간 안에 있을 수 없으나 서로 다른 이름공간에는 존재할 수 있다.
이름공간 정의
namespace Graphics { int mode; int x, y; void draw(); void message(); ... } |
namespace Network { int mode; int speed; void send(char *); void message(); ... } |
이름공간의 변수를 사용 - 이름공간을 직접 지정
Graphics::mode = 1;
Network::mode = 1;
이름공간의 변수를 사용 - using
- using 이름공간::식별자;
- using Network::speed; //이후부터 Network의 speed는 이름공간을 붙이지 않아도 접근 가능
- speed = 100; //Network 이름공간의 speed를 의미
- using namespace 이름공간;
- using namespace Network; //Network 이름공간의 모든 식별자 바로 사용 가능
- speed = 19200;
전역 범위 접근
- ::mode = 0; //전역범위의 mode 식별자 사용
이름공간과 소스파일
- 하나의 소스파일에 여러 개의 이름공간을 정의할 수 있다.
- 같은 이름공간을 여러 소스파일에 걸쳐서 정의할 수 있다.
이름공간과 헤더파일
e-koreatech 비주얼 C++ 프로그래밍 https://www.e-koreatech.ac.kr
'공부 > C++' 카테고리의 다른 글
05. 클래스 (0) | 2017.11.23 |
---|---|
04. 객체지향과 객체지향 프로그래밍 (0) | 2017.11.20 |
03. 레퍼런스, 중복함수 (0) | 2017.11.20 |
01. C++ 프로그래밍 기초 (0) | 2017.11.14 |