C++ programming (2)

PM/iOS Developer KimKU·2021년 9월 14일
0
post-thumbnail

2. C ++ 프로그래밍의 기본

2.1) C ++ 프로그램의 기본 요소와 화면 출력

2.1.1) 예제 소스

/***
소스: SimpleC++.cpp
cout와 << 연산자를 이용하여 화면에 출력한다.
***/

#include <iostream> // cout와 << 연산자 포함

//C++ 프로그램은 main() 함수에서부터 실행을 시작한다.

int main()
{
  std::cout << "Hello\n"; //화면에 Hello를 출력하고 다음 줄로 넘어감.
  std::cout << "첫 번째 맛보기입니다.";
  return 0; // 써도 되고 안써도 되고
}

>> Hello
   첫번째 맛보기입니다.

2.1.2) 주석문

주석문(comment)은 프로그램의 실행에 영향을 미치지 않으며 개발자가 프로그램에 대한 설명이나 자유롭게 붙인 특이 사항의 메모이다. C++ 에는 주석문을 만드는 2가지 방법이 있다.

첫째, 여러 줄의 주석문을 만드는 것으로 다음과 같이 '/*'와 '*/'를 이용한다.

/*
	소스: SimpleC++.cpp
        cout와 << 연산자를 이용하여 화면에 출력한다.
*/

C++ 컴파일러는 '/*'와 '*/' 사이의 모든 내용을 주석문으로 처리하여 적법한 C++ 코드가 있어도 무시하고 컴파일하지 않는다.

둘째, 한 줄짜리 주석문으로 다음과 같이 ' // ' 를 이용한다.

std::cout << "Hello\n"; // 화면에 Hello를 출력하고 다음 줄로 넘어감

C++ 컴파일어는 소스에서 ' // ' 를 만나면 그 행의 끝까지 주석문으로 처리하여 무시하고 넘어간다.

2.1.3) main( ) 함수

C 언어와 마찬가지로 main( ) 함수는 C++ 프로그램의 실행 시작점이다. C++ 응용 프로그램에는 반드시 하나의 main( ) 함수가 존재해야 하며, main( ) 함수가 종료하면 프로그램이 종료된다.

  • main( ) 함수의 표준 형식
    C++ 표준에서 정한 main( ) 함수의 리턴 타입은 다음과 같이 int 이다.
int main()
{
   ......
   ......
   return 0;
}

간혹 아래와 같이 void를 리턴 차입으로 선언하기도 하는데, 이것은 C++ 표준이 아니다.

void main()
{
    .....
    .....
}

대부분의 컴파일러는 이를 문제 삼지 않지만 int main( ) 으로 하는 것이 좋다.

  • int main( ) 함수에서 return 문 생략 가능
    한편, int main( ) 함수는 정수를 리턴하는 return 문을 가지고 있어야 한다. 그러나 개발자의 편의를 위해 C++ 표준에서 main( ) 함수에 대해서만 예외적으로 return 문을 생략할 수 있도록 하였다. return 문이 생략되면 main( ) 이 종료할 때 자동으로 다음 문이 실행된다.
return 0;

필자는 main( ) 함수를 간단히 하기 위해 return 0;를 생략하여 쓴다.

2.1.4) #include <iostream>

이 문장은 전처리기(C++ Preprocessor)에 대한 지시문으로서, C++ 소스 파일(SimpleC++.cpp)을 컴파일하기 전에 <iostream> 헤더 파일을 읽어 C++ 소스 파일 안에 삽입할 것을 지시한다. C++ 컴파일러는 처음에 전처리기를 호출하여 #include로 된 라인을 모두 처리하도록 한 후, C++ 소스 파일을 컴파일한다. 후에 #include에 대해 자세히 설명하겠다.

<iostream> 헤더 파일에는 C++ 표준 입출력을 위한 클래스와 객체가 선언되어 있으므로, 키보드 입력이나 화면 출력을 이해서는 꼭 필요하다. 다음 문장은 문자열을 화면에 출력하는 코드로서, cout 객체와 << 연산자 함수가 선언된 <iostream>을 필요로 한다.

  std::cout << "Hello\n"; // 화면에 Hello를 출력하고 다음 줄로 넘어감

