TIL 2024/7/24

Sung Joo Lee·2024년 7월 24일
0

함수의 정의

  • CPP 프로그램의 함수

    • CPP 표준 라이브러리(함수와 클래스)
    • 써드 파티 라이브러리(함수와 클래스)
    • 직접 구현한 함수와 클래스
  • 함수 → 모듈화 → 재사용성

    • 모듈화 : 코드를 독립적으로 연산으로 분할
    • 연산들을 재사용
#include <iostream>

int main()
{

	read_input();

	process_input();

	write_output();

	return 0;
}

위의 코드가 하드 코딩을 하지 않고 ‘모듈화’를 시켜 만든 코드 → 필요 할 때 마다 사용 가능하다.

  • 함수를 사용할 때 알아야 하는 것

    • 함수의 기능을 알아야 함
    • 함수에서 필요로 하는 정보를 알아야 함
    • 함수가 리턴하는 것을 알아야 함
    • 어떤 오류가 발생하는지 알아야 함
    • 성능상의 제약에 대해 이해야 함
  • 함수를 사용할 때 몰라도 되는 것

    • 함수가 내부적으로 어떻게 동작하는지
      • 예를 들어 우리가 printf()를 사용하면서 안의 함수가 어떻게 동작하는 지 알 필요없다.

cmath 예제

  • 표준 라이브러리에 들어있음 ,수리적 연산 함수들 제공

참고)

여기서 말하는 표준 라이브러리란?

표준 라이브러리(standard library)는 특정 프로그래밍 언어와 함께 제공되는 함수, 클래스, 모듈 등의 집합을 말합니다. 이 라이브러리는 프로그래밍 언어의 기본 설치 패키지에 포함되어 있어서 추가적으로 다운로드하거나 설치할 필요 없이 바로 사용할 수 있습니다

fucntion_name(arguments);

std::cout << sqrt(400.0); << std::endl;// sqrt()함수를 사용 가능함
result = pow(2.0,3.0); // 2^3 

함수의 정의에 필요한 요소

  • 이름
    • 함수의 이름
    • 의미가 있는 이름이어야 함!
  • 매개변수 리스트
  • 리턴 타입
  • 본문
#include <iostream>

void readIput(int a) { //***

	std::cin >> a;
}

int main()
{
	int a;
	readInput(a);

	return 0;
}

함수는 아래와 같은 형식으로 작성해 주면 된다.

여기서 *** 표시 부분을 설명하자면

“컴파일러”는 함수의 호출 이전에 함수의 정의를 알아야 한다.

즉, 함수의 호출 이전에 함수의 정의를 선언해 주어야 한다.

함수 프로토타입

  • 함수의 전체 정의가 아닌 컴파일러가 알아야 할 부분만 미리 알려주는 개념
  • 전방 선언이라고 명칭
  • 프로그램의 초기에 위치
  • 헤더 파일의 활용
  • 규모가 큰 프로젝트 및 라이브러리에서 사용
#include <iostream>

void readInput(int);//중요!

int main()
{
	int a;
	readInput(a);

	return 0;
}

void readIput(int a)
{
	std::cin >> a;
}

분산된 코드와 함수, Complie과 Linking

  • Compile과 Linking, 프로토타입에 대한 깊은 이해
    • 두 개의 cpp파일에 모두 다 iostream이 필요한가?
    • 각 파일이 compile이 정상적으로 이루어지는 이유?
    • 만일 Log.cpp에 Log 함수가 없다면 어떤 오류가 발생할까?

위의 두 소스코드가 한 프로젝트 안에 있다고 가정 해보자.

우리가 처음 얘기했던 과정을 기억하는가?

  1. 컴파일러가 Main.cpp와 Log.cpp를 obj 파일로 만든다.
  2. 링커는 프로젝트 안의 obj파일을 한 곳에 연결 시켜서 하나의 exe 파일을 만들어준다.

