함수

Yama·2023년 12월 1일
0

어소트락 수업

목록 보기
5/55

재정의 오류.

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

변수의 종류

  1. 지역변수
  2. 전역변수
  3. 정적변수(static)
  4. 외부변수(extern)

메모리 영역

  1. 스택
    • 함수, 지역 변수
  2. 데이터
    • 전역 변수
    • 동적 할당
  3. ROM(Read Only Memory)
    • 코드 및 초기화 데이터

C++이 어려운이유

  • 프로그래머가 좀더 낮은 수준에서 생각해야한다.
  • 내가 만든 코드가 메모리 어디에서 돌아가고있는지 명확하게 알아야 한다.

C++ 공부 방법

  • 메모리가 그려질정도로 숙련도를 올려야함.
    • 초반에는 손으로 그려보면서 지금 메모리에 어디있는지 그려보면서하깅.
  • 배운것을 활용해서 코드 다 생각해서 쳐보기.(다른 코드도 생각해서 만들기)

함수(Function)

  • 함수의 구성요소
    1. 반환타입
      • 참고: void(반환 타입이 아무것도 없다.)
    2. 함수 이름
    3. 입력 인자 타입

모듈화

  • 모듈화
  • 기능을 다 쪼개는것.
    • 부담스러운 큰기능을 구현할려고할때 지금까지 쌓아둔 작은것들이 쌓아서 큰 기능을 만들수 있당.
    • 아주 간단한 기능들도 다 분리를해서 쌓아가는 과정을 습관처럼 가져가기.

더하기(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함수 호출
    1. 호출하면서 200, 400인자를 Add함수에 보냄
    2. 보낸인자를 Add함수가 받는다
    3. 받은 인자 2개를 더해서 Result 변수에 대입한다.
    4. 더한값을 반환한다.
    5. 반환받은 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; // 0이 아니라 1인 이유는 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) // for문에 int i도 for문 지역의 i다.
	{
		Result *= Num;
	}

	int i = 0; // for의 i랑 다른 변수다.(구분된다.)

	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;
}
  1. main함수가 시작되기전 스택메모리에 int a와 i의 공간을 잡는다
  2. main함수가 시작된다.
  3. 먼저 a공간에 쓰레기값 대신에 0을 대입해준다.
  4. Add함수 호출.
  5. 또 Add함수 호출되기전에 스택메모리 영역에 Add함수의 int a,b,Result의 공간을 스택메모리 영역에 잡는다.
  6. a와 b값을 더해서 Result값을 만들고 Result값을 반환하면서 Add함수의 메모리 영역을 해제한다.
  7. 그 받은 반환값을 메인함수 int i에 대입한다.
  8. 메인함수도 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); // 전방 선언, Linking


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; // 지역(Local) 변수
	
	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

0개의 댓글