지난번에 C++의 기초적인 문법이나 조건문 반복문에 다해서 다뤘습니다. 이번에는 해당 문법을 좀 더 활용할 수 있는 주제들을 다룹니다.
배열
#include <iostream>
using namespace std;
int main(void) {
int Array1[3] = {0,1,2};
int Array2[3];
Array2[0] = 0;
Array2[1] = 1;
Array2[2] = 2;
cout << "Array1 : " << Array1[0] << ", " << Array1[1] << ", " << Array1[2] << endl;
cout << "Array2 : " << Array2[0] << ", " << Array2[1] << ", " << Array2[2] << endl;
return 0;
}
Array1 : 0, 1, 2
Array2 : 0, 1, 2
배열은 Array[x]
와 같이 선언합니다. x
에 적혀진 수만큼의 변수를 생성하는 것입니다. 한 목표를 위한 혹은 한 데이터가 여러 값을 가질때 주로 사용됩니다. 가령 반복문을 사용할때 배열의 번호만 바꿔주면 모든 숫자를 가져올 수 있으니 예를들어 한 학급의 점수의 평균을 내려면 점수를 각각의 변수로 생성한는 것 보다는 배열로 생성하는게 편리하겠습니다.
const int ARRAY_NUMBER = 7;
int grade[ARRAY_NUMBER] = {87, 84, 54, 15, 63, 94, 54};
int sum = 0;
for(int i=0; i<ARRAY_NUMBER; i++) {
sum += grade[i];
}
cout << sum/ARRAY_NUMBER << endl;
위와같이 말이죠. 추가적으로 Array[x]
에서 배열은 항상 0번부터 시작하여 x-1로 끝납니다. x
개 만큼 생성되었으나 0번부터 시작이므로 배열의 끝이 x-1이 되는 것입니다.
함수
프로그래밍에는 함수라는 것이 있습니다. 다른 언어에서는 메서드라고 불리는 이것은 어떤 목적을 위한 동작을 수행하는 코드의 모임입니다. 간단하게 예기하면 덧셈을 하기위해 함수를 만들었으면 그 함수는 덧셈을 해주고 결과를 돌려줍니다.
#include <iostream>
using namespace std;
int add(int x, int y) {
return x+y;
}
int main(void) {
int a = 5, b = 30;
cout << add(a,b) << endl;
return 0;
}
35
C언어와 C++에서 독특한 점은 함수는 진입점(main)의 위에 선언되어야 합니다. 자바와 파이썬과 같은 다른 언어들은 그렇지 않은데 말이죠. 그 이유는 아래에서 다룹니다만 만일 아래에서 함수를 작성하고 싶다면 다음과 같이 작성해야 합니다.
#include <iostream>
using namespace std;
int add(int x, int y);
int main(void) {
int a = 5, b = 30;
cout << add(a,b) << endl;
return 0;
}
int add(int x, int y) {
return x+y;
}
어떤 함수가 있을지 미리 알려주는 것입니다. C/C++의 코드를 작성하면 우리가 가장 먼저 해줬던 일은 '컴파일'입니다. 컴파일러는 진입점 위에 선언되어 있지 않은 함수를 찾을 수 없습니다. 따라서 위와같이 이런 함수가 있다고 미리 선언을 해주어야 컴파일러가 정상적으로 인식할 수 있습니다.
함수의 모양을 살펴보니 main
도 하나의 함수라는 것을 알 수 있게 되었습니다. main
은 프로그래밍이 시작되는 함수죠. 진입점(main)은 프로그래밍이 정상적으로 끝났는지 판단하기 위해서 int
형을 반환하고 add
함수는 더한 값을 전달하기 위해서 int
형을 반환하고 있습니다. 반환하는게 없는 함수라면 반환에 void
를 적어주면 됩니다.
void printNumber(int x) {
cout << x << endl;
}
함수는 하나의 모듈처럼 생성하는 것이 가장 바람직합니다. 가령 당신이 함수를 만들었다면 그 함수를 다른 사람이 손쉽게 사용 가능하여야 합니다(최대한 오류도 발생하지 않아야 합니다). 한 프로그램에만 사용될 수 있는 함수는 그다지 바람직한 모양은 아닙니다. 그렇다고 함수를 아예 만들지 않고 진입점에만 작성하는 것도 바람직하진 않습니다...
전역 변수
#include <iostream>
using namespace std;
int add() {
return x+y;
}
int main(void) {
int x = 5, y = 30;
cout << add(x,y) << endl;
return 0;
}
ERROR
변수는 자신의 블록({})을 벗어나지 못합니다. 진입점에서 생성된 변수는 add
함수에서 다시 사용할 수 없습니다. 그래서 아까 만들어졌던 함수에서는 add(int x, int y)
와 같이 두개의 변수를 받아서 덧셈을 해주게 됩니다.
#include <iostream>
using namespace std;
int x = 5, y = 30;
int add() {
return x+y;
}
int main(void) {
cout << add(x,y) << endl;
return 0;
}
35
전역변수는 블록에 쌓여있지 않는 변수입니다. 전역변수는 블록을 벗어나는 경우가 없으므로 모든 함수에서 사용할 수 있게됩니다. 위 코드는 하나의 예시일뿐 위와같은 코드 작성방법은 매우 좋지 않은 습관입니다. 아까도 말했든 다른 사람에게 함수를 줬을때 바로 사용할 수 없기 때문입니다!
네임스페이스
using namespace std;
1장에서 위와같은 코드를 사용하여 우리는 std::cout
에서 std
를 생략할 수 있었습니다. cout
은 std
네임스페이스에 포함되어 있고, using namespace
라는 명령어를 사용하면 네임스페이스를 생략할 수 있게 됩니다. 그럼 네임스페이스란 무엇인지 알아보겠습니다.
- 김아람
- 김아람
같은 학교 같은 학년에 2명의 김아람이 존재합니다. 하지만 이들은 다행이도 다른 반이라서 구분할 수 있습니다. 여기서 위 김아람과 아래 김아람을 구분할 수 있게 해주는 것이 네임스페이스 입니다. 1반의 김아람은 3번 2반의 김아람은 5번이라고 가정합시다.
#include <iostream>
using namespace std;
namespace 1ban {
int kimaram = 3;
}
namespace 2ban {
int kimaram = 5;
}
int main(void) {
cout << "1반의 김아람은 몇번입니까? " << 1ban::kimaram << endl;
cout << "2반의 김아람은 몇번입니까? " << 2ban::kimaram << endl;
return 0;
}
1반의 김아람은 몇번입니까? 3
2반의 김아람은 몇번입니까? 5
1반에 담임 선생님이 들어왔습니다. 1반의 담임 선생님이 굳이 2반의 김아람을 굳이 찾을 필요는 없습니다. 그래서 사용하는게 using namepsace
입니다.
#include <iostream>
using namespace std;
namespace 1ban {
int kimaram = 3;
}
namespace 2ban {
int kimaram = 5;
}
int main(void) {
using namespace 1ban;
cout << "아람이가 몇 번이지? " << kimaram << endl;
return 0;
}
아람이가 몇 번이지? 3
간단하죠? 네임스페이스 안에는 변수뿐 아니라 함수도 생성할 수 있습니다.
배운내용 정리!
배운내용을 모두 정리하여 여기 나온 조건을 모두 만족하는 코드를 만들어 보세요. 이 코드는 스스로 만들어 보면서 배운 내용을 자신의 지식으로 만들어 보시길 권장합니다.
문제1.
조건
- 두 변수를 덧셈하는
add
함수 생성 - 두 변수를 뺄셈하는
sub
함수 생성 - 두 변수를 곱셈하는
mul
함수 생성 - 두 변수를 나눗셈하는
div
함수 생성- 단 나눗셈에서 분모가 0인 경우는 ERROR 출력!
a 입력 : 1
b 입력 : 2
1 + 2 = 3
1 - 2 = -1
1 * 2 = 2
1 / 2 = 0.5
이 글이 도움이 되었나요?
Ghost