pass-by-value

  • 함수에 데이터를 전달할 때는 값으로 전달 됨
    • 데이터의 값이 복사되어 전달
    • 전달된 인수는 함수를 통해 변화되지 않음
      • 실수로 값을 변화하는 것을 방지
      • 값을 변화시키는 것이 필요하거나, 복사 비용이 높을 때를 위한 방법 존재(포인터/참조자)
    • 형식 매개변수 : 함수 선언의 매개변수
    • 실제 매개변수 : 함수 호출 시 실제로 사용되는 인자

Return

  • return문을 통해서 함수의 결과값을 전달
    • void형 반환인 경우 return 문 생략 가능
  • return문을 통해 함수는 즉각적으로 종료

기본 인수

  • 함수의 선언에서 정의한 모든 매개변수가 전달돼야 함

  • 기본 인수를 사용하면 인수가 주어지지 않을 시 기본값, 즉 Default 값을 사용하도록 정의 가능

    • 동일한 값을 자주 사용 할 경우
  • 기본값은 함수 프로토타입 또는 정의부에 선언

    • 프로토타입에 선언하는 것이 기본
    • 둘 다 선언해서는 안됨
  • 여러 개의 기본값을 사용 할 경우 오른쪽부터 선언해야 함

#include <iostream>

double calcCost(double baseCost, double taxRate = 0.06, double shipping = 3.5);//프로토 타입
//double calcCost(double baseCost, double taxRate = 0.06, double shipping);//ERR,오른쪽부터 정의 해야함

int main()
{
	double cost = 0;
	cost = calcCost(100.0, 0.08, 4.5);
	cost = calcCost(100.0, 0.08);
	cost = calcCost(200.0);

	return 0;
}

double calcCost(double baseCost, double taxRate = 0.06, double shipping = 3.5)
{
	return baseCost += (baseCost * taxRate) + shipping;
}

위와 같이 둘 다 디폴트 값을 정의하고 컴파일한다면 오류가 발생한다.

why?

  • 컴파일러가 어떤 디폴트 값을 써야 하는지 알 수 가 없다.
#include <iostream>

double calcCost(double baseCost, double taxRate = 0.06, double shipping = 3.5);//프로토 타입

int main()
{
	double cost = 0;
	cost = calcCost(100.0, 0.08, 4.5);
	cost = calcCost(100.0, 0.08);
	cost = calcCost(200.0);

	return 0;
}

double calcCost(double baseCost, double taxRate, double shipping)
{
	return baseCost += (baseCost * taxRate) + shipping;
}

위와 같이 프로토타입 || 정의부 둘 중 하나에만 디폴트 값을 넣는다.

함수 오버로딩(중요)

서로 다른 매개변수 리스트를 갖는 동일한 이름의 함수 정의

  • 추상화의 한 예
  • 다형성의 한 예
    • 유사한 개념의 함수를 다른 타입에 대해 정의
  • 객체지향 프로그램 구현을 위한 중요한 기법 중 하나
  • 컴파일러는 주어진 인수와 함수들의 매개변수 정의를 기반으로 개별적인 함수를 구분 할 수 있어야 함.
#include <iostream>

using namespace std;

int addNumber(int, int);
double addNumber(double, double);

int main()
{
	cout << addNumber(10, 20) << endl;
	cout << addNumber(10.0, 20.0) << endl;
	return 0;
}

int addNumber(int a, int b) {
	return a + b;
}

double addNumber(double a, double b)
{
	return a + b;
}

같은 이름이지만 다른 함수로 컴파일러가 인식을 하여 오류가 발생하지 않음

int addNumber(int, int);
double addNumber(double, double);
  • 한 줄에 있는 모든 정보들이 해당 함수의 이름이라고 생각하자!

‘반환 타입’만 다를 경우에는?

  • 컴파일러가 구분을 할 수 없다.
profile
개발로그

0개의 댓글