- 선언(declaration)은 코드에 사용 되는 '어떤 대상'의 이름과 타입을 컴파일러에게 알려주는 것
extern int x; // 객체 선언
std::size_t numDigits(int number) // 함수 선언
▶ extern
- 외부 참조 지정자
- 다른 모듈에 존재하는 변수를 전역 변수처럼 사용하기 위해 사용함
- extern을 이용해 외부 모듈 어딘가 변수나 함수가 선언되어 있다고 정보를 알려줌으로써 컴파일시에 식별자를 찾지 못한다는 에러를 일으키지 않음
- 링크 과정에서 결정
- https://thrillfighter.tistory.com/397
▶ std::size_t
- typedef unsigned int size_t
- C++에서 개수를 셀 때 주로 사용
- 정의(definition)은 선언에서 빠진 구체적인 세부사항을 컴파일러에 제공하는 것
int x; // 객체 정의
std::size_t numDigits(int number) // 함수 정의
{
std::size_t digit = 1;
return digit;
}
- 객체의 경우는 컴파일러가 그 객체에 대한 메모리를 마련해 놓은 부분이 정의가 됨
- 초기화(initialization)는 어떤 객체에 최초의 값을 부여하는 과정
- 사용자 정의 타입으로 생성된 경우, 초기화는 생성자에 의해 이루어짐
Class Widget {
public:
Widget(); // 기본 생성자(defulat constructor)
Widget(const Widget& rhs); // 복사 생성자(copy constructor)
Widget& operator=(const Widget& rhs); // 복사 대입 연산자(copy assignment operator)
}
Widget w1; // 기본 생성자 호출
Widget w2(w1); // 복사 생성자 호출
w1= w2; // 복사 대입 연산자 호출
Widge w3 = w2; // 복사 생성자 호출
- lhs - light hand side / rhs - right hand side
bool hasAcceptableQuality(Widget w);
Widget aWidget;
if (hasAcceptableQuality(aWidget)) // 복사 생성자 호출
- 함수 호출 시 aWidget는 복사 생성자를 통해 w로 복사됨
- 즉 'pass-by-value'는 '복사 생성자 호출'
- 명시적 타입 변환(explicit type casting)은 캐스팅할 type 명시
- 암시적 타입 변환(implicit type casting)은 캐스팅할 type을 컴파일러가 알아서 지정
// Implicit conversion
int i = 75;
long j = i;
// Explicit conversion
double d = 75.25;
int i = (int)d;
class A
{
public:
explicit B(int x = 0, bool b = true); // 기본 생성자(default constructor)
};
- 클래스의 생성자에선 특별한 경우가 아니면 explicit을 통해 의도치 않은 암시적 변환을 막아주는 것이 좋음
- 표기법
▶ Camel Case
int helloWorld;
- 첫 글자는 소문자, 두 번째 단어부터는 첫 글자 대문자
- Java 프로그래밍에서 권장
▶ Pascal Case
int HelloWorld;
- 첫 글자와 단어의 첫 글자 대문자
- Python 프로그래밍에서 권장
▶ Snake Case
int hello_world;
- 단어 사이를 언더바로 연결
▶ Hungarian Notation
bool bInitialized = false;
int nSize = 2;
Widget* pWidget;
- 이름에 데이터 타입을 명시
- 요즘을 잘 쓰이지 않는다고 함 (https://www.makeuseof.com/what-is-hungarian-notation-and-should-i-use-it/)
- 16진수(Hexadecimal)
- 16진법에서는 숫자 0~9까지와 영문 알파벳 문자 A~F까지를 사용함
- 16진수는 근대 컴퓨터에 1 byte를 8 bit로 정의되어 있기 때문에 2진수를 표현하는 편리한 방법
- 한 개의 16진수 숫자는 4개의 2진수 숫자를 표시할 수 있음, 두 개의 16진수 숫자는 8bit, 즉 1 byte를 표현할 수 있음
2진수 | 10진수 | 16진수 |
0 | 0 | 0 |
1 | 1 | 1 |
10 | 2 | 2 |
11 | 3 | 3 |
100 | 4 | 4 |
101 | 5 | 5 |
110 | 6 | 6 |
111 | 7 | 7 |
1000 | 8 | 8 |
1001 | 9 | 9 |
1010 | 10 | A |
1011 | 11 | B |
1100 | 12 | C |
1101 | 13 | D |
1110 | 14 | E |
1111 | 15 | F |
10000 | 16 | 10 |
10001 | 17 | 11 |
- Build 과정
- Build = Compile + Link
- Run = Build + 실행
▶ Compile
- Compile은 High-level language(Python, C)인 소스 코드를 Low-level language(기계어, 어셈블리어)로 번역하는 과정
- 결과로 목적 파일(.obj)이 생성됨
▶ Link
- 여러 개의 목적 파일을 합쳐서 하나의 실행 가능한 파일로 만드는 과정
- 결과로 실행 파일(.exe)이 생성됨
- Static link: 컴파일된 소스 파일들을 연결해서 최종 실행 가능한 파일을 생성
- Dynamic link: 프로그램 실행 도중, 프로그램 외부에 존재하는 코드(.dll)를 찾아서 연결, 링커가 필요 없음
- https://jhnyang.tistory.com/42
- https://jhnyang.tistory.com/40
'C | C++' 카테고리의 다른 글
[C++] string to int, char to int, int to string, int to char (0) | 2022.05.11 |
---|---|
[C++] unordered_map을 value를 기준으로 정렬 (0) | 2022.05.09 |
[Effetive C++] Chapter 1 정리 (0) | 2022.04.27 |
C++ STL Prioriy-Queue(우선순위큐) (0) | 2020.12.31 |
C++ STL Set(집합) (0) | 2020.12.31 |