이번 포스트는 변수 관한 이야기이다.
이미 전에서 int char 등등 사용했다
기본적으로 cpp프로젝트 만들고 main 함수 안에 코드를 작성 하게 되는데
int global = 0; // 함수 밖에 써는 변수 == 전역변수
int main() {
int i = 0;
unsigned char data = 0; // 함수 또는 지역{} 안에 소속된 변수 == 지역 변수 이다.
return 0;
}
일단 주석 달아논거에 좀 설명이 이상한데 나중에 다시 설명 하겠다.
일단 지역 변수 부터 알아보자.
기본적으로 지역 변수와 전역 변수 기준으로 나누는건 함수로 나눈다.
int main() {
unsigned char data = 0;
unsigned char data = 100; //data를 100으로 바꾸고싶다고 다시 선언 하는건 불가능하다.
data = 100; //이렇게 사용해야 가능
return 0;
}
그러면 극단적인 예시로 하나 들어보자면 지역을 만들어서 같은 이름의 변수를 선언 한다고 하면 가능할까?
int main() {
unsigned char data = 0;
{
unsigned char data = 100;
}
return 0;
}
위에서 똑같은 변수를 지역 {} 을 만들고 그안에 만들었다고 하면 이건 동작할까?
가능하다
그러면 저 위에 data 값은 무었일까 ? 0이다. 왜냐면 지역에서 만들어진 변수는 지역이 끝나면 다 지워진다.
이런한 특징을 잘 보여주는건 for 문 while 문 이다. 즉 반복문에서 예시를 들어보겠다.
int main() {
unsigned char data = 0;
for (int i = 0; i < 10; i++) {
data += 1;
}
return 0;
}
코드에 data 값 10이다 한번 반복할때마다 1을 data에 더해주는것이다.
그러면 저 코드을 해석해보자
for (반복할 변수; 반복할 변수에 조건체크; 반복할 변수 변경) {
}
먼저 반복을할 변수를 앞에 두고 2번째는 반복할 조건을 체크한다 여기는 true false 로 체크한다 3번째는 값을 변경하는 부분이다.
그러면 이걸 보고 다시 위에 코드를 보면
i = 0으로 선언을 하고 i < 10 i가 10보다 작으면 true 라서 반복적으로 코드를 돌게되고 한번 돌때마다 i++ i에 ++ 즉 1을 더해준다.
만약 가운데 조건이 없으면 for문을 영원히 돌기 때문에 조건을 잘 걸어두자.
그래서 즉 i가 10이랑 같거나 더 클때까지 for문을 반복하고 반복할때마다 i를 1씩 증가 시킨다고 보면 될꺼같다.
그러면 코드로 보자. 먼저 브레이크 포인드 계속 찍더도 볼수있긴하지만 printf라는 함수를 사용하자.
#include <stdio.h>
int main() {
unsigned char data = 0;
for (int i = 0; i < 10; ++i) {
printf("test");
}
return 0;
}
맨위에 #include <stdio.h> 적어주면 printf라는 함수를 이용할수있다.
이건 나중에 쓸텐데 일단 stdio.h 라는 파일을 지금 내가 열고있는 파일에 더한다고 생각만 해두자
stdio.h 안에 있는 printf 라는 함수를 이용할꺼다.
printf는 string 을 받는데 이 받는 변수를 그대로 콘솔창에 출력해주는 함수이다.

실행 결과를 보면 확인할수있다. 근데 엔터키를 안친거같이 한줄에 나왔다. 그럴경우
printf("test\n");
test 뒤에 \n 를 넣자 그러면 언터키 친다고 반응해서 처리해준다.

