C++/C++ 기초 플러스 6판(Book)

[C++] C++ 시작하기

suppresswisely 2025. 3. 1. 17:21

인터페이스 역할을 하는 함수 머리

함수의 정의가 함수 머리 int main()으로부터 시작한다는 사실이다.

함수 이름의 앞부분을 함수 리턴형(function return type)라고 한다.

이것은 피호출 함수가 호출 함수로 다시 넘겨누는 정보의 흐름을 나타낸다.

 

함수 이름 뒤에 있는 괄호 안의 부분을 인자 리스트(argument list) 또는 매개변수 리스트(parameter list)라고 한다.

이러한 일반규칙이 main() 함수에서는 다소 혼동이 된다. 그 이유는 프로그램의 어디에도 main() 함수를 호출하는 부분이 없기 때문이다. 일반적으로 main() 은, 프로그램과 운영 체제를 중개하기 위해 컴파일러가 프로그램에 추가하는 시동코드에 의해 호출된다. 따라서 이 함수 머리는 main() 과 운영 체제 사이의 인터페이스를 나타낸다.

 

많은 기존의 프로그램들이 클래식 C의 함수 머리를 사용하고 있다.

main() //클래식 C의 함수 머리 스타일

int main(void) // 아주 명시적인 스타일

 

괄호 안에 키워드 void를 사용하는 것은 그 함수가 다른 함수로 부터 어떠한 정보도 전달받지 않는다는 것을 명시적으로 밝히는 것이다.

 

void main()

 

void 리턴형이, 논리적으로 타당하다. 그러나 이러한 스타일이 일부 시스템에서는 잘 동작하더라도, C++ 표준은 아니므로 어떤 시스템에서는 동작하지 않는다.

 

main()의 끝에 리턴 구문을 두어야 한다는 성가신 강요에 불평하는 사람들에게 ISO C++ 표준은 한발 양보한다.

컴파일러가 리턴 구문을 만나지 못한채 main()의 끝에 도달한다면 다음과 같은 구문으로 main()을 끝태는 것과 동일한 효과를 낸다.

return 0;

 

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

모든C++ 프로그램은 main() 함수로 부터 실행을 개시한다. 그러나 예외도 있다. 예를 들어, Windows 프로그래밍에서 동적 링크 라이브러리(DLL) 모듈을 작성할 때가 그렇다. 그러나 일반적인 독립된 프로그램에서는 반드시 main() 이 필요하다.

C++ 전처리기와 iostream 파일

C와 마찬가지로 C++도 전처리기(preprocessor)를 사용한다. 전처리기는 컴파일을 하기 전에 소스 파일에 대해 미리 어떤 처리를 수행하는 프로그램이다. 이름이 #로 시작되는 전처리 지시자(directive)이다.

헤더 파일 이름

C++ 헤더 파일의 이름은 C헤더 파일의 이름에서 .h를 뺀 것이다. C 헤더 파일이 C++ 헤더 파일로 진화한 것 들도 있는데, 그러한 헤더 파일들은 . h 확장자를 빼고, 이름 앞부분에 c를 넣는다.

 

해더 파일의 종류 규칙 보기 설명
C++ 구식 스타일 .h로 끝남 iostream.h C++ 프로그램에 사용할 수 있다.
C 구식 스타일 .h로 끝남 math.h C와 C++ 프로그램에 모두 사용할 수 있다.
C++ 최신 스타일 확장자 없음 iostream C++프로그램에 사용할 수 있고, namespace std를 사용한다.
C 변환 스타일 c 접두어, 확장자 없음 cmath C++ 프로그램에 사용할 수 있고, namespace std와 같은 C에 없는 기능은 사용할 수도 있고 못할 수도 있다.

 

이름 공간

using 지시자(directive)라 한다. 이름 공간은 C++의 가장 새로운 기능이다. 설명 예시로 두 업체의 제품을 사용해야 하는데 두 제품 모두 wanda() 라는 함수가 있으면 한 업체의 패키지를 이름 공간(namespace)이라는 하나의 단위로 포장하여 나타낼 수 있다.

연산자 오버로딩

