[기술 질문] #1_변수 종류
C++의 "변수"에 대해 알아보겠습니다.
Overview
- 메모리 구조
- 변수 종류
- 지역-Stack, 동적-Heap
- 함수 인자를 통해 함수로 값을 넘겨주는 방식
메모리 구조
1. 메모리 구조
[Basic C++] #57_동적 메모리
[Basic C++] #57_동적 메모리 C++의 "동적 메모리"에 대해 알아보겠습니다. "전문가를 위한 C"의 22 항목, "효과적인 메모리 관리"에 해당하는 내용입니다. 동적 메모리 1. 메모리 구조 1. 코드 영역 : 컴
webddevys.tistory.com

Details
- 코드 영역 : 컴파일된 프로그램이 저장되는 영역
- 데이터 영역 : Global 변수 + Static 변수가 저장되는 영역
- 힙 영역 : 동적 할당된 변수를 저장하는 영역 (런타임에 크기가 결정되는 영역)
- 스택 영역 : 함수 매개변수, 지역 변수 및 기타 함수 관련 데이터가 저장되는 영역 (컴파일 타임에 크기가 결정되는 영역)
변수 종류
1. 변수의 종류?
- "유효 범위", 그리고 할당되는 "메모리 영역"으로 구분되는 변수의 종류를 의미합니다.
- 변수의 종류는 크게 네 가지가 있으며, 지역 변수, 전역 변수, 정적 변수, 그리고 동적 변수로 나누어집니다.
2. 지역 변수
#include <iostream>
using namespace std;
int main()
{
int a = 5;
int b = 7;
}
Details
- 함수 블록 내부에서 선언되는 변수로 지정 유효 범위가 종료되면 함께 소멸됩니다.
- 초기화 작업이 권장되고, 메모리 구조의 스택 영역에 저장됩니다.
3. 전역 변수
#include <iostream>
using namespace std;
int a;
int b;
int main()
{
//...
}
Details
- 전역 변수는 함수 블록 밖에서 선언되며, 프로그램의 종료와 함께 소멸되는 변수입니다.
- 더불어, 초기화 작업이 없어도 0 값이 들어가고, 메모리 구조 중 "데이터 영역"에 저장되는 변수입니다.
4. 정적 변수
[Basic C++] #28_static 키워드
[Basic C++] #28_static 키워드 C++ 개발에서 까다로운 문법 혹은 특별한 의미를 갖는 부분에 대해 알아보겠습니다. "전문가를 위한 C"의 10 항목, "C++의 까다롭고 유별난 부분들"에 해당하는 내용입니다.
webddevys.tistory.com
static int a = 5;
Details
- 정적 변수는 "static" 키워드와 함께 선언하며, 프로그램 생성 시 한번 초기화되며 프로그램 종료와 함께 소멸됩니다.
- 함수 블록 내부에 선언된 정적 변수는 함수 블록의 종료 이후에도 소멸되지 않습니다.
- 특별환 초기화 작업을 수행하지 않아도, 0 값이 들어가며, 메모리 구조의 "데이터 영역"에 저장됩니다.
- "전역 변수"는 "extern" 키워드를 통해 외부 파일에서 접근이 가능한 변수이지만, 정적 변수는 외부 파일에서 접근할 수 없습니다. 정리하자면, 전역 변수와 정적 변수는 거의 동일하지만, 전역 변수의 접근 유효 범위가 더 넓고, 정적 변수는 함수 블록 내부에 선언되어도 소멸되지 않습니다!
5. 동적 변수
[Basic C++] #57_동적 메모리
[Basic C++] #57_동적 메모리 C++의 "동적 메모리"에 대해 알아보겠습니다. "전문가를 위한 C"의 22 항목, "효과적인 메모리 관리"에 해당하는 내용입니다. 동적 메모리 1. 메모리 구조 1. 코드 영역 : 컴
webddevys.tistory.com
int a = new int(5);
double b = new double(3.555);
A classA = new A();
Details
- 동적 변수는 컴파일 시점에 메모리 할당이 이루어지지 않고, 런타임에 메모리가 할당됩니다. 해당 메모리 영역은 프로그램의 종료 시점에 운영체제에 반납합니다.
- 앞서 말했듯이, 초기화 작업이 런타임 중에 발생하며, 메모리 구조의 "힙 영역"에 저장됩니다.
- 동적으로 할당받은 변수는 모두 사용하고나서 무조건, 무조건, 그리고 무조건 해제해주어야 합니다.
정적 vs 동적
1. 정적 할당 변수 vs 동적 할당 변수
- 정적 할당받은 변수는 컴파일 시점에 "Stack 영역"에 저장되며, 동적 할당받은 변수는 런타임에 "Heap 영역"에 저장됩니다.
- 정적으로 할당 받은 변수와 달리, 동적으로 할당받은 변수는 사용의 종료와 함께 무조건 "delete" 키워드를 통해 메모리를 별도로 해제해 주어야 합니다.
2. 스택 vs 힙
- 스택은 컴파일 시점에 크기가 결정되며 런타임 중에 크기를 변경할 수 없습니다. 다만, 접근 or 할당 성능이 매우 빠르고, 할당받은 메모리 영역을 명시적으로 해제할 필요가 없습니다. 더불어, 스택의 연속적인 메모리 공간은 메모리 단편화를 방지합니다.
- 힙은 런타임 중에 크기가 결정되며 비교적 유연합니다, 다만, 접근 or할당 성능이 비교적 느리며, 메모리 할당과 해제 모두 사용자가 직접 관리해야 합니다. 더불어, 메모리 단편화의 위험성을 갖고 있죠!
- 스택과 힙으로 나누어 놓은 이유는 힙의 유연함을 통해 메모리 공간의 낭비를 방지하고, 확실하게 사용할 메모리 공간은 컴파일 시점에 미리 스택에 할당받아 "성능"을 최대화하기 위함이 아닐까 싶습니다.
함수 인자로 값을 넘겨주는 방법
1. Call-by-Value
#include <iostream>
using namespace std;
int Operation(int a, int b)
{
return a + b;
}
int main()
{
int a = 5;
int b = 7;
cout << Operation(a, b) << endl;
}
Details
- Call-by-Value(값에 의한 전달)는 함수에 값을 넘겨주는 가장 기본적인 방법으로, 인자로 넘겨준 변수의 값을 함수의 매개변수로 복사하는 방법입니다.
- Call-by-Value의 경우, 함수 인자로 넘겨준 변수는 함수 정의부에서 활용하는 매개 변수와 전혀 다른 값입니다.
- 쉽게 말해서, 함수 호출에서 작성한 "Operation(a, b)"의 "a"와 "b"는 Operation 함수 내부의 "a"와 "b"와 전혀 다른 친구들입니다.
2. Call-by-Address
#include <iostream>
using namespace std;
int a = 5;
int b = 7;
void SomeFunc(int* ptr2)
{
ptr2 = &b;
cout << *ptr2 << endl;
}
int main()
{
int* ptr = &a;
cout << *ptr << endl;
SomeFunc(ptr);
}
Details
- Call-by-Address(주소에 의한 전달)은 함수 인자로 어떤 변수의 주소 값(포인터)을 넘겨주는 방식입니다.
- 인자를 넘겨 받은 함수는 해당 주소 값을 함수의 매개 변수로 복사합니다.
- 사실, Call-by-Address는 단순히 주소를 복사해서 주소라는 "값"을 인자로 넘겨주는 방식이므로, 결국에는 Call-by-Value가 아닌가 하는 의문이 듭니다. 더 자세한 내용 밑에 "Call-by-Reference"를 살펴보면서 알아보겠습니다.
3. Call-by-Reference
#include <iostream>
using namespace std;
void SomeFunc(int& num)
{
num = 7;
cout << num << endl;
}
int main()
{
int a = 5;
SomeFunc(a);
cout << a << endl;
}
Details
- Call-by-Reference(참조에의한 전달)는 말 그대로 "참조형 변수"를 함수의 인자로 넘겨주어, 함수의 매개변수가 해당 변수가 할당받은 메모리 영역을 공유합니다.
- 인자를 넘겨 받은 함수는 매개변수를 통해 값을 변경할 수 있으며, 이러한 동작은 원본 변수에게 영향을 끼칩니다.
- 다시 Call-by-Address로 돌아가서, Call-by-Address는 Call-by-Value와 함수 인자의 전달 방식이 동일하지만, Call-by-Reference처럼 원본 값에 영향을끼치(역참조를 통해...)는 복합적인 녀석으로 보면 될 것 같습니다.
'언어 > 기술 질문' 카테고리의 다른 글
[기술 질문]#6_동적 할당 (0) | 2023.01.27 |
---|---|
[기술 질문]#5_struct, 구조체 (0) | 2023.01.21 |
[기술 질문]#4_#define, 매크로 (0) | 2023.01.08 |
[기술 질문]#3_const 키워드 (0) | 2023.01.07 |
[기술 질문] #2_auto 키워드, extern 키워드 (0) | 2023.01.01 |
[기술 질문] #1_변수 종류
C++의 "변수"에 대해 알아보겠습니다.
Overview
- 메모리 구조
- 변수 종류
- 지역-Stack, 동적-Heap
- 함수 인자를 통해 함수로 값을 넘겨주는 방식
메모리 구조
1. 메모리 구조
[Basic C++] #57_동적 메모리
[Basic C++] #57_동적 메모리 C++의 "동적 메모리"에 대해 알아보겠습니다. "전문가를 위한 C"의 22 항목, "효과적인 메모리 관리"에 해당하는 내용입니다. 동적 메모리 1. 메모리 구조 1. 코드 영역 : 컴
webddevys.tistory.com

