공부 및 정리/C++
[메모] l-value와 r-value
* 서론 - 고전적으로 l-value, r-value는 대입문 왼편, 오른편에 올 수 있는 값들을 의미했습니다. - 최근에는 l-value는 참조가 가능한 객체라고 정의합니다. 즉, l-value : &연산자를 붙일 수 있는 주소 값을 취할 수 있는 값 r-value : 주소값을 취할 수 없는 (임시) 값 으로 정의할 수 있겠습니다. 실제로, 컴파일러는 r-value의 연산자를 허용하지 않습니다. * l-value 참조자 int& func(int& a) { return a; } int main() { int a = 3; int b = 2; func(a) = 4; printf("%d\n", a);//4 printf("%d\n", func(a));//4 printf("%d\n", func(b));//2 } ..
C++의 기초 - 7
* 분할 컴파일 여러 개의 소스 코드들을 따로 컴파일하는 작업 - #include "헤더" 여러 cpp 파일에서 같은 클래스/ 구조체를 사용하고 싶을 때 .h 파일을 include 하여 같은 내용을 여러번 작성할 필요가 없습니다. .h 파일에 들어갈 수 있는 내용 1. 함수 원형 2. #define 혹은 const 변수 3. 구조체/ 클래스의 선언 4. 템플릿 선언 5. inline 함수 - 분할 컴파일의 장점 1. 파일의 분리로 인해 모듈화가 가능합니다. 2. 프로그램 수정 시 수정된 파일만 컴파일하여 컴파일 속도를 높입니다. 3. 모듈별 테스트 및 디버깅이 가능합니다. * 기억 존속 시간 - C++은 네가지 유형으로 메모리를 저장합니다. 1. 자동 기억 존속 : 함수 또는 블럭 내부의 메모리가 해당 ..
C++의 기초 - 6
* 참조자 int A = 99; int &B = A; int *C = &A; B++; //A == 100 (*C)++; //A == 101 - 참조자는 포인터가 *를 사용해 데이터를 실제로 변경하는 것처럼 해당 데이터에 직접 접근할 수 있습니다. int A = 99; int E = 1; int &B = A; int* C = &A; int& D = E; B++; //A == 100 (* C)++; //A == 101 printf("%d\n", A);//101 printf("%p\n", &B);//A의 주소 printf("%p\n", C);//A의 주소 printf("%d\n", E);//1 B = D; //A == 1 B--; //A == 0 printf("%d\n", A);//0 printf("%p\n"..
C++의 기초 - 5
* Inline 함수 - 함수는 Call할 때 수행시간이 추가로 드는 편입니다. - 일반적인 함수의 수행 과정 1. 스택에 함수 매개변수, 호출이 끝난 후 돌아갈 주소, 함수의 지역변수 등이 저장된다. 2. 함수가 시작되는 메모리 주소로 점프하여 함수를 수행한다. 3. 리턴 값을 레지스터에 복사한 후, 저장해 둔 주소의 명령으로 돌아온다. - Inline 함수의 수행 과정 1. 함수 코드가 함수 콜한 코드 안에 직접 삽입된다. 즉, 함수로 점프, 돌아오는 과정이 생략됩니다. 그렇다고 항상 Inline 함수가 유리한 것은 아닙니다. 이유는 다음과 같습니다. 1. Inline으로 생략되는 수행 시간이 크지 않다. -> 빈번히 사용되는 함수가 아니면 큰 이득이 없음 2. 함수 코드가 길어서 메모리를 많이 사용..
C++의 기초 - 4
* const - const가 붙은 변수는 상수로 처리됩니다. 1. const * #include int main() { int i = 6; const int *A = &i; (*A)++;//불가능, 컴파일 에러 printf("%d", *A); return 0; } - const *는 포인터 접근을 통한 값의 수정을 막습니다. - 즉, A의 포인터 값은 변경 가능하지만, A가 가리키는 데이터를 바꿀 수 없습니다. #include int main() { const int *A = new int(5); printf("%d\n", *A);//5 A = new int(7); printf("%d", *A); //7 return 0; } - 예를 들어, 위와 같은 코드는 멀쩡히 동작합니다. 왜냐하면, 주소는 A가 ..
C++의 기초 - 3
* 제가 보기 편하기 위해 작성하는 메모이므로, 누락된 내용이 있을 수 있습니다. 누락된 내용은 제가 이미 숙지하였기 때문이거나 다른 이유로 누락될 수 있습니다. * 자동 공간, 정적 공간, 동적 공간 - C++은 데이터 저장을 대입 방법에 따라 자동 공간, 정적 공간, 동적 공간으로 구분합니다. - 각각 실제 메모리 구조에서 스택, 데이터, 힙에 저장됩니다. 1. 자동 공간 - 함수 안에서 정의 되는 보통의 변수들을 자동 변수라고 합니다. - 자동 변수들은 블록 안에서만 유효합니다. int main() { int A = 6; { int B = 7; } //B 소멸 printf("%d", B); // -> 불가능 return 0; }//A 소멸 - {}로 묶인 공간을 블록이라고 합니다. - 자동 공간은 ..
C++의 기초 - 2
* 제가 보기 편하기 위해 작성하는 메모이므로, 누락된 내용이 있을 수 있습니다. 누락된 내용은 제가 이미 숙지하였기 때문이거나 다른 이유로 누락될 수 있습니다. * 데이터 처리 - 데이터는 사실 기본형과 복합형이 있습니다. 1. 기본형 데이터 : 정수형과 부동소수점형을 의미합니다. 2. 복합형 데이터 : char, string, 배열 등등 기본형 데이터를 베이스로 한 데이터 형태입니다. * 정수형 데이터 정수형 데이터는 운영체제의 처리 기준을 따라 다른 크기를 갖습니다. 32bit 운영체제에서 int는 일반적으로 4byte의 크기를 갖습니다. 재미있게도, 64bit 운영체제가 나온 현재도 int는 대부분 4byte로 처리합니다. 왜냐하면, int 크기가 수정되면 이미 개발된 수많은 프로그램들을 수정해야..
C++의 기초 - 1
* 제가 보기 편하기 위해 작성하는 메모이므로, 누락된 내용이 있을 수 있습니다. 누락된 내용은 제가 이미 숙지하였기 때문이거나 다른 이유로 누락될 수 있습니다. * 구조적 프로그래밍과 OOP의 차이는 다음과 같습니다. - 구조적 프로그래밍은 1. "알고리즘"에 초점을 맞춘다. 2. Top-Down 형식으로 진행된다. - OOP는 1. "데이터"에 초점을 맞춘다. 2. Bottom-Up 형식으로 진행된다. * 일반화 프로그래밍 - 일반화 프로그래밍이란, 데이터 형과 무관하게 사용할 수 있는 코드를 작성함을 의미합니다. - - 예를 들어, sort 함수는 여러가지 자료형에 적용이 가능합니다. * C++의 이식성과 표준에 대하여 - 개발자들끼리의 C++ 표준을 맞추기 위해 ANSI/ISO에서 C++03, C..