표준 입출력
// myfirst.cpp -- 메세시를 출력한다.
#include <iostream>
using namespace std; // 선행처리 지시자
int main() // 함수 머리
{ // 함수 몸체의 시작
using namespace std; // 정의 가시화
cout << "C++의 세계로 오십시오."; // 메세지 출력
cout << endl; // 새로운 행 시작
cout << "후회하지 않으실 겁니다!" << endl; // 또 다른 메세지 출력
return 0; // main()을 종료
} // 함수 몸체의 끝
큰 따옴표 안에 들어 있는 부분이 출력할 메세지
C++ 에선 큰따옴표 안에 들어있는 연속된 문자들을 문자열이라고 부른다.
// getinfo.cpp -- 입력과 출력
#include <iostream>
using namespace std;
int main()
{
int carrots;
cout << "당근을 몇 개나 가지고 있니?" << endl;
cin >> carrots; // C++ 입력
cout << "여기 두개 더 있다";
carrots = carrots + 2;
// 다음 라인은 출력을 연결한다.
cout << "이제 당근은 모두" << carrots << "개이다." << endl;
return 0;
}
cin >> carrots;
이 구문의 생김새를 보면 정보가 cin에서 carrots 쪽으로 흐른다는 것을 실직적으로 연상할 수 있다.
cout << "이제 당근은 모두";
<< carrots;
<< "개이다.";
<< endl;
이런식으로도 가능하다.
함수
리턴값이 있는 함수는 변수에 대입할 수 있는 하나의 값을 만들어 낸다. 예를 들어 C/C++ 표준 라이브러리에는 어떤 수의 제곱근을 리턴하는 sqrt()라는 함수가 있다. 가령 6.25의 제곱근을 구하여 변수 x에 대입해야 한다고 가정해보자,
그러면 코드를 다음과 같이 작성하면 된다.
xx = sqrt(6.25); // 값 2.5를 리턴하여 x에 대입한다.
다음은 C++의 변수 이름으로 맞는 것과 틀리는 것의 예.
int poodle; // 맞다
int Poodle ; // 맞다, poodle과 구별된다
int POODLE ; // 맞다, poodle과 더 확실히 구별된다
Int terrier; // 틀리다, Int가 아니라 int가 맞다
int my_stars3; // 맞다
int ―Mystars3; // 맞다, 예약_밑줄문자로시작하므로
int 4ever; // 틀리다,숫자로시작할수없다
int double; // 틀리다, double은 C++ 키워드이므로
int begin; // 맞다, begin은 Pascal 키워드이므로 상관없다
int fools; // 맞다, 예약 - 두 개의 밑줄 문자로 시작하므로
int_the_very_best_variable_i_can_be_version_112; // 맞다
int honky-tonk; // 틀리다.하이픈을사용 할 수 없다
두 개 이상의 단어를 결합하여 변수 이름을 지올 때에는, my_onions와 같이 밑줄
로 단어를 구분하거나, myEyeTooth와 같이 첫 단어를 제외하고 각 단어들의 첫
문자를 대문자로 쓰는 것이 관례이다.
•정수형
정수는 2, 98, -5286, 0과 같이 소수부가 없는 수를 말한다. 그런데 컴퓨터의 메모리
용량에는 한계가 있으므로- 무한하게 많은 정수를 컴퓨터로 모두 나타낼 수는 없다.
따라서 컴퓨터 언어는 정수들의 부분 집합만을 나타낼 수 있다. 표준 Pascal과 같은
컴퓨터 언어는 하나의 정수형만을 제공한다. 그러나 C++는 여러 가지 정수형을 제
공한다 이것은 프로그램이 요구하는 특정 상황에 가장 알맞은 정수형을 골라서 사
용할 수 있도록 하기 위해서이다. 데이터 자체에 데이터형을 맞추려는 C++의 이러
한 철학은 객체 지향 프로그래밍에서 사용-자 정의 데이터형이 매우 중요함을 넌지
시 암시하고있다.
• short, int, long, long long 정수형
컴퓨터의 메모리는 비트(bit)라는 단위로 이루어진다. (이 장의 뒤에 나오는 ‘‘비트
와 바이트’’를 보라.) C++에서 short, int, luo딩은 칭수를 저징 하는 대 사용히는비트 수가 다르댜 따라서 이들은 각각 폭이 다른 세 가지 정수 범위를 나타낼 수 있
다. 예를 들면 short형은 언제나 16비트, int형은 언제나 32비트, 이런 식으로 모
든 C++에서 동일한 데이터형이 동일한 폭을 갖는다면 매우 편리할 것이다. 그러나
세상은 말처럼 그렇게 단순하지가 않다. 모든 컴퓨터를 만족시킬 수 있는 탁월한 선
택은 없댜 그래서 C++는 이 데이터형들의 최소크기만을정하여 보다융통성 있는
표준을 제공한다. 이것은 C로부터 취해진 것이다
// limits . cpp -- 정수 한계값
#include <iostream>
#include <climits> // 구식 C++에는 limits .h를 사용한다
int main ()
using namespace std;
int n_int = INT MAX;
short n_short = SHRT一MAX;
// n_int를 int형의 최대값으로 초기화
// limits . h 파일에 정의된 기호 상수
long n_long = LONG_MAX;
long long n―llong = LLONG―MAX;
II sizeof 연산자는 데이터형이나 변수의 크기를 알아낸다
cout << "int는 " << sizeof (int) << " 바이트이다. ” << endl;
cout << "short는 " << sizeof n_short << " 바이트이다.” << endl;
cout << "long은 " << sizeof n_long << " 바이트이다. ” << endl << endl;
cout << "long long은 " << sizeof n_llong << " 바이트이다. ” << endl;
cout << endl;
cout << "최대값 : " << endl ;
cout << "int: " << n_int << endl;
cout << "short: " << n_short << endl;
cout << "long: " << n_long << endl << endl;
cout << "long long: " << n_llong << endl << endl;
cout << " int의 최소값 = ” << INT_MIN << endl ;
cout << "char의 비트 수 = " << CHAR_BIT << endl;
return O;
}
C++의 데이터 타입
C++에 내장된 기본 정수형 타입: unsigned long, long, unsigned int, int, unsigned short, short, char, unsigned char, signed char, bool 등.
추가된 타입(C++11): unsigned long long, long long.
부동소수점 타입: float, double, long double.
변수의 선언과 초기화
변수를 선언하고 적절한 데이터 타입을 지정하는 방법에 대해 설명.
초기화란 선언과 값을 대입하는 것을 의미한다. 예시로 int braincount = 5; 같은 구문을 사용해 변수를 초기화할 수 있다.
초기화하지 않은 변수는 미확정 상태가 되며, 이는 프로그램에서 예측하지 못한 결과를 초래할 수 있다.
변수의 이름 규칙
변수 이름은 영문자, 숫자, 밑줄 문자만 사용할 수 있으며, 대소문자를 구별한다.
변수 이름은 C++ 키워드가 될 수 없으며, 숫자로 시작할 수 없다.
또한, 두 개의 밑줄로 시작하는 이름은 예약되어 있어 사용하지 않아야 한다.
정수형의 특징
정수형 타입은 signed와 unsigned로 나뉘며, 메모리 크기에 따라 사용할 수 있는 범위가 다르다.
int, short, long과 같은 타입의 크기 및 최소 보장되는 비트 수에 대한 설명이 포함되었다.
메모리의 크기와 비트
메모리의 기본 단위인 비트와 바이트에 대한 설명.
메모리의 비트 수가 클수록 저장할 수 있는 값의 범위가 커지며, signed는 양수와 음수를 나타낼 수 있고, unsigned는 양수만을 나타낼 수 있다.
상수와 climits 헤더 파일
상수를 선언하는 방법 및 climits 파일을 사용하여 정수형의 한계값을 확인하는 방법이 설명되었다.
예를 들어 INT_MAX는 int 타입의 최대값을 나타낸다.
char형과 ASCII 코드
char형 변수는 문자를 저장하기 위해 사용되며, 문자는 숫자로 변환되어 저장된다.
ASCII 코드를 사용하여 문자를 처리하는 방법과 이를 출력하는 방법이 예시로 제공되었다.
이스케이프 시퀀스
특수 문자를 표현하는 이스케이프 시퀀스에 대한 설명이 포함되었다. 예시로 \n은 개행을, \t는 탭을 나타낸다.
C++의 복합 데이터형은 기본 정수형과 부동 소수점형에서 만들어지며, 그 중 클래스는 가장 복잡한 형태이다. 배열은 동일한 데이터형 값을 연속적으로 저장하는 구조이며, 구조체는 서로 다른 데이터형 값을 함께 저장한다. 포인터는 데이터가 저장된 주소를 가리키는 변수이다.
배열 배열은 같은 데이터형 값을 연속적으로 저장하는 복합 데이터형이다. 배열은 특정 크기만큼의 값을 저장할 수 있으며, 각 원소는 인덱스를 통해 개별적으로 접근 가능하다. 예를 들어, int months[12];는 12개의 short형 값을 저장할 수 있는 배열을 생성한다. 배열의 인덱스는 항상 0부터 시작하며, 배열 원소는 메모리에 연속적으로 배치된다.
C 스타일 문자열 문자열은 char 배열에 저장된다. 모든 C 스타일 문자열은 널 문자(\0)로 끝나야 하며, 이는 문자열의 끝을 나타낸다. 예를 들어, char cat[8] = "fat";은 문자열 끝에 자동으로 널 문자를 추가하여 fat을 저장한다.
string 클래스 C++ 표준 라이브러리의 string 클래스는 문자 배열보다 사용하기 쉽고 안전한 문자열 처리를 제공한다. string 객체는 동적으로 크기가 조정되며, 문자열 결합, 추가 등 다양한 연산을 지원한다. cin을 통해 입력받고, cout으로 출력할 수 있다.
배열과 string 객체의 차이 배열은 고정 크기이지만, string 객체는 동적으로 크기를 조절할 수 있다. 예를 들어, cin >> strl;로 입력받으면 strl의 크기가 자동으로 조정된다.
동적 메모리 관리 C++에서 동적 메모리 관리는 new와 delete를 통해 이루어진다. 이들은 프로그램 실행 중에 동적으로 메모리를 할당하고 해제하는 기능을 제공한다.
루프와 관계 표현식 C++는 for 루프, while 루프, do while 루프 등을 제공하여 반복 작업을 처리할 수 있게 한다. 반복문은 동일한 작업을 여러 번 수행하는 상황에서 유용하다. 또한, 관계 표현식은 두 값을 비교하여 참 또는 거짓을 반환하는 것으로, 조건에 따라 프로그램의 흐름을 제어하는 데 사용된다.
for 루프의 구조 for 루프는 반복 작업을 처리하는 가장 일반적인 도구이다. for 루프는 카운터 값을 초기화하고, 조건을 검사한 후, 그 조건이 참이면 루프 몸체를 실행한 뒤 카운터 값을 갱신한다. 예를 들어 for (i = 0; i < 5; i++)는 i가 5보다 작은 동안 루프를 반복하며, 매 반복마다 i의 값을 1씩 증가시킨다. 이를 통해 배열의 원소를 처리하거나 문자열을 출력하는 등의 반복 작업을 쉽게 수행할 수 있다.
복합 구문 C++에서 루프의 몸체는 하나의 구문으로 구성되지만, 중괄호를 사용해 여러 구문을 묶어 복합 구문(블록)을 만들 수 있다. 복합 구문은 한 번에 여러 동작을 처리해야 하는 경우에 유용하며, 하나의 구문처럼 취급된다. 예를 들어 값을 입력받고, 그 값을 처리한 후 출력하는 작업을 하나의 복합 구문으로 묶을 수 있다.
관계 연산자와 조건 검사 관계 연산자는 두 개의 값을 비교하는 데 사용되며, 참일 경우 true, 거짓일 경우 false를 반환한다. 이는 루프나 조건문에서 조건을 검사할 때 자주 사용된다. 주요 관계 연산자로는 == (같다), != (같지 않다), > (크다), < (작다), >= (크거나 같다), <= (작거나 같다)가 있다. 예를 들어, if (x > 5)는 x가 5보다 클 때만 참으로 평가된다. 관계 연산자는 산술 연산자보다 우선순위가 낮아, 괄호를 사용해 연산의 순서를 명확히 할 수 있다.
typedef 기능 C++의 typedef는 기존 데이터형에 새로운 이름을 부여하는 기능을 제공한다. 이를 통해 코드 가독성을 높이고, 복잡한 데이터형을 간결하게 표현할 수 있다. 예를 들어, typedef unsigned int UINT;를 사용하면 unsigned int 대신 UINT라는 이름을 사용할 수 있다.
증가 연산자와 감소 연산자 C++에서 증가 연산자 ++와 감소 연산자 --는 값을 1씩 증가하거나 감소시킨다. 이 연산자는 for 루프의 카운터를 갱신할 때 자주 사용된다. 또한, 연산자를 피연산자 앞에 붙이는 접두어 방식과 뒤에 붙이는 접미어 방식이 있는데, 접두어 방식은 연산 후 값을 반환하고, 접미어 방식은 값을 반환한 후 연산을 수행한다.
중첩 루프와 2차원 배열 C++에서 중첩 루프는 루프 안에 또 다른 루프를 포함하는 형태로, 복잡한 반복 작업을 처리할 때 유용하다. 예를 들어, 2차원 배열을 처리할 때 중첩 루프를 사용하여 각 행과 열을 순차적으로 접근할 수 있다. 이를 통해 다차원 배열의 데이터를 처리하거나 복잡한 알고리즘을 구현할 수 있다.
메모리 관리 C++에서는 new와 delete를 사용해 동적으로 메모리를 할당하고 해제한다. 동적 메모리 관리는 프로그램이 실행되는 동안 메모리를 효율적으로 사용할 수 있도록 도와준다. 예를 들어, 배열의 크기를 런타임에 결정하거나, 필요 없는 메모리를 즉시 해제할 수 있다.
if와 if else 구문 프로그램에서 특정 조건이 참일 때만 코드를 실행하려면 if 구문을 사용한다. if 구문은 영어 문장처럼 조건을 평가한 결과가 참이면 그 뒤의 코드를 실행한다. 예를 들어, 문장에서 빈칸을 세는 프로그램을 작성할 때, 다음과 같은 if 구문을 사용해 빈칸 여부를 검사할 수 있다.
char ch;
int spaces = 0;
cin.get(ch);
while (ch != '.') {
if (ch == ' ') {
++spaces;
}
cin.get(ch);
}
cout << "빈칸의 개수는 " << spaces << "입니다.\n";
이 코드는 입력받은 문장에서 마침표가 나올 때까지 빈칸을 찾아 그 개수를 센다.
if else 구문 if 구문이 단일 조건을 검사하는 것에 비해, if else 구문은 두 가지 상황에 따라 서로 다른 코드를 실행한다. 조건이 참일 때 하나의 코드를, 거짓일 때 다른 코드를 실행하는 방식이다. 예를 들어, 숫자를 입력받아 정답 여부를 판단하는 프로그램은 다음과 같이 작성할 수 있다.
int answer;
cin >> answer;
if (answer == 42) {
cout << "정답입니다!\n";
} else {
cout << "오답입니다. 다시 시도하세요.\n";
}
이 프로그램은 사용자가 42를 입력했을 때 정답 메시지를 출력하고, 다른 숫자를 입력하면 오답 메시지를 출력한다.
논리 연산자 논리 연산자는 두 개 이상의 조건을 결합할 때 사용한다. &&는 두 조건이 모두 참일 때 참을 반환하고, ||는 둘 중 하나만 참이어도 참을 반환한다. !는 조건을 부정하는 연산자이다.
if (age > 17 && age < 65) {
cout << "성인입니다.\n";
}
이 코드는 나이가 18세 이상 65세 미만일 때만 "성인입니다."를 출력한다.
switch 구문 switch 구문은 여러 값 중 하나를 선택해 그에 맞는 코드를 실행하는 제어문이다. 주로 메뉴 선택이나 여러 경우의 값을 처리할 때 유용하다. 예를 들어, 메뉴에서 번호를 입력받아 그에 맞는 메시지를 출력하는 프로그램을 작성할 수 있다
int choice;
cin >> choice;
switch (choice) {
case 1:
cout << "경고음을 출력합니다.\n";
break;
case 2:
cout << "보고서를 출력합니다.\n";
break;
default:
cout << "잘못된 선택입니다.\n";
}
.
이 프로그램은 사용자가 1을 입력하면 경고음을, 2를 입력하면 보고서를 출력하고, 그 외의 값을 입력하면 오류 메시지를 출력한다.
cctype 라이브러리 활용 cctype 라이브러리는 문자가 대문자인지, 숫자인지 등을 확인하는 데 사용되는 유용한 함수들을 제공한다. 예를 들어, isalpha() 함수는 문자가 알파벳인지 확인할 수 있다.
char ch;
cin >> ch;
if (isalpha(ch)) {
cout << "문자는 알파벳입니다.\n";
} else {
cout << "문자는 알파벳이 아닙니다.\n";
}
이 코드는 입력된 문자가 알파벳인지 여부를 검사하여 출력한다.
continue와 break 구문 break 구문은 루프를 중단하고, continue 구문은 현재 반복을 건너뛰고 다음 반복으로 넘어간다. 예를 들어, 문장에서 빈칸의 수를 세면서 마침표가 나오면 루프를 종료하는 프로그램을 작성할 수 있다.
char line[80];
int spaces = 0;
cin.get(line, 80);
for (int i = 0; line[i] != '\0'; i++) {
if (line[i] == '.') {
break; // 마침표가 나오면 루프 종료
}
if (line[i] == ' ') {
spaces++;
} else {
continue; // 빈칸이 아니면 건너뛴다
}
}
cout << "빈칸의 개수는 " << spaces << "입니다.\n";
함수 정의, 원형, 호출 C++에서 함수를 사용하려면 세 가지 단계가 필요하다: 함수 정의 제공, 함수 원형 제공, 함수 호출. 함수 원형은 함수가 호출되기 전에 컴파일러에게 함수의 매개변수 타입과 리턴 타입을 알려준다. 예를 들어, 다음 코드는 기본적인 함수 정의와 원형, 호출을 설명한다.
#include <iostream>
using namespace std;
void simple(); // 함수 원형
int main() {
cout << "main()에서 simple() 함수를 호출합니다: \n";
simple(); // 함수 호출
cout << "main()이 simple() 함수와 종료됩니다.\n";
return 0;
}
void simple() { // 함수 정의
cout << "여기는 simple() 함수입니다.\n";
}
이 코드는 함수가 어떻게 정의되고 호출되는지를 보여준다. simple() 함수는 리턴값이 없으며 void로 선언된다.
값에 의한 전달 C++에서 함수 매개변수는 기본적으로 값에 의해 전달된다. 즉, 함수에 전달된 변수는 복사된 값을 사용하여 함수 내에서 처리된다. 다음은 매개변수로 전달된 값을 처리하는 함수의 예이다.
#include <iostream>
using namespace std;
void cheers(int n); // 함수 원형
int main() {
cheers(5); // 5번 반복
return 0;
}
void cheers(int n) { // 매개변수 n에 따른 반복
for (int i = 0; i < n; i++) {
cout << "Cheers! ";
}
cout << endl;
}
이 예제에서, cheers() 함수는 int n 값을 받아서 n번 "Cheers!"를 출력한다. 이때 n은 값으로 전달되며 함수 내에서 변경되더라도 원본에는 영향을 미치지 않는다.
리턴값이 있는 함수 함수가 값을 리턴하려면 리턴 타입을 명시해야 하며, return 문을 사용하여 값을 반환한다. 다음은 리턴값이 있는 함수의 예이다.
#include <iostream>
using namespace std;
double cube(double x); // 함수 원형
int main() {
double result = cube(3.0); // 함수 호출
cout << "3의 세제곱은 " << result << "입니다.\n";
return 0;
}
double cube(double x) { // 함수 정의
return x * x * x; // x의 세제곱을 반환
}
이 코드는 cube() 함수가 double 값을 리턴하는 것을 보여준다. 함수는 입력된 숫자의 세제곱을 계산하여 호출한 함수에 결과를 반환한다.
배열을 처리하는 함수 배열을 함수에 전달할 때는 배열의 첫 번째 원소의 주소가 전달된다. 배열 자체가 전달되지 않으므로 배열의 크기를 함께 전달하는 것이 좋다. 다음은 배열 원소의 합을 구하는 함수의 예이다.
#include <iostream>
using namespace std;
int sum_arr(int arr[], int n); // 함수 원형
int main() {
int cookies[5] = {1, 2, 3, 4, 5}; // 배열 선언
int sum = sum_arr(cookies, 5); // 배열과 크기를 전달
cout << "과자의 총합은 " << sum << "입니다.\n";
return 0;
}
int sum_arr(int arr[], int n) { // 배열을 처리하는 함수
int total = 0;
for (int i = 0; i < n; i++) {
total += arr[i]; // 배열의 각 원소를 더함
}
return total; // 합계 반환
}
이 함수는 배열과 배열 크기를 인자로 받아 배열의 원소를 모두 더한 값을 반환한다.
const와 포인터 매개변수 배열을 함수에 전달할 때 배열이 수정되지 않도록 보호하려면 const 키워드를 사용한다. 다음은 배열을 수정하지 않고 출력만 하는 함수의 예이다.
#include <iostream>
using namespace std;
void print_arr(const int arr[], int n); // const 배열
int main() {
int data[4] = {10, 20, 30, 40};
print_arr(data, 4); // 배열과 크기 전달
return 0;
}
void print_arr(const int arr[], int n) {
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
cout << endl;
}
const 키워드는 함수 내에서 배열이 수정되지 않도록 보장하며, 이를 통해 데이터의 무결성을 유지할 수 있다.
인라인 함수 인라인 함수는 일반 함수 호출보다 성능을 개선할 목적으로 사용된다. 함수 호출 과정에서 발생하는 오버헤드를 줄이기 위해 컴파일러는 함수 호출을 실제 코드로 대체한다. 이렇게 하면 프로그램이 다른 주소로 점프하지 않아도 되어 실행 속도가 빨라진다. 하지만 인라인 함수는 메모리 사용 측면에서는 불리할 수 있다. 인라인 함수의 예는 다음과 같다:
inline double square(double x) {
return x * x;
}
int main() {
double a = square(5.0); // 25.0을 반환
double b = square(4.5 + 7.5); // 144.0을 반환
return 0;
}
이 코드에서 square 함수는 인라인으로 선언되었으며, 호출 시 코드로 대체된다.
함수 매개변수를 참조로 전달 C++에서는 참조를 통해 함수의 매개변수를 전달할 수 있다. 참조를 사용하면 값의 복사본이 아닌 원본을 수정할 수 있어 효율적이다. 특히, 큰 구조체나 객체를 처리할 때 유용하다. 예시는 다음과 같다:
void swap(int &a, int &b) {
int temp = a;
a = b;
b = temp;
}
int main() {
int x = 10, y = 20;
swap(x, y); // x와 y의 값이 교환된다.
return 0;
}
참조를 통해 변수를 전달함으로써 swap 함수는 x와 y의 값을 직접 교환한다.
함수 오버로딩 함수 오버로딩은 같은 이름의 함수를 매개변수의 종류나 개수에 따라 다르게 정의할 수 있게 한다. 이는 함수 이름을 재사용할 수 있도록 해준다. 예시는 다음과 같다:
int add(int a, int b) {
return a + b;
}
double add(double a, double b) {
return a + b;
}
int main() {
int result1 = add(3, 4); // 정수형 add 호출
double result2 = add(3.0, 4.0); // 실수형 add 호출
return 0;
}
이 예제에서 add 함수는 매개변수의 데이터 타입에 따라 서로 다른 함수가 호출된다.
함수 템플릿 템플릿은 다양한 데이터 타입에 대해 일반화된 함수를 정의할 수 있는 방법이다. 함수 템플릿은 코드를 재사용 가능하게 만들어준다. 다음은 템플릿의 예이다:
template <typename T>
T add(T a, T b) {
return a + b;
}
int main() {
int result1 = add(10, 20); // int형에 대한 호출
double result2 = add(10.5, 20.5); // double형에 대한 호출
return 0;
}
위의 코드에서 add 함수는 int, double 등 다양한 타입으로 동작한다.
템플릿 특수화 특수화된 템플릿은 특정 데이터 타입에 대해 다르게 동작하도록 할 수 있다. 다음은 템플릿 특수화의 예이다:
template <>
const char* add(const char* a, const char* b) {
return strcat(a, b);
}
이 코드는 const char* 타입에 대해 템플릿을 특수화하여 문자열을 연결하는 동작을 구현한다.
분할 컴파일 C++에서는 프로그램을 여러 소스 파일로 분할하여 컴파일하는 것을 권장한다. 이를 통해 대규모 프로그램을 효율적으로 관리할 수 있다. 수정된 파일만 다시 컴파일하고, 이미 컴파일된 파일과 링크하는 방식이다. #include 지시자를 사용해 헤더 파일을 포함하여 공통 구조체나 함수 원형을 여러 파일에서 사용할 수 있다.
// coordin.h
#ifndef COORDIN_H
#define COORDIN_H
struct polar {
double distance;
double angle;
};
struct rect {
double x;
double y;
};
polar rect_to_polar(rect xypos);
void show_polar(polar dapos);
#endif
헤더 파일을 통해 구조체와 함수 원형을 정의하고, 여러 소스 파일에서 공유할 수 있다.
메모리 모델과 이름공간 C++에서 데이터는 자동, 정적, 쓰레드, 동적 기억 존속 시간을 가진다. new 연산자를 통해 동적으로 메모리를 할당할 수 있으며, delete로 해제한다. 이름공간을 사용하면 데이터 접근을 제어할 수 있다.
int* p = new int[5]; // 동적 메모리 할당
delete[] p; // 메모리 해제
위 코드는 new 연산자를 통해 정수 배열을 동적으로 할당하고, delete[]로 해제하는 방법을 보여준다.
기억 존속 시간과 사용 범위 기억 존속 시간은 변수가 메모리에 존재하는 시간을 의미한다. 자동 변수는 함수 호출 시 생성되고, 종료 시 소멸된다. 정적 변수는 프로그램 실행 내내 메모리에 남아 있다.
void func() {
static int count = 0; // 정적 변수, 함수 호출 간에도 값이 유지됨
count++;
}
정적 변수 count는 함수 호출 간에도 값이 유지되며, 자동 변수가 아닌 정적 기억 존속 시간을 가진다.
이름공간(namespace) 이름공간은 변수와 함수를 특정 영역에 묶어 충돌을 방지하는 역할을 한다. 예를 들어, 동일한 이름의 변수가 두 곳에서 충돌하지 않도록 구분할 수 있다.
namespace first {
int var = 1;
}
namespace second {
int var = 2;
}
int main() {
std::cout << first::var << std::endl; // 1 출력
std::cout << second::var << std::endl; // 2 출력
}
이름공간을 사용하여 두 var 변수가 서로 다른 값을 가질 수 있도록 구분하였다.
'개발 일지 > C++' 카테고리의 다른 글
멤버 함수란? (0) | 2024.09.25 |
---|---|
C와 C++의 차이점 (0) | 2024.09.22 |