2.1.5) 화면 출력

C++ 에서는 다음과 같이 cout<< 연산자를 이용하여 문자열뿐 아니라 다양한 데이터를 화면에 출력한다.

std::cout <<"Hello\n";
std::cout <<"첫 번째 맛보기입니다.\n";
  • cout 객체
    cout은 스크린 ㅈㅇ치와 연결된 C++ 표준 출력 스트림 객체(standard output stream object)이다. cout은 C++ 프로그램에서 출력한 데이터를 자신과 연결된 스크린에 대신 출력해 준다. cout 앞에 붙여진 std::의 접두어는 cout의 이름 공간(namespace)이 std 임을 표시한다. 이름 공간과 std에 대해서는 다음에 설명하겠다.

  • << 연산자
    << 연산자는 스트림 삽입 연산자(stream insertion operator)로 불리며, 오른쪽 피연산자 데이터를 왼쪽 스트임 객체에 삽입한다. 앞의 소스가 실행되면, "Hello"가 화면에 출력되고 뒤이어 ' \n ' 이 출력되어 커서가 화면의 다음 줄로 넘어간다. 그리고 다시 "첫 번째 맛보기입니다."가 출력된다.

    본래 << 연산자는 정수를 왼쪽으로 시프트(shift) 하는 C++ 의 기본 연산자이다. 그러나 출력 스트림에 데이터를 삽입하는 삽입 연산자로 <iostream> 헤더 파일에 재정의(operator overloading)되어 cout과 함께 사용된다.

  • 여러 개의 << 연산자로 한 문장에 여러 데이터 출력
    한 줄에 여러 개의 << 연산자를 사용하여 여러 개의 데이터를 출력할 수 있다. << 연산자는 왼쪽에서 오른쪽으로 순서대로 실행된다. 앞의 두 cout 문장을 다음과 같이 한 문장으로 줄여 쓸 수 있다.

std::cout << "Hello\n" << "첫 번째 맛보기입니다.";
  • cout와 << 연산자 활용
    << 연산자는 문자열뿐 아니라 다음과 같은 C++ 기본 타입 데이터도 출력할 수 있다.
bool, char, short, int, long, float, double

예를 들어 보자.

int n = 3;
char c = '#';
std::cout << c << 5.5 << '-' << n << "hello" << true;

이 코드의 실행 결과는 아래와 같고, true는 정수 1로 출력된다.

#5.5-3hello1

불린 값 ture 나 false를 정수 1이나 0이 아닌 "true", "false"의 문자열로 한다면 나중에 설명하겠다.

<< 연산자는 다음과 같이 피연산자에 식이나 함수 호출 문을 둘 수 있다.

std::cout << "n + 5 =" << n + 5;
std::cout << f(); //함수 f()의 리턴값 출력

2.1.6) 화면에서 다음 줄로 넘어가기

화면의 커서를 다음 줄로 넘기기 위해 ' \ n ' 문자를 이용한다. 다음 코드는 "Hello" 문자열을 출력하고 커서를 다음 줄로 넘긴다.

std::cout << "Hello" << '\n'; // Hello를 화면에 출력하고 다음 줄로 넘어감
std::cout << "Hello" << std::endl;

endl은 C++ 에서 도입한 조작자(manipulator)라고 불리는 함수로서, 후에 자세히 다룬다.

2.1.7) 예제

#include <iostream>
int main()
{
  std::cout << "안녕하세요\n";
}
#include <iostream>
int main()
{
  std::cout << "Hello World!\n" << std::endl;
}
#include <iostream>

double area(int r);
  
double area(int r){
   return 3.14 * r * r;
}
  
int main()
{
  int n = 3;
  char c = '#';
  std::cout << c << 5.5 << '-' << n << "hello" << ture << std::endl;
  std::cout << "n + 5 = " << n + 5 << '\n';
  std::cout << "면적은 " << area(n);
}

2.2) namespace 와 std::

