본문 바로가기
코스웨어/16년 스마트컨트롤러

2016-09-04_조재찬_스터디일지_C++기초 1 (데이터 입출력, 지역변수, 함수 오버로딩, default)

by 알 수 없는 사용자 2016. 9. 3.
728x90
반응형
std::cout과 <<을 이용한 출력
std::endl을 이용한 개행
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>

int main()
{
	int num = 20;
	std::cout << "Hello World!" << std::endl;
	std::cout << "Hello " << "Wolrd!" << std::endl;
	std::cout << num << ' ' << 'A',
		std::cout << ' ' << 3.14 << std::endl;
	
	return 0;
}


Output:

Hello World!

Hello Wolrd!

20 A 3.14


<< 는 연산자이며 이 연산자를 이용해 둘 이상의 출력대상을 연이어 출력가능하다.

std::cout<<'출력대상1'<<'출력대상2'<<'출력대상3';


' '은 공백문자

'A'는 문자

"Hello"는 문자열 Hello



#include <iostream>

c++도 c와 마찬가지로 헤더파일 확장자는 .h이다. 하지만 표준 헤더파일은 확장자가 생략된다.


<iostream.h>는 과거의 표준 입출력 라이브러리 및 헤더파일 의미 (새로운 c++컴파일러는 이것을 점차 지원하지 않는 추세)

<iostream>은 새로운 과거의 표준 입출력 라이브러리 및 헤더파일 의미



std::cin과 >> 연산자를 이용한 데이터 입력받기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>

int main()
{
	double val1;
	std::cout << "첫번째 숫자 입력: ";
	std::cin >> val1;
	
	double val2;
	std::cout << "두번째 숫자 입력: ";
	std::cin >> val2;

	double result = val1 + val2;
	std::cout << "덧셈 결과: " << result << std::endl;
	
	return 0;
}


Output:

첫번째 숫자 입력: 1.6

두번째 숫자 입력: 9.3

덧셈 결과: 10.9


c++에서는 데이터 입력과 출력에 별도의 포맷 지정이 필요없다.

위의 예제에서 double을 int형으로 바꾸면 int형 입출력이 가능하다.



c++의 지역변수 선언

#include <iostream>

int main()
{
	int val1, val2;
	int result = 0;
	std::cout << "두개의 숫자 입력: ";
	std::cin >> val1 >> val2;
	
	if (val1 < val2)
	{
		for (int i = (val1)+1; i < val2; i++)
			result = result + i;
	}
	else
	{
		for (int i = (val2)+1; i < val1; i++)
			result = result + i;
	}

	std::cout << "두 수 사이 정수 합: " << result << std::endl;
	return 0;
}


Output:

1
두개의 숫자 입력: 3     7
두 수 사이 정수 합: 15


c++의 모든 컴파일러에서 함수 내 어디서든 지역변수 선언이 가능 (c언어도 새로운 표준에서는 변수 선언 위치에 제한 없음)


위 예제 8행

std::cin>>'변수1'>>'변수2';


연속적인 데이터 입력이 가능하며 첫번째와 두번째 정수와의 데이터간 인식 경계는 tab, space, enter키 입력과 같은 공백에 의해 나눠짐


위 예제 12행과 17행에서 보듯 초기화 문장 내에서 변수 선언 가능.


int i;

for(i=0; i<10; i++)

과 같은 문장은 다음과 같이 한줄로 선언 가능


for(i=0; i<10; i++)



배열 기반의 문자열 입출력

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>

int main()
{
	char name[100];
	char lang[200];

	std::cout << "이름? ";
	std::cin >> name;

	std::cout << "좋아하는 프로그래밍 언어는? ";
	std::cin >> lang;

	std::cout << "제 이름은 " << name << " 입니다.\n";
	std::cout << "제가 좋아하는 프로그래밍 언어는 " << lang << " 입니다.\n";
	return 0;
}


Output:

이름? 재찬

좋아하는 프로그래밍 언어는? C++

제 이름은 재찬 입니다.

제가 좋아하는 프로그래밍 언어는 C++ 입니다.



함수의 오버로딩(Function Overloading)

c언어는 함수의 이름만 이용해서 호출 대상을 찾는다.


c++은 '함수의 이름', '매개변수'를 동시에 이용해 찾는다.

