재정의 오류.
int main(void)
{
int a = 0;
int a = 0;
a = 100;
}
- a변수 정의를 2번해서 재정의 오류 발생한다.

변수의 종류
- 지역변수
- 전역변수
- 정적변수(static)
- 외부변수(extern)
메모리 영역
- 스택
- 데이터
- 힙
- ROM(Read Only Memory)
C++이 어려운이유
- 프로그래머가 좀더 낮은 수준에서 생각해야한다.
- 내가 만든 코드가 메모리 어디에서 돌아가고있는지 명확하게 알아야 한다.
C++ 공부 방법
- 메모리가 그려질정도로 숙련도를 올려야함.
- 초반에는 손으로 그려보면서 지금 메모리에 어디있는지 그려보면서하깅.
- 배운것을 활용해서 코드 다 생각해서 쳐보기.(다른 코드도 생각해서 만들기)
함수(Function)
- 함수의 구성요소
- 반환타입
- 참고: void(반환 타입이 아무것도 없다.)
- 함수 이름
- 입력 인자 타입
모듈화
- 모듈화
- 기능을 다 쪼개는것.
- 부담스러운 큰기능을 구현할려고할때 지금까지 쌓아둔 작은것들이 쌓아서 큰 기능을 만들수 있당.
- 아주 간단한 기능들도 다 분리를해서 쌓아가는 과정을 습관처럼 가져가기.
더하기(Add)함수 구현해보기.
int Add(int, int);
int Add(int a, int b)
{
int Result = a + b;
return Result;
}
int main(void)
{
int i = Add(200, 400)
}
- 더하기 함수 실행 순서
1. 메인함수에서 Add함수 호출
- 호출하면서 200, 400인자를 Add함수에 보냄
- 보낸인자를 Add함수가 받는다
- 받은 인자 2개를 더해서 Result 변수에 대입한다.
- 더한값을 반환한다.
- 반환받은 600을 메인함수 i변수에 대입한다.
- int Add(int, int);
- 인트를 반환하니까 같은 타입의 자료형으로 맞춰주는게 좋다.
- 전방선언, Linking
- 함수 선언할때는 int타입만 받을거다만 적어두어도 오류 아니당.
int Add(int a, int b)
{
int Result = a + b;
return Result;
}
- 함수 정의할때는 받은 인자를 저장할 변수도 적어줘야한다.
함수의 선언과 구현은 따로 할 수도 있고 같이 할수도있다.
디버깅 단축키(추가)
- F10 : 한 단계 실행(현재 함수 기준)
- F11 : 한 단계 실행(최소 단위)
밑^지수 함수만들기
int Pow(int Num, int Exponent)
{
int Result = 1;
for(int i = 0; i < Exponent; ++i)
{
Result *= Num;
}
return Reuslt;
}
int main(void)
{
int i = Pow(2, 5)
}
지역변수
int Pow(int Num, int Exponent)
{
int Result = 1;
for (int i = 0; i < Exponent; ++i)
{
Result *= Num;
}
int i = 0;
return Result;
}
- Result, i(for문), Num, Exponent, i
- int Num,int Exponent또한 Pow함수의 지역변수다.
메모리 영역 - 스택 영역
- 함수와 지역변수가 스택 메모리 공간에 들어간다.
함수
- 지정된 기능을 수행하는것.
- 함수를 돌릴떄는 메모리 공간이 필요하다
해당 코드가 시작하기도 저에 메모리 공간이 잡혀있는 이유?


- 로컬 메모리는 그 함수 내부의 지역변수들을 다보여주는 것이다.
- 스택 메모리가 함수가 호출되면 그 함수의 공간을 미리 스택 메모리 영역에 잡아두기 떄문이다.(설계도면)
main함수 -> Add함수 스택 메모리 공간의 변화
int Add(int a, int b)
{
int Result = a + b;
return Result;
}
int main()
{
int a = 0;
int i = Add(200, 400);
return 0;
}
- main함수가 시작되기전 스택메모리에 int a와 i의 공간을 잡는다
- main함수가 시작된다.
- 먼저 a공간에 쓰레기값 대신에 0을 대입해준다.
- Add함수 호출.
- 또 Add함수 호출되기전에 스택메모리 영역에 Add함수의 int a,b,Result의 공간을 스택메모리 영역에 잡는다.
- a와 b값을 더해서 Result값을 만들고 Result값을 반환하면서 Add함수의 메모리 영역을 해제한다.
- 그 받은 반환값을 메인함수 int i에 대입한다.
- 메인함수도 return 0;을 해서 스택메모리영역에서 해제된다.
.exe파일

- c++로 찬 코드가 obj파일을 생성시킨다 -> 최종적으로 Linking과정을 하고 -> 컴퓨터가 이해하는 바이너리 코드로 변환한다.
- exe파일을 실행하면 시스템 메모리(Ram)에 exe파일의 main함수의 스택메모리 공간을 할당받는다.
- 코드가 실행되면서 Add함수호출하면서 스택 공간에 공간을 할당한다. 그리고 결과를 반환하면 Add 공간을 해제하고 값을 메인함수에 반환한다.
함수와 스택메모리는 동일시하면 안된다.
- 함수는 어떤일을 사용해야하는 설명서(설계도면)
- 스택메모리는 메모리가 할당되면서 작업하는 공간이다.
우리가 친 소스 코드는 메모리영역 - Rom
- 우리가 쳤던 코드들은 rom영역에서 보고 메모리가 판단한다.
메인 함수에서 Add함수를 호출할떄 200과 400이 어디서 나온것인가.?
- 이미 코드상에서 아예 상수로 적혀있는것들은 2진수로 적혀있다.

- 190h,0C8h(2진수로 저장됨)
- 우리가 친 한줄의 코드도 어셈블리어 코드로 가면 여러 줄로 표현되있는것.
- 그래서 값을 읽어와서 더한 값을 반환한다.
함수 호출 규칙
- _cdecl
- 호출자에서 그 위의 함수를 종료시켜서 값을 전달받고 그 위의 함수를 종료한다.
- _stdcall
- 그 호출자가 아닌 그 함수를 종료하기전에 레지스터 메모리에 리턴값을 저장하고 메인 함수에서 레지스터에 저장된값을 가져온다.
강의 코드
#include <iostream>
#include <stdio.h>
int Add(int, int);
int Add(int a, int b)
{
int Result = a + b;
return Result;
}
int Pow(int Num, int Exponent)
{
int Result = 1;
for (int i = 0; i < Exponent; ++i)
{
Result *= Num;
}
return Result;
}
int main()
{
int a = 0;
printf("");
int i = Add(200, 400);
i = Pow(2, 10);
return 0;
}
1차 23.12.01
2차 23.12.05
3차 23.12.06
4차 23.12.11
5차 23.12.17
6차 23.12.24
7차 24.01.01
8차 24.01.22