삽입 연산자(<<)가 왼쪽-시프트 비트 연산자와 모양이 같은 것을 눈치챘을 것이다. 이것이 바로 연산자 오버로딩(operator overloading)의 한 예다.

 

연산자 오버로딩 기능을 더욱 확장하여 사용자가 정의하는 데이터형인 클래스에 대해서도 의미를 오버로딩 한다.

C++ 구문

C++는 여러 종류의 구문들을 사용한다. 여기서 일부 구분을 설명하면, 변수를 선언하는 선언 구문(declaration statement)이고 다른 하나는 변수에 값을 대입하는 대입 구문(assignment statement)이다.

선언 구문과 변수

컴퓨터에 어떤 정보를 저장하려면 그 정보의 기억 공간(memory storage)을 차지하는지, 그 정보가 저장될 위치도 알아야 한다.

C++에서 이것을 하는 가장 쉬운 방법은 선언 구문을 사용하는 것이다. 변수라는 이름은 값이 변경될 수 있기 때문에 붙여진 이름이다.

 

사용된 선언 구문을 정의 선언 구문, 또는 간단히 줄여 정의(definition)라고 부른다. 프로그램에 정의 선언 구문이 있으면 컴파일러는 그 변수를 위해 메모리 공간을 대입한다. 그리고 약간 복잡한 것으로, 참조(reference) 선언 구문이라는 것도 있다. 참조 선언 구문은 어딘가 다른 곳에서 이미 정의된 변수를 사용할 수 있도록 허용한다.

대입 구문

등호(=)는 대입 연산자(assignment operator)라고 부른다.

리턴값이 있는 함수

x = sqrt(6.25);

 

sqrt(6.25)라는 표현이 sqrt() 함수를 호출(Call)한다. 이를 함수 호출(function call)이라 하고 이것에 의해 호출되는 sqrt()함수를 피호출 함수(called function)라 한다. 또한, 함수 호출이 들어 있는 함수를 호출 함수(calling function)라고 한다. 함수에 전달 되는 값을 매개변수(argument) 또는 매개변수(parameter)라고 한다.

 

함수 호출에 관련된 문법은 이것이 전부이다. 다만, 함수를 사용하기 전에 C++ 컴파일러는 그 함수가 어떤 종류의 매개변수를 사용할 것이며, 어떤 종류의 리턴값을 리턴하는지 미리 알고 있어야 한다.

 

이러한 정보가 없다면 컴파일러는 그 리턴값을 어떻게 처리할지 판단할 수 없게된다. C++는 함수 원형(function prototype)구문을 사용하여 이러한 정보를 컴파일러에게 전달한다.

 

함수 원형과 함수 정의를 혼동하면 안된다. 함수 원형은 함수의 인터페이스만 알려주는 것이다. 즉, 그 함수에 전달하는 정보와 그 함수가 리턴하는 정보만을 서술한다. 반면에 함수 정의는 그 함수가 수행할 작업을 위한 실제 코드다.

 

C와 C++는 라이브러리 함수들에 대해서 이 두 가지 기능을 따로 분리해 놓았다. 라이브러리 함수들의 컴파일된 코드는 라이브러리 파일에 들어가 있고, 함수 원형들은 해더 파일에 들어있다.

 

변수를 선언할 때 값도 함께 대입할 수 있다. 즉,다음과 같이 할 수 있다.

 

doublid side = sqrt(area);

 

이러한 과정을 초기화(initalization)라 부른다.

 

어떤 프로그래밍 언어에서는 값을 리턴하는 것을 함수(function)라 부르고, 값을 리턴하지 않는 것을 프로시저(procedure) 또는 서브루틴(subroutine)이라고 부른다. 그러나 C++에서는 이 두 가지를 모두 함수(function)라고 부른다.

 

복수 함수 프로그램에 using 지시자 넣기

현재의 우세한 철학은, 접근이 필요한 함수들만 차별적으로 std 이름 공간에 접근 할 수 있도록 제한하는 것이다. 예를 들어 main() 만이 cout을 사용한다면, 다른 함수에는 using namespace std;는 필요가 없다. 그래서 using 지시자가 main() 함수 안에마 있다.