C와 C++ 사용할 때 기본적으로 숙지할 기본적인 것들
선언과 정의
선언 : 컴파일러가 참조할 식별자의 이름을 알리는 것
ex) extern int a - 전역변수의 선언
정의 : 함수가 호출되거나 변수를 사용할 때 생성된 코드를 참조하여 식별자와 이름으로부터 코드 생성
ex) int a; int b = 10; - 변수의 정의
static (정적변수) : 전역변수를 static으로 선언할 시, 외부에서 extern으로 접근 불가. 즉, 선언한 파일내에서만 사용 가능
const : 값과 주소를 변경할 수 없도록 만들어 준다. 변수를 상수로 만드는 것
auto 타입 : 컴파일러가 초기화 값에 따라 알아서 데이터 타입을 정해주는 키워드 (타입 추론- type inference)
struct (구조체) : 하나 이상의 변수를 그룹 지어서 새로운 자료형을 정의하는 것
union (공용체) : 모든 멤버 변수가 하나의 메모리 공간을 공유. 따라서 한번에 하나의 멤버변수밖에 사용못함
enum (열거체) : 새로운 타입을 선언하면서, 동시에 해당 타입이 가질 수 있는 정수형 상수값도 같이 명시할 수 있는 타입
:: (범위 지정 연산자) : a::Print() 호출시, a영역에 있는 Print()가 호출, b::Print() 호출시, b영역에 있는 Print가 호출, 그냥 :: 호출시
: 포인터는 어떤 변수의 주소값을 저장하는 변수이다.
포인터를 선언하기 위해서는 변수명 앞에 *을 붙여야 하며, 어떤 변수의 주소값을 얻기 위해서는 &를 붙여야 한다.
int main(){
int* point = NULL; // 선언
int var = 10;
point = &var; // 정의
}
위의 코드를 보았을 때, &var과 point의 값은 동일하다.
: 레퍼런스는 어떤 변수를 참조하는 변수이다.
int main(){
int var = 10;
int& ref = var;
cout << ref << endl;
return 0;
}
실행하면 10이 출력된다. var과 ref는 같은 값을 가지며, 주소값을 출력해보아도 동일한 값이 출력된다. 즉, 어떤 변수의 별명인 셈이다.
이러한 레퍼런스의 이용은 함수호출에 주로 사용된다. (call by reference)
: 함수를 자식 클래스가 재정의할 수 있게 허용하는 것
class car { // 부모 클래스
public:
void func() {
cout << "this is car" << endl;
}
};
class bus : public car { // 자식 클래스
public:
void func() { // 부모 클래스와 같은 함수 정의
cout << "this is bus" << endl;
}
};
int main() {
car a;
bus b;
a.func();
b.func();
return 0;
}
위 코드를 실행해보면, 자식 클래스의 func함수가 변경된것을 확인할 수 있다. 따라서, 오버라이딩이란 이러한 상황처럼 자식 클래스의 내용을 변경, 재정의 할 수 있도록 허용한 것을 의미한다.
: 함수명은 같으나, 인자의 개수 혹은 타입이 다른 함수를 허용하는 것
void func(void) {
cout << "this is no argument" << endl;
}
void func(int i) {
cout << "this is integer argument" << endl;
}
void func(char c) {
cout << "this is charactor argument" << endl;
}
int main() {
func();
func(1);
func('a');
return 0;
}
위 코드를 실행하면 다음과 같은 실행결과가 출력된다.
즉, 함수에 전달된 인자가 무엇이냐에 따라 알아서 함수가 호출되는 것이다. 이렇듯 인자의 종류와 개수가 다르다면 같은 이름의 함수를 사용하는 것이 허용된다는 것을 알수있다.