따라서 c++은 함수의 오버로딩(Function Overloading)이 가능하다.


함수의 이름이 같고 매개변수의 자료형이 다르거나 수가 다를 때, 이를 함수 오버로딩이라고 한다.


하지만 다음과 같은 반환형의 차이는 함수 오버로딩의 조건을 만족시키지 않는다. (컴파일 에러)

void MyFunc(int num)

int MyFunc(int num)



Function Overloading

#include <iostream>

void MyFunc(void)
{
	std::cout<<"MyFunc(void) called"<<std::endl;
}

void MyFunc(char c)
{
	std::cout<<"MyFunc(char c) called"<<std::endl;
}

void MyFunc(int a, int b)
{
	std::cout<<"MyFunc(int a, int b) called"<<std::endl;
}

int main(void)
{
	MyFunc();
	MyFunc('A');
	MyFunc(12, 13);
	return 0;
}


Output:

1
2
3
MyFunc(void) called
MyFunc(char c) called
MyFunc(int a, int b) called



매개변수의 default 값


int MyFunc(int num=5, int num=7)

{

}


함수 호출시 인자를 전달하지 않으면 각각 5, 7이 전달된 것으로 간주

MyFunc();

-> MyFunc(5, 7);


다음 두 함수 호출문도 동일(전달되지 않은 인자만 default value가 됨)

MyFunc(1);

-> MyFunc(1, 2);



1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>

int Adder(int num1 = 1, int num2 = 2)
{
	return num1 + num2;
}

int main(void)
{
	std::cout << Adder() << std::endl;
	std::cout << Adder(5) << std::endl;
	std::cout << Adder(3, 5) << std::endl;
	return 0;
}


Output:

1
2
3
3
7
8



매개변수의 default값은 함수 원형 선언에만 위치시켜야 한다.


컴파일러의 특성상 이는 당연한 것이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>

int Adder(int num1=1, int num2=2);

int main(void)
{
	std::cout<<Adder()<<std::endl;
	std::cout<<Adder(5)<<std::endl;
	std::cout<<Adder(3, 5)<<std::endl;
	return 0;
}

int Adder(int num1, int num2)
{
	return num1+num2;
}


Output:

1
2
3
3
7
8


다음과 같은 선언은 컴파일 에러를 일으킨다.


int Adder(int num1, int num2);


int main()

{

Adder(); // ?? 컴파일 에러

}


int Adder(int num1=10, int num2=20)

{

return num1+num2;

}



부분적 default값 설정


int YourFunc(int num1, int num2=5, int num3=7)


YourFunc(10); // YourFunc(10, 5, 7);

YourFunc(10, 20); // YourFunc(10, 20, 7);


전달되는 인자가 왼쪽에서부터 채워지므로, 기본 값은 오른쪽에서부터 채워져야 한다!



다음과 같이 default 인자가 매개변수에 끝에 없는 선언은 컴파일 에러를 일으킨다. 

int WrongFunc (int num1=10, int num2, int num3)


WrongFunc(5, 7);

// 10, 5, 7이 인자로 전달되길 기대하지만 왼쪽부터 채워지고, 3번째 매개변수는 빈 상태가 됨


int WrongFunc (int num1=10, int num2=20, int num3)


전달되는 인자가 왼쪽에서부터 차례로 채워지므로,

오른쪽의 매개변수는 빈 상태가 된다.


int WrongFunc (int num1=10, int num2, int num3=30)

바로 위와 같이 가운데 default값이 없는 선언도 마찬가지로 컴파일 에러 (인자를 전달할 방법이 없음)



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<iostream>

int BoxVolume(int length, int width=1, int height=1);

int main()
{
	std::cout<<"[3, 3, 3] : "<<BoxVolume(3, 3, 3)<<std::endl;
	std::cout<<"[5, 5, D] : "<<BoxVolume(5, 5)<<std::endl;
	std::cout<<"[7, D, D] : "<<BoxVolume(7)<<std::endl;
//	std::cout<<"[D, D, D] : "<<BoxVolume()<<std::endl;  lengh에는 default값이 지정되지 않았으므로 컴파일 에러
	return 0;
}

int BoxVolume(int length, int width, int height)
{
	return length*width*height;
}

Output:

1
2
3
[3, 3, 3] : 27
[5, 5, D] : 25
[7, D, D] : 7


728x90