#따배씨 4.2 전역 변수, 정적변수, 내부연결, 외부연결
by #독개#이번 챕터는 52분짜리 강의이다. 양이 좀많은 만큼 얻는게 많을것이라 생각한다.
기회가 되면 언제든 다시한번씩 2배속으로 보자
정리를 미리 좀하고 시작하겠다
내부연결,외부연결
컴파일러가 exe파일을 만들어 주는데
1. 각각의 cpp파일의 정보를 담은 obj파일을 따로 만든다
2. obj파일 안에서 Linker가 여러cpp파일을 다 엮어준다
(어디서 무슨 함수가 쓰였으니 main.cpp 의 abc()는 function.cpp 에서 선언된 abc()이니까 연결 .. 이런식)
3. 하나의 exe파일을 만들어준다
Internal Linkage 내부연결 : 하나의 파일 안에서만 변수,함수등 사용가능
External Linkage 외부연결 : 외부의 파일에서 변수,함수등 프로토타입 선언해주면 사용가능
전역변수 (global)
외부 전역변수
extern은 생략가능
전역변수 네이밍시에는 전역변수라는 표현으로 g_ 를 붙여주는게 좋다
{ }에 속하지 않게 변수선언 및 초기화 한다. (extern) int a = 3;
외부 파일에서
(extern) int a; 이런식으로 프로토타입 선언하면 그파일 안에서 사용 가능하다
외부파일에서 변수의 값을 바꿀수 있다 (최대의 단점, 이래서 꼭필요할때를 제외하고는 쓰지 않는다)
많은 오류를 유발한다
실제로 다른파일의 함수를 프로토타입 선언해서 사용할때도 extern이 생략 되어있는 것
객체지향을 배워서 대부분을 지역변수를 사용해서 코딩하고 왠만하면 전역변수는 안쓰는게 좋다
꼭 필요할때는 사용하자
내부 전역변수
{ }에 속하지 않게 변수선언 및 초기화 한다. static int a = 3;
이렇게 선언하면 이파일 안에서만 전역변수로 사용 가능하다
정적변수 (Static)
{ } 해당 스코프에서만 효력이 발생하는 지역변수와 같은 개념이긴한데
메모리 할당을 static으로 받는다
지역변수는 선언시에 할당받아 } 를 만나면(해당scope가 끝나면) 운영체제로 메모리를 반납한다
그리고 다시 선언되면 새로운 메모리 공간(주소가 다른)을 할당받는다.
(디버깅 해보면 같은주소를 받아올때가 있는건 이것은 컴파일러가 도와주는거다 효과적으로)
static은 한번 메모리공간을 받으면 재 초기화 할수 없다
곧 정적변수 선언시에는 반드시 초기화를 해줘야 한다
선언은 cpp에 프로토는 h에
test.h 파일에
namespace ABC 를 만들고 안에 cont double pi(3.13); 를 넣어서
다른파일에서 각각 동일한 헤더파일을 include한다음에 ABC::pi 이렇게 불러왔는데 메모리 주소값이 다르다
즉 메모리가 2개가 할당됬더라 이게 수천개씩이면 어쩔꺼야
이부분에 대한 해결로 하나의 cpp파일에 다시 선언하고
헤더파일에 extern double pi; 를 프로토타입 선언해주고 헤더파일을 불러와 사용하니 하나의 주소로 되더라
강의 42분을 보자
전체코드
#include <iostream>
//나중에 가면 거의 지역변수만 사용하게 될것이다
//전역변수는 다른파일에서도 쓸수 있는데 편하겠다 노놉 가급적 사용안함
//꼭전역변수를 사용해야할 이유가 있을때 사용해야하니 배운다
//컴파일할때 cpp파일을 별도의 obj파일로 만들고 각각을 Linkage가 연결시켜주고 exe파일을 만듦
//{ } 안에서만 사용가능한 지역변수는 Linkage X
//내부에서만 사용할수 있는경우를 Internal Linkage 내부연결
//외부에서 사용할수 있는 경우를 External Linkage 외부연결
//global variable 전역변수 : 써야할땐 g_ 이렇게 해주는게 좋다, 가장좋은건 객체지향배우고 전역변수 안쓰는것으로 하는것
//static 정적변수 : 실제코딩시에는 잘안쓰는데 디버깅시에는 유용하게 쓴데 전역변수가 아니므로 지역변수처럼 다른 scope에서 사용 및 접근 불가
//
using namespace std;
extern int doSomething(int a, int b); //사실은 extern int doSomething(int a, int b); 인데 extern생략가능
extern int g_abc; //변수도 다른파일꺼 선언만하면 사용할수있다 전역변수 extern생략가능 단, 다른파일에서 변수값 바꿔버릴수도 있다 그게문제다
void ExplainStaticVariable();
int value = 113; // 전역변수다 역시나 다른파일에서 extern int value;로 프로토타입선언하면 사용가능
static int valuse2 = 1; // 전역변수인데 이파일 내부에서만 사용할수 있다 (내부연결)
int main()
{
cout << g_abc << endl;
g_abc = 999;
//int value = 2; //전역변수와 이름이 같지 이러면 Name Hiding 혹은 Shadowing 을 통해 이름을 덮어버린다
//cout << value << endl; //지역변수를 출력
//cout << ::value << endl; //전역변수를 출력 (내부에서 전역변수를 사용하는방법 다른영역의 것을 가져옴 ::)
cout << doSomething(3, 5) << endl;
ExplainStaticVariable();
ExplainStaticVariable();
return 0;
}
void ExplainStaticVariable()
{
//만일에 그냥 int a = 1;이면 부를때마다 1로 초기화되서 2가계속 출력 지역변수로 } 만나면 반납하고 다시 할당받고 반납하고 (이때 같은주소를 가질수도 있는건 컴파일러가 도와주는것이다 할당-반납은 동일)
//그러나 정적변수 선언(정적메모리를 할당받으면) 계속 그메모리주소를 쓴다 초기화는 처음1번밖에 하지 않는다 반납하는건 똑같다
//맨처음 메모리 스태틱 으로 받아오는 개념 추후에 동적할당때 다시배움맨처음 메모리 스태틱 으로 받아오는 개념 추후에 동적할당때 다시배움
//곧 처음 정적변수 선언시에는 반드시 초기화를 해줘야 한다는말
static int a = 1;
int b = 1;
++a;
cout << a << endl;
}
🐱👓독하게 개발
'🔥 프로그래밍 학습 > C++' 카테고리의 다른 글
| #따배씨 4.4 auto키워드와 자료형 추론 (0) | 2022.11.11 |
|---|---|
| #따배씨 4.3 Using문과 모호성 (0) | 2022.11.11 |
| #따배씨 4.1 지역변수,범위(scope),지속기간 (0) | 2022.11.08 |
| #따배씨 3.9 Bit flags, Bit masks 사용방법 (추가할것) (0) | 2022.11.08 |
| #따배씨 3.8 비트단위 연산자 Bitwise Operators (추가할것) (0) | 2022.11.08 |
블로그의 정보
독한 개발자
#독개#