본문 바로가기
Programming/열혈 C++ 프로그래밍(저자 윤성우)

Ch 02. C언어 기반의 C++ 2

by minjunkim.dev 2020. 8. 17.

    모든 내용은 [윤성우 저, "열혈 C++ 프로그래밍", 오렌지미디어] 를 기반으로 제 나름대로 이해하여 정리한 것입니다. 다소 부정확한 내용이 있을수도 있으니 이를 유념하고 봐주세요!


# const 사용방법 및 그 의미

1) const int => 변수값 변경불가
2) const int * ptr => 포인터를 통해 변수값 변경불가
3) int * const ptr => 포인터가 가리키는 값(변수의 주소) 변경불가
4) const int * const ptr => 2, 3) 둘다 적용

 

# 메모리 구조
- 코드영역
- 데이터영역 : 전역, static 변수
- 힙영역 : 동적할당(malloc) 및 해제(free) (런타임에 크기 결정)
- 스택영역 : 지역변수, 매개변수 (컴파일 타임에 크기 결정)

 

# C++에는 bool형 자료형 존재(true, false) => 따라서 굳이 매크로를 사용할 필요가 없다.
그러나 true와 false가 1, 0과 동치는 아니다.(true와 false는 둘다 1바이트 크기의 데이터일 뿐이다.)

 

# 참조자의 존재
- 참조자는 변수를 대상으로만 선언이 가능하다.(참조자는 변수에 별칭을 붙여주는 것이다.)
- 하지만 일단 참조자가 선언이 되고나면, 변수와 차이가 없다.
- 참조자의 수에는 제한이 없고, 참조자를 대상으로도 참조자 선언이 가능하다.
- 참조자는 무조건 선언과 동시에 변수(상수는 불가능)를 참조하도록 해야한다.

 

# 함수 외부에 선언된 변수에 대한 접근방법 2가지
1) 주소값을 이용한 call-by-reference
2) 참조자를 이용한 call-by-reference

# 함수 내에서 참조자를 통한 값의 변경을 진행하지 않을 경우, 매개변수의 참조자에 const를 선언하자.
=> 함수의 원형만 봐도 함수 내에서 참조자를 통해 값의 변경이 이루어지지 않음을 알 수 있게 하자.

 

# 참조자 반환시
1. 반환형이 참조형인 경우, 반환값을 어디에 저장하느냐에 따라 결과가 달라지므로 적절한 선택이 필요하다.
1) 반환값을 참조자에 저장하면? => 또다른 별칭(참조자)가 생기는 것이다.
2) 반환값을 기본자료형에 저장하면? => 참조값이 참조하는 변수의 값이 기본자료형에 저장된다.

2. 참조자를 반환하되 반환형은 기본자료형인 경우, 참조자가 "참조하는 변수의 값"이 반환됨

# 함수의 반환형은, 함수 반환시 생성되었다가 (일반적으로) 사라지는 임시객체의 자료형이라고 생각하면 된다.
- 임시객체는 참조되지 않으면, 다음 행으로 넘어갈 때 사라진다.
- 지역변수를 참조형으로 반환하지 말자.

(지역변수는 함수반환 이후 사라지므로, 그 변수에 대한 참조값은 아무런 의미가 없다.)

 

# "상수화된 변수"에 대한 참조자 선언은 다음과 같이 해야 함

e.g.

const int num=20; // 상수화된 변수
const int &ref=num; // const 참조자로 상수화된 변수를 참조'


- 그리고 const 참조자는 다음와 같이 상수도 참조 가능
const int &ref=50; // 참조자가 상수를 어떻게 참조할까?(참조는 분명 변수만 가능하다고 하였다.)
=> const 참조자를 이용해 상수를 참조할 때 "임시변수"를 만들고,
이 임시변수에 상수를 저장하고선, 참조자가 이를 참조하게끔 만들기 때문에 가능하다.

 

# 동적할당과 해제
new - malloc 함수를 대신하는 키워드
delete - free 함수를 대신하는 키워드

e.g.

int *ptr1=new int; // int형 변수 동적할당
int *parr1=new int[5]; // int형 배열(크기 5) 동적할당
delete ptr1; // 동적변수 해제
delete []parr1; // 동적배열 해제

 

- C++에서는 동적할당과 해제시, 반드시 new와 delete를 사용하자.
- 객체 생성시 malloc을 사용하면 생성자 호출이 되지 않기 때문이고,

객체 소멸시 free를 사용하면 소멸자 호출이 되지 않기 때문이다.

 

# etc.
- 포인터말고도 참조자를 통해서도 힙에 할당된 변수에(즉, 힙영역에) 접근이 가능하다.
- 가급적 C++의 "표준헤더"를 이용해서 함수를 호출하는 것이 좋다.


[출처] : 윤성우 저, "열혈 C++ 프로그래밍", 오렌지미디어