기초 cs - 함수 8

킴스코딩클럽·2022년 10월 5일
1

CS기초 시리즈

목록 보기
27/71

매개변수의 기본값(default parameter)


void MyFunction(int x = 1); // 대부분의 기본값은 선언에 주는 것이 대부분이다

void MyFunction(int x) // 매개변수 기본값을 선언과 정의에 중복하면 에러
{
	std::cout << x << std::endl;
}

int main()
{
	MyFunction(10); // 인자를 10으로 주었으므로 10으로 출력
	MyFunction();// 인자를 주지 않았으므로 x=1 출력
}
void MyFunction(int x=1,int y=2, int z=3) 
{
	std::cout << x << y << z << std::endl;
}

int main()
{
	MyFunction(4, 5, 6);
	MyFunction(4, 5);
	MyFunction(4);
	MyFunction();
}
//출력값 : 456 453 423 123

함수의 오버로딩 사용했을 때

void MyFunction(int x=1,int y=2) 
{
	
}

void MyFunction(int x = 1)
{

}
//컴파일은 가능함 하지만 함수를 사용할 때 판단에 따라서 에러가 발생하기도 함
int main()
{
	MyFunction(1); 
   // function ambiguous error 발생 - 어떤 함수를 써야할지 컴파일러가 판단하기 어려움
	MyFunction(1,2); 
   //이 경우 전혀 모호자이 않기 때문에 에러가 나지 않음
}

함수의 오버로딩을 사용하고 싶다면 타입을 같게 만들지 않는게 좋다
하지만 이런 모호성을 피하는게 좋음

함수의 오버로딩과 매개변수의 기본값은 필요하지 않다면 쓰지 말자!!

void MyFunction(int x,int y) 
{
	
}

void MyFunction(float x)
{

}

매개변수를 생략과 관련된 오류

void MyFunction(int x=10,int y) 
{
	// 오류	
}

void MyFunction(int x , int y=10)
{
	//기본 매개변수를 사용하려면 오른쪽부터 채우기
}

int main()
{
	MyFunction(10);
	MyFunction(10, 10);
	// 이 경우 컴파일러는 의도적으로 프로그래머가 y를 생략한건지 실수로 쓰지 않은 것인지 파악하기 어려움
	// 생략을하려면 앞이 아니라 뒤에서 생략만 가능함
}

가변인자(variadic) : 임의의 개수
말줄임표 사용 >>...
(자유도가 높으나 작성하기 어려워 자주 사용하지 않음)

void Dosomething(...)
{
	//작성하기 까다로움
}
int main()
{
	DoSomething(1);
    DoSomething(1.0f);
    DoSomething('a');
}
void DoSomething(int count,...) //앞에 필수변수 한개를 두고 생략하는 패턴을 보임
{
	va_list params;
	va_start(params, count);

	for (int i = 0; i < count; i++)
	{
		std::cout << va_arg(params,int);
	}
	std::cout << std::endl;
	//무엇이 올지 모르니 모두를 정해주어야함
}

int main()
{

}

template 기능이 이것과 비슷함 다음에 공부해보기


사용자에게 시작 문자와 끝 문자를 입력받아서 , 해당 문자들을 출력해보자

컴퓨터적 사고
=> 문제를 작게 분해해서 패턴을 찾고 추상화를 하고 알고리즘을 만듬
=> 패턴을 찾고 추상화 : 함수를 만드는 것과 유사
=> 알고리즘을 작성: 함수의 정의를 만드는 것과 유사

char ReadInput();
void PrintTable(char start, char end); // 시작에서 종료까지 문자가 매개변수로 들어와야함

int main()
{
	//시작 문자를 입력 받는다
	char start;
	start = ReadInput();
	//종료 문자를 입력 받는다
	char end;
	end = ReadInput();

	//아스키 테이블에서 시작 종료까지 출력한다
	PrintTable(start, end);
	//입력받아서 되돌려주는 것은 기능이 같은 >> 함수로 만들 수 있음
}

char ReadInput()
{
	char input;
	std::cin >> input;
	return input;
}

void PrintTable(char start, char end)
{
	for (char i = start; i <= end; ++i)
	{
		std::cout << i << std::endl;
	}
}
profile
공부 기록용

0개의 댓글