Programming🧑💻
-
콜 스택 동작을 통해 알아보는 함수 호출Programming🧑💻/Cpp 2025. 2. 4. 23:29
콜 스택이란?프로그램이 실행되어 메모리에 올라오면, 운영체제는 해당 프로그램을 프로세스라는 실행단위로 관리하면서 필요한 컴퓨팅 자원 (CPU 시간, 메모리 등) 을 할당합니다. 각 프로세스는 자신만의 독립된 메모리 공간을 할당받는데, 이를 프로세스의 메모리 구조라고 합니다. 프로세스는 뭘까?프로그램은 컴퓨터가 특정 작업을 수행하기 위해 작성된 명령어들의 집합입니다. 쉽게 말해 우리가 하드디스크에 저장해둔 실행 파일이라고 할 수 있죠. 예를 들어 워드나 크롬 브라우저 같은people-analysis.tistory.com 프로세스의 메모리는 크게 다음과 같은 영역으로 구분됩니다. 코드(텍스트) 영역: 실행할 프로그램의 코드가 저장되는 영역데이터 영역: 전역변수와 정적(static) 변수가 저장되는 영역힙(H..
-
포인터의 크기는 어떻게 결정될까?Programming🧑💻/Cpp 2025. 2. 3. 23:48
변수는 변수를 선언할때 지정한 타입에 따라 값을 저장하기 위해 사용할 수 있는 메모리의 양이 결정됩니다. 예를 들어 일반적인 경우 char 의 경우에는 1byte , int의 경우에는 4byte가 해당 변수를 위한 메모리 공간으로 할당됩니다. 그렇다면 포인터 자체의 크기는 어떻게 될까요? 이 질문에 답하기 위해 간단한 C++ 코드를 작성하여 실행하면 32 비트 시스템에서는 모든 포인터가 4바이트, 64 비트 시스템에서는 모든 포인터가 8바이트로 출력됩니다. 비트 시스템은 뭐고 왜 이런 결과가 나오게 되는 걸까요?#include using namespace std;int main() { // 다양한 타입의 포인터 선언 int* intPtr; char* charPtr; double* d..
-
이중 포인터Programming🧑💻/Cpp 2025. 2. 1. 12:24
포인터는 일반적으로 다른 변수의 메모리 주소값을 저장하는 데 사용됩니다. 하지만 때로는 포인터 자체의 메모리 주소를 저장해야 할 필요가 있습니다. 이럴 때 포인터의 포인터(이중 포인터)를 사용합니다.int x = 10; // 변수 x (값: 10)int* p = &x; // 포인터 p는 x의 메모리 주소를 저장int** q = &p; // 이중 포인터 q는 포인터 p의 메모리 주소를 저장int*** r = &r;만약 변수 x가 메모리 주소 220번지에 있고, 포인터 p가 209번지에 있다면:p는 x의 주소인 220을 저장q는 p의 주소인 209를 저장r은 q의 주소인 199를 저장 이렇게 포인터의 포인터를 사용하면 포인터 자체의 메모리 주소를 참조하고 관리할 수..
-
포인터도 타입이 필요한 이유Programming🧑💻/Cpp 2025. 1. 31. 12:33
포인터 연산포인터 연산에서 중요한 점은 포인터의 타입에 따라 실제 증감되는 메모리 주소의 크기가 달라진다는 것입니다.char* ptr1 = (char*)1000; // char는 1바이트int* ptr2 = (int*)1000; // int는 4바이트double* ptr3 = (double*)1000; // double은 8바이트ptr1++; // 주소값: 1001ptr2++; // 주소값: 1004ptr3++; // 주소값: 1008char 포인터는 1바이트씩 증가int 포인터는 4바이트씩 증가double 포인터는 8바이트씩 증가즉, ptr++ 연산을 수행할 때 실제로는 다음과 같은 계산이 이루어집니다.새로운주소 = 현재주소 + (sizeof(포인터타입) * 1)포인터 타입을 제한하는 이..
-
변수와 포인터Programming🧑💻/Cpp 2025. 1. 30. 23:48
변수 선언변수를 선언하면 해당 변수의 값을 저장하기 위한 메모리를 할당한다.이때 얼만큼의 메모리를 할당할지는 변수의 타입에 따라 결정된다.예를 들어 일반적으로 int 타입의 경우에는 4byte를 char 타입의 경우 1byte를 할당한다.2025.01.30 - [Programming🧑💻/Cpp] - 변수와 포인터시스템 내부적으로 룩업 테이블이라는 것을 가지고 있으며 해당 테이블에는 변수명, 변수 타입, 메모리 시작 주소를 가지고 있다.변수를 선언한 다음에 `a = 5` 명령어가 실행되면 내부적으로는 룩업 테이블에서 변수명 a에 대응하는 메모리 시작 주소를 찾아가서 5라는 값을 저장한다.포인터란?다른 변수의 주소를 값으로 저장하는 변수변수를 선언하는 이유는 숫자나 문자와 같은 특정한 '값'을 저장하기..
-
타입은 왜 중요할까?Programming🧑💻 2025. 1. 29. 23:48
프로그래밍 언어는 변수 선언시 타입 명시 유무에 따라 크게 두 가지로 나눌 수 있습니다. JavaScript나 Python같은 스크립트 언어들은 변수 선언 시 타입을 명시하지 않아도 되며, 런타임에 타입이 결정되는 동적 타입 시스템을 사용합니다. 반면 C나 Rust와 같은 언어들은 변수 선언 시 타입을 명시적으로 지정해야 하며, 컴파일 타임 이전에 타입이 결정되는 정적 타입 시스템을 채택하고 있습니다. 그렇다면 왜 C나 Rust와 같은 언어들은 변수 선언 시 타입을 명시해야 할까요? 이는 타입 지정을 통해 개발자가 데이터를 표현하는 데 필요한 메모리를 직접 제어할 수 있도록 하기 위함입니다. 컴퓨터는 모든 데이터를 0과 1의 나열로 표현합니다. 각 자리에는 0 또는 1만이 올 수 있으며, 이러한 값들의 ..
-
차근 차근 살펴보는 GitProgramming🧑💻/Git & Github 2024. 4. 28. 16:41
변경사항을 추적하자프로젝트를 진행해 나가며 코드의 양이 점점 많아 지면어느 순간 내가 무언가를 바꿨는데 뭘 바꿨는지 기억이 나지 않는 상황이 벌어집니다. 이와 관련된 상황들을 예방하기 위해서는 버전 관리를 해야합니다.그리고 git은 각 ‘커밋’(코드 덩어리)을 세이브 포인트로 하여 , 이들을 비교하며 무엇이 추가되었고 빠졌는지 변경점을 쉽게 알 수 있도록 도와주는 친구 입니다. 예를 들어 첫번째 커밋(코드 덩어리)에서는 파란색으로 보이는 사과 아이콘을 빨간색으로 바꾼다면 Git은 이 변경사항을 인지하고 이 변경점들을 바탕으로 새로운 커밋(코드덩어리)를 만들 수 있게 해줍니다. 개인이나 팀 내부에서 가지고 있는 룰에 따라 기준에 충족하는 코드의 변경사항이 생기는 경우 이를 커밋(별도의 커밋으로 만들어 놓으..
-
DTO(Data Transfer Objects)를 왜 쓸까?Programming🧑💻/Spring 2023. 8. 21. 15:52
DTO를 사용하는 이유 DTO(Data Transfer Objects)는 개발할 소프트웨어의 아키텍처가 계층화되어 있어서 각 레이어 간의 데이터의 교환이 필요하거나 외부 시스템과의 상호작용이 있는 경우 데이터를 주고받는 것을 용이하게 만들기 위해 사용하는 데이터 전송용 객체이다. 엔티티를 직접 사용하여 정보를 전달할 수 있지만 추후 기술할 이점들 때문에 DTO를 사용한다. 일단 이해를 위해서 다음과 같은 상황을 가정해 보자. 당신은 장난감 가게를 운영하고 있으며 다양한 장난감을 보유하고 있으며 장난감이라는 각 객체는 상품명, 가격, 제조일자, 제조국, 보증기간 등 다양한 정보를 가지고 있다. 이때 장난감이라는 객체는 변하지 않지만 이 객체를 어디서(계층)에서 다루냐에 따라서 장난감이라는 객체에 대해 필요..