반복하는걸 확인할수있다.
그러면 이번엔 또다른 반복문 while 문을 보자.
사실 기능 자체만 보면 for문이랑 똑같이도 쓸수있는데 왜 나눠지는지 궁금할텐데
코드를 먼저 설명하고 봐야 이해가가기 때문에 코드를 먼저 보자.
#include <stdio.h>
int main() {
unsigned char data = 0;
while (data < 10) {
printf("test\n");
data++;
}
return 0;
}
이번엔 while()안에 비교하는 코드 하나만 보이는데 맞다 저값이 true면 계속 실행 false 면 반복안하고 나가는명령어이다.
보면 차이가 느껴진다. 지정횟수 반복이랑 조건이 만족할때까지 반복한다고 보면 된다.
추가로 여기서 사용할수있는 명령어가 또있는데
반복문을 돌다가 continue;를 만나면 더이상 반복문안에있는 코드 중에서 그뒤에있는 코드는 실행을 더이상 안하고
다시 반복문 처음으로 돌아간다.
#include <stdio.h>
int main() {
unsigned char data = 0;
while (data < 10) {
if (data % 2) {
printf("continue; \n");
continue;
printf("continueTo; \n");
}
else {
printf("test\n");
}
data++;
}
return 0;
}
코드롤 보면 코드 안에 if문이 있다. data % 2로 할때 0 또는 그이상 인데 이런 값은 또 true false 로도 사용할수있어서 짝수 홀수 체크하는 코드 이다.
if (data % 2) 값이 true일때
실행을 해보면 코드가 영원히 안끝나는걸 알수있다. 그리고 continue; 만 나오는것도 확인가능하다.
이유는 continue를 만나고 그뒤에있는 continueTo; 도 안나오고 data++; 역시 동작을 안해서 data값이 바뀔일이없기때문에
이런 동작을 하는것이다.
while(true)코드는 평생 도는 코드지만 안에 break;를 쓴다면 탈출할수있다.
이런 코드 switch 문에서 도 확인이 가능한데
#include <stdio.h>
int main() {
unsigned char data = 0;
while (true) {
if (data == 9) {
printf("break; \n");
break;
}
data++;
}
return 0;
}
코드를 실행하면 break; 이 한번 찍히고 while를 빠져나오는걸 확인할수있다. data가 9일때 빠져나온다.
사실 예시가 좀 엉성하긴한데 그냥 조건으로 걸면 if문을 안써도 해결할수있지만 예시를 만들기 위해서 그런거니 넘어가 주자.
여기서 함수 라는 말이 나오는데 지금은 간단하게 설명하고 넘어간다.
기본적으로 함수는 하나의 기능을 이야기 한다.
보통 프로그램 짤때 기능 별로 나누는데
예시로 하나 들어보면 물건 a를 b로 이동하는 기능을 만들어 한다고 가정해보자
그러면 물건 을 드는 기능, 자리를 이동하는 기능, 물건을 내려두는 기능으로 3가지로 구분할수있다.
그러면 여기서 하나에 기능이 함수로 구현할수도있다.
만약에 2개의 int형 변수를 받아서 더하기 해주는 프로그램을 작성하고싶다고 할때
int main() {
unsigned char data = 0;
data = 10 + 2;
data = 10 + 80;
data = 30 + 20;
data = 4 + 20;
return 0;
}
이렇게 하나 하나 해도 가능하지만 이 더하는 기능을 함수로 빼면 더 깔끔하게 보일수도있을꺼같다.
int Add(int left, int right) {
return left + right;
}
int main() {
unsigned char data = 0;
data = Add(10, 2);
data = Add(10, 80);
data = Add(30, 20);
data = Add(4, 20);
return 0;
}
Add 라는 함수 를 만들었고 앞에 int 를 적어서 int형으로 결과값을 리턴 돌려주고 동작으로 들어온 변수 2개를 더하기해서 그결과값을 보내주는것이다.
이렇게 사용하면 이제 이 함수가 쓰인곳도 찾기 편하고 보기에도 좋다.
근데 지금 지역변수 전역 변수을 보고있으니 확인해보면
main 함수 안에 지역변수는 data 이다.
그러면 여기서 main 함수 밖에 있는 Add 함수에 left right 변수는 전역변수인가??
아니다
저 두변수 Add 함수 안에 있는 지역변수로서 동작한다. 값을 전달 받기 위해서 변수를 만든거다.
함수를 보다면 재귀 함수라는걸 볼수있다.
함수는 다 아는 그 함수가 맞는데 재귀 라는말을 위키 백과에서 가져오면
컴퓨터 과학에 있어서 재귀(再歸, recursion)는 자신을 정의할 때 자기 자신을 재참조하는 방법을 뜻하며, 이를 프로그래밍에 적용한 재귀 호출(recursive call)의 형태로 많이 사용된다. 또 사진이나 그림 등에서 재귀의 형태를 사용하는 경우도 있다.
즉 자기자신을 다시 호출한다 는 말이다.
int FunctionT() {
FunctionT();
printf("test1");
return 0;
}
만약에 이런 함수 를 보면 FunctionT안에 다시 자신을 부르는 FunctionT() 가있고 그러면 새로운 FunctionT()를 호출하고
이걸 반복한다.