Details
- 코드 영역 : 컴파일된 프로그램이 저장되는 영역
- 데이터 영역 : Global 변수 + Static 변수가 저장되는 영역
- 힙 영역 : 동적 할당된 변수를 저장하는 영역 (런타임에 크기가 결정되는 영역)
- 스택 영역 : 함수 매개변수, 지역 변수 및 기타 함수 관련 데이터가 저장되는 영역 (컴파일 타임에 크기가 결정되는 영역)
변수 종류
1. 변수의 종류?
- "유효 범위", 그리고 할당되는 "메모리 영역"으로 구분되는 변수의 종류를 의미합니다.
- 변수의 종류는 크게 네 가지가 있으며, 지역 변수, 전역 변수, 정적 변수, 그리고 동적 변수로 나누어집니다.
2. 지역 변수
#include <iostream>
using namespace std;
int main()
{
int a = 5;
int b = 7;
}
Details
- 함수 블록 내부에서 선언되는 변수로 지정 유효 범위가 종료되면 함께 소멸됩니다.
- 초기화 작업이 권장되고, 메모리 구조의 스택 영역에 저장됩니다.
3. 전역 변수
#include <iostream>
using namespace std;
int a;
int b;
int main()
{
//...
}
Details
- 전역 변수는 함수 블록 밖에서 선언되며, 프로그램의 종료와 함께 소멸되는 변수입니다.
- 더불어, 초기화 작업이 없어도 0 값이 들어가고, 메모리 구조 중 "데이터 영역"에 저장되는 변수입니다.
4. 정적 변수
[Basic C++] #28_static 키워드
[Basic C++] #28_static 키워드 C++ 개발에서 까다로운 문법 혹은 특별한 의미를 갖는 부분에 대해 알아보겠습니다. "전문가를 위한 C"의 10 항목, "C++의 까다롭고 유별난 부분들"에 해당하는 내용입니다.
webddevys.tistory.com
static int a = 5;
Details
- 정적 변수는 "static" 키워드와 함께 선언하며, 프로그램 생성 시 한번 초기화되며 프로그램 종료와 함께 소멸됩니다.
- 함수 블록 내부에 선언된 정적 변수는 함수 블록의 종료 이후에도 소멸되지 않습니다.
- 특별환 초기화 작업을 수행하지 않아도, 0 값이 들어가며, 메모리 구조의 "데이터 영역"에 저장됩니다.
- "전역 변수"는 "extern" 키워드를 통해 외부 파일에서 접근이 가능한 변수이지만, 정적 변수는 외부 파일에서 접근할 수 없습니다. 정리하자면, 전역 변수와 정적 변수는 거의 동일하지만, 전역 변수의 접근 유효 범위가 더 넓고, 정적 변수는 함수 블록 내부에 선언되어도 소멸되지 않습니다!
5. 동적 변수
[Basic C++] #57_동적 메모리
[Basic C++] #57_동적 메모리 C++의 "동적 메모리"에 대해 알아보겠습니다. "전문가를 위한 C"의 22 항목, "효과적인 메모리 관리"에 해당하는 내용입니다. 동적 메모리 1. 메모리 구조 1. 코드 영역 : 컴
webddevys.tistory.com
int a = new int(5);
double b = new double(3.555);
A classA = new A();
Details
- 동적 변수는 컴파일 시점에 메모리 할당이 이루어지지 않고, 런타임에 메모리가 할당됩니다. 해당 메모리 영역은 프로그램의 종료 시점에 운영체제에 반납합니다.
- 앞서 말했듯이, 초기화 작업이 런타임 중에 발생하며, 메모리 구조의 "힙 영역"에 저장됩니다.
- 동적으로 할당받은 변수는 모두 사용하고나서 무조건, 무조건, 그리고 무조건 해제해주어야 합니다.
정적 vs 동적
1. 정적 할당 변수 vs 동적 할당 변수
- 정적 할당받은 변수는 컴파일 시점에 "Stack 영역"에 저장되며, 동적 할당받은 변수는 런타임에 "Heap 영역"에 저장됩니다.
- 정적으로 할당 받은 변수와 달리, 동적으로 할당받은 변수는 사용의 종료와 함께 무조건 "delete" 키워드를 통해 메모리를 별도로 해제해 주어야 합니다.
2. 스택 vs 힙
- 스택은 컴파일 시점에 크기가 결정되며 런타임 중에 크기를 변경할 수 없습니다. 다만, 접근 or 할당 성능이 매우 빠르고, 할당받은 메모리 영역을 명시적으로 해제할 필요가 없습니다. 더불어, 스택의 연속적인 메모리 공간은 메모리 단편화를 방지합니다.
- 힙은 런타임 중에 크기가 결정되며 비교적 유연합니다, 다만, 접근 or할당 성능이 비교적 느리며, 메모리 할당과 해제 모두 사용자가 직접 관리해야 합니다. 더불어, 메모리 단편화의 위험성을 갖고 있죠!
- 스택과 힙으로 나누어 놓은 이유는 힙의 유연함을 통해 메모리 공간의 낭비를 방지하고, 확실하게 사용할 메모리 공간은 컴파일 시점에 미리 스택에 할당받아 "성능"을 최대화하기 위함이 아닐까 싶습니다.
함수 인자로 값을 넘겨주는 방법
1. Call-by-Value
#include <iostream>
using namespace std;
int Operation(int a, int b)
{
return a + b;
}
int main()
{
int a = 5;
int b = 7;
cout << Operation(a, b) << endl;
}
Details
- Call-by-Value(값에 의한 전달)는 함수에 값을 넘겨주는 가장 기본적인 방법으로, 인자로 넘겨준 변수의 값을 함수의 매개변수로 복사하는 방법입니다.
- Call-by-Value의 경우, 함수 인자로 넘겨준 변수는 함수 정의부에서 활용하는 매개 변수와 전혀 다른 값입니다.
- 쉽게 말해서, 함수 호출에서 작성한 "Operation(a, b)"의 "a"와 "b"는 Operation 함수 내부의 "a"와 "b"와 전혀 다른 친구들입니다.
2. Call-by-Address
#include <iostream>
using namespace std;
int a = 5;
int b = 7;
void SomeFunc(int* ptr2)
{
ptr2 = &b;
cout << *ptr2 << endl;
}
int main()
{
int* ptr = &a;
cout << *ptr << endl;
SomeFunc(ptr);
}
Details
- Call-by-Address(주소에 의한 전달)은 함수 인자로 어떤 변수의 주소 값(포인터)을 넘겨주는 방식입니다.
- 인자를 넘겨 받은 함수는 해당 주소 값을 함수의 매개 변수로 복사합니다.
- 사실, Call-by-Address는 단순히 주소를 복사해서 주소라는 "값"을 인자로 넘겨주는 방식이므로, 결국에는 Call-by-Value가 아닌가 하는 의문이 듭니다. 더 자세한 내용 밑에 "Call-by-Reference"를 살펴보면서 알아보겠습니다.
3. Call-by-Reference
#include <iostream>
using namespace std;
void SomeFunc(int& num)
{
num = 7;
cout << num << endl;
}
int main()
{
int a = 5;
SomeFunc(a);
cout << a << endl;
}
Details
- Call-by-Reference(참조에의한 전달)는 말 그대로 "참조형 변수"를 함수의 인자로 넘겨주어, 함수의 매개변수가 해당 변수가 할당받은 메모리 영역을 공유합니다.
- 인자를 넘겨 받은 함수는 매개변수를 통해 값을 변경할 수 있으며, 이러한 동작은 원본 변수에게 영향을 끼칩니다.
- 다시 Call-by-Address로 돌아가서, Call-by-Address는 Call-by-Value와 함수 인자의 전달 방식이 동일하지만, Call-by-Reference처럼 원본 값에 영향을끼치(역참조를 통해...)는 복합적인 녀석으로 보면 될 것 같습니다.
'언어 > 기술 질문' 카테고리의 다른 글
[기술 질문]#6_동적 할당 (0) | 2023.01.27 |
---|---|
[기술 질문]#5_struct, 구조체 (0) | 2023.01.21 |
[기술 질문]#4_#define, 매크로 (0) | 2023.01.08 |
[기술 질문]#3_const 키워드 (0) | 2023.01.07 |
[기술 질문] #2_auto 키워드, extern 키워드 (0) | 2023.01.01 |