C++ 튜토리얼 2. 함수와 배열 그리고 네임스페이스

WRITTEN BY

baealex

소비적인 일보단 생산적인 일을 추구하며, 좋아하는 일을 잘하고 싶어합니다 :D
Sign in to view email

지난번에 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를 생략할 수 있었습니다. coutstd 네임스페이스에 포함되어 있고, 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

작성된 댓글이 없습니다!

로그인된 사용자만 댓글을 작성할 수 있습니다.

이 작성자가 게시한 다른 글