가끔 영상에서 보던 같은걸 계속 보는 느낌이다.
하지만 어떤 경우에서는 아주 잘 사용할수있는데
가장 많이 예시를 드는경우가 팩토리얼 을 재귀함수로 구현할때이다.
팩토리얼을 잘 모른다면 -> 팩토리얼
간단하게 설명하자면 1부터 N수의 곱이다.
그러면 이걸 재귀 함수로 구현해본다면
int Factorial_Re(int num) {
if (num == 1){
return 1;
}
return num * Factorial_Re(num - 1);
}
int main() {
int data Factorial_Re(5);
return 0;
}
이된다.
만약에 5가들어온다면
5 Factorial_Re(4); 인데 재귀함수로 다시 불렀으니
4 Factorial_Re(3);
3 Factorial_Re(2);
2 Factorial_Re(1);
return 1;
요 return 을 만나면 다시 거슬로 올라가서
1, 2, 6, 24, 120 으로 함수 종료하면가 리턴값이 올라가고 메인함수 에서 부른 Factorial_Re(5); 리턴값은 120이 된다.
위에서 사용한 지역 변수 와 전역 변수 코드를 다시 보자.
int global = 0; // 함수 밖에 써는 변수 == 전역변수
int main() {
int i = 0;
unsigned char data = 0; // 함수 또는 지역{} 안에 소속된 변수 == 지역 변수 이다.
return 0;
}
함수 밖에서 사용 하는 변수 인데
이게 메모리로 보면 즉 Data 영역 에 할당 되는 영역이다
사실 더 분류 하면 엄청 많아지는데 자주 보는 종류와 메모리 영역으로 보면
1.지역변수
2.전역변수
3.정적변수
4.외부변수
1.스택영역
2.데이터영역
3.읽기 전용
4.힙 영역
으로 나뉜다.
여기서 전역 변수는 데이터 영역인데
이 영역은
프로그램이 시작할때 이 전역 변수 들이 만들어질때 데이터 영역도 메모리에 할당된다.
즉 메인함수 실행할때 들어와있는것이다.
그리고 프로그램 돌아가는동안 계속 자리 잡고있다가 프로글램 종료 하면 그때 할당 해제 된다.
지역변수와 달리 없어지고 영역 안에서 만들어지고 사라지고 하는게 없다.
#include <stdio.h>
int global = 0;
void Test() {
++global;
}
int main() {
Test();
Test();
Test();
Test();
global = 0;
return 0;
}
이렇게 사용된다면 global 변수는 안사라지고 값을 유지 하면서 리셋 없이 사용될수 있는것이다.
그리고 이곳 저곳 함수 안이나 이런곳에서 불어와서 값을 변경한다던지
할수도있다.
그러면 그냥 다 전역변수로 두기엔 특징으로 나와있는것으로 프로그램 시작할때 만들어지고 끝날때 사라지기때문에
메모리 차지 하는부분이 있어서 조심히 사용하자.