C++시작하기 C++/C++ PRIMER PLUS 2011. 10. 18. 23:53

main() 함수내의 기본구조
 //  주석문
 #include  전처리 지시자
 int main()  함수머리
 using namespace  지시지
 { } 범위내에는 함수의 몸체
 cout  메시지를 출력하는 명령문
 return main()함수를 종료 

●main()함수
--------------------------------------------------------------
int main()
{
   명령문들
   return 0
;
}

첫번쨰행에 있는 int main()이라는 부분이 함수머리(function head)
중괄호 { } 로 묶여있는 부분이 몸체(function body)
- 함수머리는 프로그램을 다른 부분과 연결하는 고리역활, 함수몸체는 그함수가 처리하는 동작을 컴퓨터에게 지시.

컴퓨터에게 내리는 지시를 명령문이라 한다. C++에서 모든 명령문은 세미콜론(;)으로 끝나야 한다.
main() 함수의 끝에 있는 명령문은 return 명령문 - 함수를 종료하는 역활을 함.

함수머리는 호출함수와 피호출 함수의 인터페이스를 나타냄. 함수이름의 앞부분을 함수 리턴형이라한다. 이것은 피호출 함수가 호출함수로 다시 넘겨주는 정보의 흐름을 나타냄.

함수이름뒤에 있는 괄호부분의 안의 부분을 전달인자 리스트 또는 매겨변수리스트라고 함.

int main() 함수머리는
main()함수가 자신을 호출한 함수로 부터 어떠한 정보도 전달받지 않지만, 그함수에게 정수값을 리턴한다는것을 나타냄.

main()   //클래식 C의 함수 머리 스타일
- 리턴형을 생략하는 것은 그함수가 INT형이라고 말하는것과 같다

C++ 에서는
int main(void) // 명시적인 스타일
-괄호안에 키워드 void를 사용하는 것은 그함수가 다른함수로부터 어떠한 정보도 전달받지않는다는 것을 명시적으로 밝힘.
  C++에서 괄호안을 비워두는 것은 괄호안에 void 가 있는것과 같다.

void main()

-void리턴형이, 함수가 값을 리턴하지 않는다는것을 뜻함.

main()의 끝에 리턴명령어를 두어야함. 컴파일러가 리턴명령을 만나지 못한채 main()문의 끝에 도달한다면
main()문을 끝내는것과 동일한효과를 낸다.
  
   return 0;

- 암시적 리턴은 다른함수들에는 해당되지않고 오로지 main()함수에만 특별히 허용된다.

이름이 반드시 main()이어야하는 이유

C++프로그램에는 main()함수가 반드시 하나가 있어야함.(대/소문자가 틀리거나 철자가 틀리면안됨)
프로그램에 main()함수가 없으면 완전한 프로그램이 아님. 이러한경우 컴파일러에서 main()함수를 정의하지 않았다고 지적.

-예외도있음. Windows프로그래밍에 동적 링크 라이브러리(DLL)모듈을 작성할때. DLL모듈은 다른 Windows프로그램들이 사용할수 있는 코드 로서, 독립된 프로그램이 아니므로 main()이 필요없다.

일반적인 독립형 프로그램에튼 반드시 main()이 필요함.

■C++ 주석문

