Download presentation
Presentation is loading. Please wait.
1
18장. 헤더 파일과 구현 파일 01_ 헤더 파일과 구현 파일의 사용
2
#include 지시문(1) 하나의 소스 파일로 된 예제 소스 코드 #include <iostream>
#include <cmath> using namespace std; struct Point { int x, y; }; double Distance(Point p1, Point p2); int main() // 생략 double dist_a_b = Distance(a, b); } double Distance(Point p1, Point p2)
3
#include 지시문(2) #include 지시문을 사용해서 두 개의 소스 파일로 나누어 보자. // Example.h
struct Point { int x, y; }; double Distance(Point p1, Point p2); // Example.cpp #include <iostream> #include <cmath> using namespace std; #include “Example.h” int main() { // 생략 double dist_a_b = Distance(a, b); } double Distance(Point p1, Point p2)
4
#include 지시문(3) 두 가지 버전의 예제를 비교해보자. [18-3]
5
헤더파일과 구현파일을 나누는 방법 하나의 소스 코드로 이루어진 프로그램을 여러 개의 헤더 파일과 구현 파일로 나눌 때 다음의 규칙대로 하자. 규칙 1. 공유될 함수가 있는 구현 파일의 이름을 따서, 헤더 파일을 만든다. 규칙 2. 이 헤더 파일에 공유될 함수의 원형을 적어준다. 규칙 3. 공유될 함수를 호출할 구현 파일에서는 이 헤더 파일을 포함한다. 규칙 4. 구현 파일에서는 자기 자신에 대한 헤더 파일을 포함한다.
6
실전 테스트 (1) 다음의 세 구현 파일이 제대로 컴파일 될 수 있도록 고치고, 헤더 파일도 추가하자. // A.cpp
void A1() { A2(); } void A2() B1(); B2(); // B.cpp void B1() { } void B2() // Example.cpp int main() { A1(); B1(); return 0; }
7
실전 테스트 (2) 세 구현 파일의 호출 관계를 그림으로 그려보자. [18-7]
8
실전 테스트 (3) 앞에서 배운 규칙대로 한 결과 // A.h void A1(); void A2(); // B.h
void B1(); void B2(); // B.cpp #include “B.h” void B1() { } void B2() // A.cpp #include “A.h” #include “B.h” void A1() { A2(); } void A2() B1(); B2(); // Example.cpp #include “A.h” #include “B.h” int main() { A1(); B1(); return 0; }
9
다른 파일에 있는 구조체 사용하기 (1) 하나의 소스 파일로 된 예제 소스 코드 struct Point { int x, y;
}; double Distance(const Point& pt1, const Point& pt2) // 이 함수의 내용은 생략한다. return 0.0f; } int main() // 두 점을 만든다. Point a = {100, 100}; Point b = {200, 200}; // 함수를 호출한다. double dist; dist = Distance(a, b); return 0;
10
다른 파일에 있는 구조체 사용하기 (2) 여러 개의 파일로 나누어 보자. // Point.h struct Point {
int x, y; }; // Example2.h double Distance(const Point& pt1, const Point& pt2); // Example2.cpp #include “Point.h” #include “Example2.h” double Distance(const Point& pt1, const Point& pt2) { // 이 함수의 내용은 생략한다. return 0.0f; } // Example1.cpp #include “Point.h” #include “Exaple2.h” int main() { // 두 점을 만든다. Point a = {100, 100}; Point b = {200, 200}; // 함수를 호출한다. double dist; dist = Distance(a, b); return 0; }
11
다른 파일에 있는 구조체 사용하기 (3) 파일들의 포함 관계를 그림으로 그려보자. [18-10]
12
다른 파일에 있는 구조체 사용하기 (4) 다른 파일에 있는 구조체를 사용하기 위한 방법을 정리해보자.
규칙 1. 구조체의 이름을 따서 새로운 헤더 파일을 만든다. 규칙 2. 이 헤더 파일에 구조체의 정의 부분을 위치시킨다. 규칙 3. 구조체를 사용하는 구현 파일마다 이 헤더 파일을 포함시킨다.
13
헤더 파일이 두 번 포함되는 것 막기 전처리기를 사용해서 헤더 파일의 중복 포함을 막는 예 중복 포함을 막는 방법 정리
헤더 파일의 이름을 따서 심볼을 만든다 ( 예: POINT_H ) 헤더 파일의 제일 앞에 이 심볼을 사용해서 #ifndef, #define 명령을 추가한다. 헤더 파일의 제일 끝에 #endif를 추가한다. // Point.h #ifndef POINT_H #define POINT_H struct Point { int x, y; }; #endif
14
표준 라이브러리의 헤더 파일 표준 라이브러리의 헤더 파일은 <> 를 사용해서 포함한다.
우리가 만든 헤더 파일은 “”를 사용해서 포함한다. <> 를 사용한 경우에는 컴파일러와 함께 표준 라이브러리 설치된 디렉토리에서 헤더 파일을 찾는다. 반면에 “”를 사용한 경우에는 여러 분이 작업 중인 프로젝트가 위치한 디렉토리에서 헤더 파일을 찾는다. #include <iostream> #include <string> #include <cmath> #include “Example1.h”
15
26장. 접근 범위와 존속 기간 01_ 변수와 함수의 접근 범위와 존속 기간
16
지역 변수와 전역 변수의 비교(1) 지역 변수와 전역 변수를 정의하고 사용하는 예
int global = 10; // 전역 변수의 정의 void MyFunction(); int main() { int local = 20; // 지역 변수의 정의 global = 100; // 전역 변수에 접근 - 성공 local = 200; // 같은 함수의 지역 변수에 접근 - 성공 MyFunction(); // 함수 호출 return 0; } void MyFunction() local = 200; // 다른 함수의 지역 변수에 접근 – 실패!!
17
지역 변수와 전역 변수의 비교(2) 지역 변수와 전역 변수의 접근 범위와 존속 기간 [26-1] [표 26-1]
18
extern 다른 소스 파일에 정의된 전역 변수를 사용하는 예 // Example.cpp // 다른 파일에 있는 전역 변수에
// 접근 하기위한 준비 extern int ga; int main() { // 다른 파일에 있는 전역 변수에 접근 ga = 200; // 성공 return 0; } // A.cpp // 전역 변수 int ga = 100;
19
블록 안에서 정의한 변수(1) 다른 소스 파일에 정의된 전역 변수를 사용하는 예 int main() { // 블록을 만든다.
// 블록 안에서 변수 정의 int var_in_block = 10; // 변수에 접근 var_in_block = 100; // 성공 } var_in_block = 1000; // 실패 return 0;
20
블록 안에서 정의한 변수(2) 블록 안에서 정의한 변수의 접근 범위와 존속 기간 [26-2]
21
다른 영역에 정의한 변수의 이름 중복 각각 다른 영역에 같은 이름의 변수를 정의하는 예 실행 결과 int x = 100;
int main() { cout << "1. x = " << x << "\n"; int x = 200; cout << "2. x = " << x << "\n"; cout << "3. x = " << x << "\n"; int x = 300; cout << "4. x = " << x << "\n"; } cout << "5. x = " << x << "\n"; return 0; [26-3]
22
for 명령 안에서 정의한 변수 for 명령 안에서 정의한 변수의 존속 기간과 접근 범위는 for 명령의 블록 안쪽으로 제한된다. 그러므로, 다음과 같이 for 명령 바깥쪽에서 같은 이름의 변수를 정의하는 것이 가능하다. (표준) 그러나, VC 같이 오래된 컴파일러는 for 명령 바깥쪽에서도 변수를 접근할 수 있도록 구현되어 있기 때문에, 위와 같은 코드는 컴파일 오류를 발생시킨다. VC++.NET 의 경우에는 기본적으로 두 가지 방식 모두를 허용하며, 컴파일 옵션으로 한 가지 방식을 강요할 수도 있다. for (int i = 0; i < 10; i++) { } int i = 100; // 성공
23
static으로 정의한 지역 변수 static인 지역 변수는 프로그램이 종료될 때까지 살아있게 된다. 실행 결과
void Sub() { static int n = 0; cout << "n = " << ++n << "\n"; } int main() Sub(); return 0; [26-4]
24
static으로 정의한 전역 변수 static인 전역 변수는 다른 파일에서 접근 할 수 없게 된다. // Example.cpp
// 다른 파일에 있는 전역 변수에 // 접근 하기위한 준비 extern int ga; int main() { // 다른 파일에 있는 전역 변수에 접근 ga = 200; // 실패 !! return 0; } // A.cpp // 정적 전역 변수 static int ga = 100;
25
register 변수 레지스터 변수는 메모리가 아닌 레지스터에 위치한다.
레지스터 변수는 읽고, 쓰는 속도가 빠르므로 자주 접근되는 변수를 레지스터 변수로 만들면 좋다. 레지스터 변수를 만든다고 해도 상황에 따라서 메모리에 위치할 수도 있다. 요즘의 컴파일러들은 자주 접근되는 변수들을 자동적으로 레지스터 변수로 만들어주기 때문에 일반적으로는 직접 사용할 일이 많지 않다. // 레지스터 변수의 정의 register int i = 0; while ( i < ) { // 중간 코드 생략 ++i; }
26
다른 파일에서 정의한 함수에 접근하기 변수와 마찬가지로 extern 키워드를 사용할 수 있다
// Example.cpp extern void Func(); int main() { Func(); // 성공 return 0; } // A.cpp void Func() { }
27
static 으로 정의한 함수 static으로 정의한 전역 변수와 마찬가지로 다른 파일에서 접근 할 수 없게 된다.
// Example.cpp extern void Func(); int main() { Func(); // 실패!! return 0; } // A.cpp static void Func() { }
28
C 언어로 작성한 함수 사용하기 C언어로 작성한 함수를 사용하는 예
같은 원형의 함수이더라도 C언어와 C++언어에서 해석하는 방식에 차이가 있으므로 extern “C”를 붙여주지 않으면 컴파일 오류가 발생한다. // Example.cpp extern “C” void Func(); int main() { Func(); // 성공 return 0; } // A.c : C언어로 작성한 파일 (확장자가 .c 다) void Func() { } [표 26-2]
Similar presentations