💻 Programming (프로그래밍)/C++
-
이 포스팅에선 아주아주 심플 하게 간단명료를 목표로 글을 씁니다. 객체 지향 프로그래밍이란 코드를 재사용! 하기 위해서 쓰이는 방법론입니다. 어떤 특징이 있나요 클래스의 3가지 특징을 예로 들어봅니다. 1) Encapsulation 캡슐화 2) Polymorphism 다형성 3) Inheritance 상속 캡슐화 (Encapsulation) // 클래스 예시 class Stack{ private: int stack[16]; int sp; public: Stack() {sp = 0;} void push(int value) {stack[sp++] = value;} int pop() {return stack[--sp];} }; 여러 코드를 하나의 클래스란 캡슐로 만들어 기능도 사용하고, 코드도 보호할 수 있습..
[C++] 객체지향 프로그래밍 (Object-Oriented-Programming)이 포스팅에선 아주아주 심플 하게 간단명료를 목표로 글을 씁니다. 객체 지향 프로그래밍이란 코드를 재사용! 하기 위해서 쓰이는 방법론입니다. 어떤 특징이 있나요 클래스의 3가지 특징을 예로 들어봅니다. 1) Encapsulation 캡슐화 2) Polymorphism 다형성 3) Inheritance 상속 캡슐화 (Encapsulation) // 클래스 예시 class Stack{ private: int stack[16]; int sp; public: Stack() {sp = 0;} void push(int value) {stack[sp++] = value;} int pop() {return stack[--sp];} }; 여러 코드를 하나의 클래스란 캡슐로 만들어 기능도 사용하고, 코드도 보호할 수 있습..
2022.04.14 -
코딩공부를 하며, 레퍼런스라는 개념이 사실상 이해가 안갔습니다. 하지만, 이제는 쉽게 이해하고 어떠한 사용법이 있는지 적어보도록 하겠습니다. 레퍼런스 int main() { int a = 10; int &b = a; } 레퍼런스랑 포인터랑 좀 헷갈리는 경우가 많겠더라구요. 왜냐면 변수앞에 &를 쓰면 변수가 참조하는 주소인 포인터가 되니깐요. 하지만 지금 사용할 레퍼런스 개념은 별개로 생각하시면 좀 편할 것 같습니다. 레퍼런스는 변수의 또 다른 이름입니다. a나 b나 똑같은 주소와, 똑같은 변수값을 공유하고 있어서 하나가 바뀌면 하나도 똑같이 바뀝니다. b의 주소값을 출력해보나 a의 주소값을 출력해보나 같은 값이 출력됩니다. (레퍼런스 b를 추가할때 메모리상 크기는 포인터의 크기가 추가됩니다.) a 추가시..
[C++] 레퍼런스(References)코딩공부를 하며, 레퍼런스라는 개념이 사실상 이해가 안갔습니다. 하지만, 이제는 쉽게 이해하고 어떠한 사용법이 있는지 적어보도록 하겠습니다. 레퍼런스 int main() { int a = 10; int &b = a; } 레퍼런스랑 포인터랑 좀 헷갈리는 경우가 많겠더라구요. 왜냐면 변수앞에 &를 쓰면 변수가 참조하는 주소인 포인터가 되니깐요. 하지만 지금 사용할 레퍼런스 개념은 별개로 생각하시면 좀 편할 것 같습니다. 레퍼런스는 변수의 또 다른 이름입니다. a나 b나 똑같은 주소와, 똑같은 변수값을 공유하고 있어서 하나가 바뀌면 하나도 똑같이 바뀝니다. b의 주소값을 출력해보나 a의 주소값을 출력해보나 같은 값이 출력됩니다. (레퍼런스 b를 추가할때 메모리상 크기는 포인터의 크기가 추가됩니다.) a 추가시..
2022.04.13 -
요즘 포인터를 다루다가 헷갈리는 부분을 정리하고자 포스팅합니다. 우선 배열의 주소값을 포인터 매개변수로 사용할 수 있습니다. void func(int *num) {...} int main() { int num[] = {1, 2, 3, 4}; func(num); } 그럼 포인터와 배열의 이름의 다른점은? 배열의 이름은 const 포인터 입니다. 즉 상수값으로 되어있는 const 배열이죠 포인터의 조심해야 할 상황 int * func(){ int num[] = {1, 2, 3, 4}; return num; } int main(){ int *ptr; ptr = func(); // error!! } func() 함수가 끝난 후, local 변수인 num[] 은 스택에서 버려야할 될 값, 즉 garbage val..
[C++] 포인터 사용 예제요즘 포인터를 다루다가 헷갈리는 부분을 정리하고자 포스팅합니다. 우선 배열의 주소값을 포인터 매개변수로 사용할 수 있습니다. void func(int *num) {...} int main() { int num[] = {1, 2, 3, 4}; func(num); } 그럼 포인터와 배열의 이름의 다른점은? 배열의 이름은 const 포인터 입니다. 즉 상수값으로 되어있는 const 배열이죠 포인터의 조심해야 할 상황 int * func(){ int num[] = {1, 2, 3, 4}; return num; } int main(){ int *ptr; ptr = func(); // error!! } func() 함수가 끝난 후, local 변수인 num[] 은 스택에서 버려야할 될 값, 즉 garbage val..
2022.04.13 -
Q) 바이트 패딩이 무엇일까요 A) 구조체, 클래스에 패딩 바이트를 추가하여 CPU가 메모리 공간에 접근 하기 쉽게 만들어줍니다. 이는 메모리 낭비는 일어날 수 있지만 그보다 메모리의 크기를 맞춰서, CPU의 연산 횟수를 줄여주는 큰 장점이 있습니다. Q) 어떻게 작동하나요 A) CPU 레지스터가 한 번에 읽을 수 있는 크기의 파일로 만들어줍니다. 32bit OS - 4byte 64bit OS - 8byte 기준이지만 바이트 패딩으로 한 결과는 또 색다릅니다. 32bit 기준 struct A { char a; // 1byte bool b; // 1byte int c; // 4byte } 이런식으로 4byte씩 끊어서 메모리공간에 저장해줍니다. A 구조체의 size는 총 8byte가 됩니다. 또 다른 예시..
[C++] 바이트 패딩(Byte Padding)이란?Q) 바이트 패딩이 무엇일까요 A) 구조체, 클래스에 패딩 바이트를 추가하여 CPU가 메모리 공간에 접근 하기 쉽게 만들어줍니다. 이는 메모리 낭비는 일어날 수 있지만 그보다 메모리의 크기를 맞춰서, CPU의 연산 횟수를 줄여주는 큰 장점이 있습니다. Q) 어떻게 작동하나요 A) CPU 레지스터가 한 번에 읽을 수 있는 크기의 파일로 만들어줍니다. 32bit OS - 4byte 64bit OS - 8byte 기준이지만 바이트 패딩으로 한 결과는 또 색다릅니다. 32bit 기준 struct A { char a; // 1byte bool b; // 1byte int c; // 4byte } 이런식으로 4byte씩 끊어서 메모리공간에 저장해줍니다. A 구조체의 size는 총 8byte가 됩니다. 또 다른 예시..
2022.04.12 -
int main() { int a; int b; int c[3]; cout
[C++] 배열의 콜스택은 어떻게 쌓일까int main() { int a; int b; int c[3]; cout
2022.04.11 -
Q) 함수 오버로딩 맛보기 int add(int a) {} int add(int a, int b) {} int add(int a, double b) {} int add(double a) {} double add(int a) {} 위의 예시는 모두 함수인데요, 함수 오버로딩이란 이름은 같지만 매개변수에 따라서 컴파일러가 함수가 다른 함수인지를 고려해줍니다. (아주 똑똑하네요) 하지만, 리턴타입을 고려하지 않는 매개변수에 따라서만 구분이 됩니다. 이게 뭔말이냐면, 보통 함수오버로딩을 사용할 때 int add(int a) int add(int a, int b) 이렇게는 매개변수가 (int) , (int int) 로 다르기에 다른 함수로 인정합니다. 하지만 int add(int a) , double add(in..
[C++] 함수 오버로딩 (Function Overloding)Q) 함수 오버로딩 맛보기 int add(int a) {} int add(int a, int b) {} int add(int a, double b) {} int add(double a) {} double add(int a) {} 위의 예시는 모두 함수인데요, 함수 오버로딩이란 이름은 같지만 매개변수에 따라서 컴파일러가 함수가 다른 함수인지를 고려해줍니다. (아주 똑똑하네요) 하지만, 리턴타입을 고려하지 않는 매개변수에 따라서만 구분이 됩니다. 이게 뭔말이냐면, 보통 함수오버로딩을 사용할 때 int add(int a) int add(int a, int b) 이렇게는 매개변수가 (int) , (int int) 로 다르기에 다른 함수로 인정합니다. 하지만 int add(int a) , double add(in..
2022.04.10 -
Q) 콜스택이 무엇인가요? A) 프로그램을 작동 시킬때, 스택(Stack)이란 자료구조를 사용합니다. 컴퓨터에선, 주로 Source(Text), Data, Heap, Stack 메모리 구조로 이루어져있습니다. 이때 Stack에는 컴파일이 진행되고 매개변수, 지역변수, 반환 주소에 대한 정보들이 담기게 됩니다. 이때의 콜스택에 들어가는 데이터 자체 모두 다 Stack Frame 이라 불리웁니다. Stack Frame 함수가 종료되면 복귀할 주소 함수의 모든 매개변수 지역 변수 반환할 때 복원해야하는 레지스터의 복사본(레지스터, 프로세서에 위치한 고속 메모리로 프로세서가 바로 사용 할 수 있는 데이터를 담는 영역) Q) 콜스택은 어떻게 이루어져 가나요? #include using namespace std; ..
[C++] 콜 스택 (Call Stack)Q) 콜스택이 무엇인가요? A) 프로그램을 작동 시킬때, 스택(Stack)이란 자료구조를 사용합니다. 컴퓨터에선, 주로 Source(Text), Data, Heap, Stack 메모리 구조로 이루어져있습니다. 이때 Stack에는 컴파일이 진행되고 매개변수, 지역변수, 반환 주소에 대한 정보들이 담기게 됩니다. 이때의 콜스택에 들어가는 데이터 자체 모두 다 Stack Frame 이라 불리웁니다. Stack Frame 함수가 종료되면 복귀할 주소 함수의 모든 매개변수 지역 변수 반환할 때 복원해야하는 레지스터의 복사본(레지스터, 프로세서에 위치한 고속 메모리로 프로세서가 바로 사용 할 수 있는 데이터를 담는 영역) Q) 콜스택은 어떻게 이루어져 가나요? #include using namespace std; ..
2022.04.09 -
알아두어야 하는 컴파일 타임(Complie Time)과 런타임(Run Time) 컴파일 타임 : 개발자가 소스코드를 컴파일을 통해 기계어로 변환하는 동작 과정 런타임 : 기계어로 변환된 코드가 실행되는 동작 과정 메모리 구조 Source(text) 프로그램을 실행 시키기 위해 코드, 매크로 상수(#define)가 기계어로 저장되어 있는 영역입니다. Read-Only로 지정되어 있습니다. Data 전역변수, Static 변수들이 저장된 영역입니다. Read-Write 로 지정되어 있습니다. Heap 동적으로 할당되는 변수들이 런타임시 결정되고 저장됩니다. (사용자가 할당 합니다.) 주로 낮은 주소에서 높은 주소로 할당됩니다. Stack 지역변수, 매개변수들이 저장되는 영역입니다. 주로 높은 주소에서 낮은주..
[C++] 메모리 구조 (Memory Layout)알아두어야 하는 컴파일 타임(Complie Time)과 런타임(Run Time) 컴파일 타임 : 개발자가 소스코드를 컴파일을 통해 기계어로 변환하는 동작 과정 런타임 : 기계어로 변환된 코드가 실행되는 동작 과정 메모리 구조 Source(text) 프로그램을 실행 시키기 위해 코드, 매크로 상수(#define)가 기계어로 저장되어 있는 영역입니다. Read-Only로 지정되어 있습니다. Data 전역변수, Static 변수들이 저장된 영역입니다. Read-Write 로 지정되어 있습니다. Heap 동적으로 할당되는 변수들이 런타임시 결정되고 저장됩니다. (사용자가 할당 합니다.) 주로 낮은 주소에서 높은 주소로 할당됩니다. Stack 지역변수, 매개변수들이 저장되는 영역입니다. 주로 높은 주소에서 낮은주..
2022.04.08