이 절에서는 이름 공간(namespace)과, cout 와 endl 앞에 붙여 사용하는 std:: 접두어의 실체에 대해 알아본다. 이름 공간에 대한 이해를 돕기 위해 한 가지 예들 들어보자.

현재 우리 아파트 단지에는 '마이클' 이라는 사람이 여럿 살고 있다. 그러므로 우리 아파트 단지에서 '마이클'을 찾고자 하면, 몇 동에 사는 '마이클' 인지 구분해야 한다.

위의 그림은 '1동에 사는 마이클' 을 찾기 위해, '1동::마이클' 을 부르는 모양을 보여준다. 여기서 '마이클' 은 이름이며, '1동' 은 이름 공간(namespace) 이다. 이름 공간과 이름을 함께 표기하면 같은 이름을 가진 사람을 쉽게 구분할 수 있다. C++ 에서 말하는 이름 공간도 이와 유사하다.

2.2.1) namespace

일상 생활뿐 아니라 C++ 프로그래밍 과정에서 이름(indentifier)이 충돌하는 경우가 있다. 다음은 이름 충돌이 발생하는 대표적인 경우이다.

  • 프로젝트를 여러 명이 나누어 개발하는 경우
  • 다른 사람이 작성한 소스 코드나 목적 파일을 가져와서 사용하는 경우

프로젝트를 여러 명이 나누어 개발하는 경우, 한 개발자가 작성한 클래스, 상수, 변수, 함수의 이름이 같은 팀의 다른 개발자가 작성한 이름과 동일하다면, 함께 컴파일하거나 링크할 때 오류가 발생하며, 이를 수정하는데 상항한 시간과 노력이 든다. 혹은 오픈 소스를 가져와서 개발자가 작성한 프로그램과 함께 컴파일 하는 경우에도 이름 충돌의 문제가 발생한다.

위의 그림에서 (a)는 kitae, mike 두 사람으로 구성된 팀이 개발한 소스를 합칠 때 발생하는 함수 f( )의 이름이 충돌하는 것을 보여준다. kitae.cpp 를 작성한 kitae 는 함수 m( )이 자신이 작성한 함수 f( )를 호출하도록 하였지만, mike 가 작성한 mike.cpp 에도 함수 f( )가 작성되어 있기 때문에, 이 둘을 합쳐서 컴파일하거나 링크하면 함수 m( )이 어떤 f( )를 호출하는지 알 수 없어 오류가 발생한다.

2003년 C++ 표준에서는 여러 프로젝트나 여러 사람들이 작성한 프로그램에서 변수, 함수, 클래스 드의 이름(identifier) 이 충돌하는 것을 막기 위해, 개발자가 자신만의 고유한 이름 공간을 생성할 수 있도록 namespace 키워드를 도입하였다. 서로 다른 이름 공간 안에 선언된 이름들은 별개의 이름으로 취급되기 때문에, 각 개발자가 자신만의 이름 공간을 사용하면 이름의 충돌을 막을 수 있다.

이름 공간을 생성하는 방법은 다음과 같이 namespace 키워드 뒤에 자신만의 공간 이름읏 짓고 ' { ' 와 ' } ' 로 묶는다.

namespace kitae
{
  ... // kitae 라는 이름 공간 생성
  ... // 이곳에 선언되는 모든 이름은 kitae 이름 공간에 생성된 이름
}

그리고 이름을 이용하기 위해서는 다음과 같이 이름 공간을 함께 사용한다.

이름공간(namespace) :: 이름(identifier)

위의 그림 (b) 는 (a) 에서 발생하는 함수 f( )의 이름 충돌을 해결하기 위해 , kitae, mike 의 이름 공간을 생성한 사례이다. 그림 (b) 의 kitae 이름 공간에서 f( )는 자기 이름 공간에 선언된 f( )를 호출하며, mike::f( ) 는 mike 이름 공간에 선언된 f( )를 호출한다. 이름 공간을 만듦으로써 같은 이름 f( )에 대한 충돌이 해결된다. :: 는 범위 지정 연산자로서 C++ 표준 연산자이다.

2.2.2) sts:: 란?

profile
With passion and honesty

0개의 댓글