더블슬러쉬(//) 뒤에는 항상 주석문.
주석문은 프로그램안에 기록해두는 메모의 일종. 프로그램의 구역을 구분하거나 코드의 어떤부분이 어떤 역활을 하는것인지 표시하는데사용.

주석문에는  //   를 사용하여 한줄 주석을 할수도있고, /*  (주석시작)      */(주석의끝) 과같은 부호를 사용하여 원하는 만큼주석처리가능.

전처리기와 iostream 파일

#include <iostream>
//전처리 지시자
이지시자는 전처리기에 iostream 파일의 내용을 프로그램에 추가하라고 지시. 컴파일이 되기전에 원시코드에 텍스트를 추가하거나 텍스트를 대체 하는것이 전처리기가 수행하는 기본역활.
iostream 의 i는 (input) 입력  o 는 (out)출력 을 나타냄.
프로그램에서 cout과 cin의 기능을 사용할려면 iostream을 정의해야함.

namespace

iostream.h대신에 iostream 을 사용할시에 프로그램이 iostream의 정의를 사용할수 있게 하려면 다음과 같은 이름공간지시자를사용.

  using namespace std;
-using지시자라고함.

using 지시자는 std이름 공간에 들어있는 모든 이름을 사용할수 있게 해준다.

using std::cout;
using std::cin;
using std::endl;

매번 using std:: 를 쓰지 않기 위해선  using namespace std 지시자를 사용하면
std::를 붙이지않고  cin  , cout을 사용가능.

cout을 이용한 C++출력
 
   cout<<"C++의 세계에 오십시오.";

큰따옴표안에 있는것은 출력할 메세지이다. c++에서 큰따옴표안에 들어있는 연속된 문자들을 문자열이라고한다.
<<표시는 명령문이 그문자열을 cout에 전달한다는 것을 뜻함. <<표시가 나타내는 방향이 정보의 흐름을 상징.
cout은 문자열(string),수(number),문자(character)들을 포함한 여러가지 다양한 정보를 출력하는 방법을 알고 있는 미리정의된 객체이다.


조정자 endl

cout<<endl;

endl은 새로운 행이 시작된다는 중요한 개념을 나타내는 특별한 C++표기이다. endl을 출력 스트림에 삽입하면 화면 커서가 다음행의 시작위치로 간다. cout에게 특수한 의미를 가지는 endl과 같은 특별한 표기들을 조정자(manipulator)라고 부른다.
cout과 마찬가지로,endl도 iostream 헤더파일에 정의되어있고, std 이름공간에 속한다.

cout은 문자열을 출력하고 나서 다음행의 시작위치로 커서를 자동으로 넘겨주지 않는다. 그러므로 넘겨주기 위해서는 cout을 사용한다.

■개행문자(\n)
c표기 방법은 \n 은 개행문자(newline character)라고 부르는 하나의 문자를 나타내는것으로 간주된다.
문자열을 출력하고자 할떄, 꼬리표처럼 뒤에 endl을 매다는것보다 문자열의 일부로 개행 문자를 포함시키는 것이 타이핑의 수고가 적기 때문에 사용한다.  개행문자는 "이스케이프 시퀀스"라고 하는 특별한 키스트로크결합의 한예이다.


■토큰과 화이트스페이스
한행의 코드에서 더이상 분리할수 없는 기본요소를 "토큰" 이라고 한다.
일반적으로 하나의 토큰은 빈칸,탭,캐리지 리턴 에 의하여 다음 토큰과 분리된다.  빈칸, 탭, 캐리지 리턴을 집합적으로
화이트스페이스 라고 부른다. 괄호나 콤마와 같은 일부 단일 문자들은 화이트 스페이스로 분리하지 않아도 되는 토큰이다.


■C++원시 코드 스타일

●한행에 하나의 명령문을 사용한다.
●함수를 여는 중괄호 { 와 닫는 중괄호 } 에 각각 한행을 할애한다.
●함수안에 들어갈 명령문들은 중괄호에서 약간 오른쪽으로 들어간 위치에서 시작한다.
●함수 이름과 괄호 사이에는 어떠한 화이트 스페이스도 넣지않는다.

■C++명령문
-변수를 선언하는 선언명령문, 변수에 값을 대입하는 명령문
int carrots;     //정수 변수를 선언
carrots =25;   // 변수에 값을대입

선언명령문과 변수
   int carrots;
 -이명령문은 하나의 정수를 저장할수 있는 한 기억공간을 할당하고, 그위치가 어딘지 말해주는 꼬리표를 붙이는 작업을 수행.
   int :  소수부가 없는 정수형을 말하며 양의 정수와 음의 정수가 있다. int형의 크기는 사용하는 시스템에따라 다르다.

선언명령문은 데이터형을 선언하는것뿐만아니라, 앞으로 프로그램에서 그기억공간에 저장되어있는 값을 carrots라는 이름으로 사용하겠다고 선언하는것이다.
이와같은 carrots를 변수(variable)라고 부른다. 변수라는 이름은 값이 변하기때문에 붙여진 이름이다.

int carrots ;←세미콜론은 명령문의 끝을 나타냄.
↑    ↑
|   변수이름.
저장될데이터형.

선언명령문을 정의 선언 명령문, 또는 정의라고 부른다. 정의가있으면 컴파일러는 그변수를 위해 메모리공간을 할당한다.

C++의 기타 명령문
 ●cin 사용법
cin>>carrots;

입력은 바깥 세상에서 프로그램 안으로 흘러들어가는 문자들의 스트림이다. cin은 iostream 파일에 입력스트림을 나타내는 객체로정의되어있다. 출력을 할때는 cout이 <<연산자를 사용하여 문자들을 출력스트림에 삽입하고 , 입력할때는 cin이 >>연산자를 사용하여 입력스트림에서 문자들을 가져온다.
가져온 정보를 저장할 변수는 >> 연산자의 오른쪽에 적는다.

■함수
  C++함수는 두가지 유형이있다. 리턴값이있는것과 리턴값이 없는 것.
  표준라이브러리에 있는 함수를 사용할수도있고, 사용자가 직접만들어서 사용할수도있다.

리턴값이있는함수.
  -리턴값이있는 함수는 변수에 대입할수있는 하나의 값을 만들어낸다.예를들어 C/C++표준라이브러리에는 어떤 수의 제곱근을
   리턴 하는 sqrt()라는 함수가있다. 제곱근을 구하여 변수 x에대입하여야한다고 가정할때, 다음과 같은 코드가 작성된다.
x=sqrt(6.25);   //값2.5를 리턴하여 x에 대입한다.

   괄호안에있는값은 함수에 전달되는 정보이다

x= sqrt(6.25) --->피함수호출 sqrt()코드 -> x에 값을 리턴한다.

  x= sqrt(6.25);  
  ↑   ↑     ↑_함수에 전달되는인자
 | 함수이름
 함수 리턴값이 x에 대입된다.

-전달인자는 함수에 전달되는 정보이고, 리턴값은 함수가 돌려주는값이다.
다만, 함수를 사용하기전에 C++컴파일러는 그함수가 어떤 종류의 전달인자를 사용할것이며, 어떤 종류의 리턴값을 리턴하는지 미리 알고 있어야한다. 즉, 리턴값이 정수인지, 문자인지,소수부가있는수인지 알고있어야한다는것이다. 이런정보가 없다면 컴파일러는 그리턴값을 어떻게 처리할지 판단할수가없다.
C++은 함수원형 명령문을 사용하여 이런 정보를 컴파일러에게 전달한다.

C++라이브러리에는 sqrt()함수가 소수부가 있는수 를 전달인자로 전달받으며, 전달받은것과 동일한 데이터형의 값을 리턴한다고 정의 되어있다.

소수부가 있는 실수는 double형으로 나타내며, sqrt()의  함수 원형은 다음과 같다.

double sqrt(double); //함수원형
 
앞에있는 double는 sqrt()함수가 double형의 값을 리턴한다는뜻.
뒤에있는 double는 sqrt()함수가 double형의 전달인자를 전달받는다는뜻이다.

sqrt()함수를 사용하려면 함수원형을 제공해야하는데 함수원형을 제공하는 방법은 두가지가있다.
●함수 원형을 원시코드 파일에 직접 입력한다.
●함수원형이 들어있는cmath헤더 파일을 포함시킨다.


■변이함수
어떤함수는 하나이상의 정보를 요구한다. 그러한 함수는 여러개의 전달인자를 콤마(,)로 구부한다. pow()는 전달인자를 2개요구한다.
이함수는 첫번째 전달인자를 두번째 전달인자의 횟수만큼 거듭제곱하여 그결과값을 리턴한다.
  double pow(double, double); //2개의 전달인자를 가진 함수 원형

예를들어 5의 8제곱근을 구한다면
  double pow(5.0,8.0);  //전달인자 리스트가 있는 함수호출.

전달인자를 사용하지않는 함수도있다. C라이브러리에는 전달인자는 사용하지않지만 임의의 정수를 리턴하는 rand()라는 함수가있다.
이함수의 원형은
int rand(void);   //전달인자가 없는 함수원형.
키워드 void는 전달인자를 사용하지않는다는것을 명시적으로 밝히는것이다.

■함수의 모양
 
함수정의의 모양을 다음과 같이 일반화 가능.
type functionname(argumentlist)
{
   statements
}


=====================================================================================================================
※요약
C++프로그램은 함수라고 부르는 하나또는 그이상의 모듈들로 이루어진다.
프로그램은 main()이라는 함수부터 실행이 된다. 그러므로 어떤 프로그램이든지간에 main()함수가 반드시 하나 있어야한다.
함수는 함수머리와 함수몸체로 이루어진다. 함수 머리는 그함수가(리턴값이 있는경우) 어떤 데이터형의 값을 리턴하고, 어떤 종류의 정보를 전달인자로 받는지 나타낸다. 함수몸체는 중괄호{ }로 둘러싸인 C++명령문들로 이루어진다.
C++명령문들의 유형은 다음과같다.

●선언명령문: 함수에 사용되는 변수의 이름과 데이터형을 선언한다.
●대입명령문: 대입연산자(=)를 사용하여 변수에 값을 대입한다.
●메시지명령문: 객체에 메시지를 전달하여 활동을 시작하게한다.
●함수호출: 함수를 동작시킨다. 피호출 함수가 종료되면, 프로그램은 호출 함수의 함수 호출 바로 뒤에 있는 명령문으로 복귀한다.
●함수의 원형: 함수가 기대하는 전달인자의 개수, 전달인자의 데이터형, 함수의 리턴형을 선언한다.
●return 명령문: 피호출 함수가 리턴하는 값을 호출 함수에 전달한다.

클래스는 사용자가 정의하는 데이터 형식이다. 클래스에는 정보를 어떻게 표현할것이며, 그정보를 대상으로 수행할수 있는 동작은 무엇인지가 함께 정의 된다. 데이터형을 사용하여 간단한 변수를 생성하는것과 마찬가지로, 객체는 클래스의 속성을 사용하여 실제로 생성하는 구체물이다.
 C++에서는 입력과 출력을 위해 cin과 cout이라는 두개의 미리정의된 객체를 사용한다. 이들은 각각 istream과 ostream클래스의속성
으로 생성된 객체이다. istream과 ostream 클래스는 iostream파일에 정의되어있다. 이클래스들은 입력과 출력을 연속된 문자들의 스트림이라고 간주한다. 삽입 연산자(<<)는 ostream 클래스에 정의되어있으며, 데이터를 출력 스트림에 삽입한다. 추출 연산자(>>)
는 istream 클래스에 정의되어있으며 스트림으로 부터 정보를 추출한다. cin과 cout은 잘짜여진 영리한 객체이기때문에 프로그램의 문맥에 따라 한 형식을 다른 형식으로 자동변환할수 있다.

C++는 방대한 양의 C라이브러리 함수를 사용할수 있다. 라이브러리 함수를 사용 하려면 함수 원형을 제공하는 헤더파일을 프로그램에포함시켜야한다.

'C++ > C++ PRIMER PLUS' 카테고리의 다른 글

함수 - C++의 프로그래밍 모듈  (0) 2011.11.09
분기 명령문과 논리 연산자.  (0) 2011.11.07
루프와 관계 표현식  (0) 2011.10.27
복합 데이터형  (0) 2011.10.27
데이터처리  (0) 2011.10.20