18장. 헤더 파일과 구현 파일 01_ 헤더 파일과 구현 파일의 사용.

Slides:



Advertisements
Similar presentations
YES C 제 1 장 C 언어의 개요 1/34 제 1 장 C 언어의 개요 문봉근. YES C 제 1 장 C 언어의 개요 2/34 제 1 장 C 언어의 개요 1.1 프로그램과 C 언어의 특징 1.2 C 언어의 프로그램 구성 1.3 비주얼 C++ 통합 환경 들어가기.
Advertisements

제 3 장 변수와 자료형.
명품 C++ 프로그래밍 3장. 클래스와 객체.
Power C++ 제6장 포인터와 문자열.
C++ Espresso 제3장 배열과 포인터.
C++ Espresso 제3장 배열과 포인터.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
C++ Espresso 제1장 기초 사항.
C++ Espresso 제2장 제어문과 함수.
1장. 이것이 C 언어다.. 1장. 이것이 C 언어다. 1-1 C 언어의 개론적 이야기 프로그래밍 언어란 무엇인가? 컴파일이란 무엇인가? 사람과 컴파일러가 이해할 수 있는 약속된 형태의 언어 C 언어도 프로그래밍 언어 중 하나이다. 컴파일이란 무엇인가? 프로그래밍.
강좌명 : C++프로그래밍 (C++ Programming)
C 프로그래밍.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
제6장 객체배열과 벡터 객체 배열을 이해한다. 벡터(vector) 클래스를 사용할 수 있다.
명품 C++ 13장 예외 처리와 C 언어와의 링크 지정.
8. 객체와 클래스 (기본).
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
Department of Computer Engineering
C++ Espresso 제9장 다형성.
쉽게 풀어쓴 C언어 Express 제9장 함수와 변수 C Express.
명품 C++ 8장 상속.
C++ Espresso 제6장 생성자와 소멸자.
Game Programming 03 - Tools of trade
-Part3- 제5장 전처리기와 파일 분할 컴파일
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
Department of Computer Engineering
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
명품 C++ 7장 프렌드와 연산자 중복.
14장. 함수 1 01_ 함수의 기본 02_ 인자의 전달.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
C ++ 프로그래밍 시작.
Term Project Team Member
정적 멤버 변수/정적 멤버 함수 - friend 함수/클래스 template
C++ 개요 객체지향 윈도우즈 프로그래밍 한국성서대학교 유일선
Chapter 13 변수 범위.
스택(Stack) 김진수
제 3 장 상수와 변수
17장. 문자열 01_ 문자열 사용의 기본 02_ 문자열의 사용.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
5장 이름, 바인딩, 영역(2) 순천향대학교 컴퓨터공학과 하상호.
adopted from KNK C Programming : A Modern Approach
제5장 생성자와 접근제어 객체 지향 기법을 이해한다. 클래스를 작성할 수 있다. 클래스에서 객체를 생성할 수 있다.
C언어 프로그래밍의 이해 Ch13. 선행처리기와 주석문.
컴퓨터의 기초 제 2강 - 변수와 자료형 , 연산자 2006년 3월 27일.
제 6장 함수 Hello!! C 언어 강성호 김학배 최우영.
타입, 연산자 Chapter 5, 6 Kum Deuk Kyu , Ph. D. Spring 2015
가상함수와 추상 클래스.
Chapter 1 C와는 다른 C++. 최호성.
제2장 제어구조와 배열 if-else 문에 대하여 학습한다. 중첩 if-else 문에 대하여 학습한다.
함수와 변수 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
4. 고급변수 사용 : 포인터와 관련하여 메모리 바라보기
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 09. C언어의 핵심! 함수!
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
처음으로 배우는 C 프로그래밍 제3부 함수 제 6 장 함수 작성.
루프와 카운트 Looping and counting
제8장 포인터와 동적객체 생성 포인터의 개념을 이해한다. 포인터와 관련된 연산을 이해한다.
C89(C++03) 프로그래밍 (Part 2) 7 배열 8 변수 범위 9 포인터 10 유도 자료형.
5. 논리적 자료표현 : 구조체.
Department of Computer Engineering
제 11장. 템플릿과 STL 학기 프로그래밍언어및실습 (C++).
03. 메모리 관리 C++ 프로그램에서 다룰 수 있는 메모리의 종류
C++ Espresso 제13장 입출력과 파일처리.
포인터와 배열 조 병 규 한 국 교 통 대 학 교 SQ Lab..
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
캡슐화 (Encapsulation) 두원공과대학 소프트웨어개발과 이 원 주.
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
실습과제 1번 /* 1. 멤버 변수로 반경 radius를 갖고, 그 값을 모니터에 출력하는
Makefile
printf("Global Korea\n");
Presentation transcript:

18장. 헤더 파일과 구현 파일 01_ 헤더 파일과 구현 파일의 사용

#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)

#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)

#include 지시문(3) 두 가지 버전의 예제를 비교해보자. [18-3]

헤더파일과 구현파일을 나누는 방법 하나의 소스 코드로 이루어진 프로그램을 여러 개의 헤더 파일과 구현 파일로 나눌 때 다음의 규칙대로 하자. 규칙 1. 공유될 함수가 있는 구현 파일의 이름을 따서, 헤더 파일을 만든다. 규칙 2. 이 헤더 파일에 공유될 함수의 원형을 적어준다. 규칙 3. 공유될 함수를 호출할 구현 파일에서는 이 헤더 파일을 포함한다. 규칙 4. 구현 파일에서는 자기 자신에 대한 헤더 파일을 포함한다.

실전 테스트 (1) 다음의 세 구현 파일이 제대로 컴파일 될 수 있도록 고치고, 헤더 파일도 추가하자. // A.cpp void A1() { A2(); } void A2() B1(); B2(); // B.cpp void B1() { } void B2() // Example.cpp int main() { A1(); B1(); return 0; }

실전 테스트 (2) 세 구현 파일의 호출 관계를 그림으로 그려보자. [18-7]

실전 테스트 (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; }

다른 파일에 있는 구조체 사용하기 (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;

다른 파일에 있는 구조체 사용하기 (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; }

다른 파일에 있는 구조체 사용하기 (3) 파일들의 포함 관계를 그림으로 그려보자. [18-10]

다른 파일에 있는 구조체 사용하기 (4) 다른 파일에 있는 구조체를 사용하기 위한 방법을 정리해보자. 규칙 1. 구조체의 이름을 따서 새로운 헤더 파일을 만든다. 규칙 2. 이 헤더 파일에 구조체의 정의 부분을 위치시킨다. 규칙 3. 구조체를 사용하는 구현 파일마다 이 헤더 파일을 포함시킨다.

헤더 파일이 두 번 포함되는 것 막기 전처리기를 사용해서 헤더 파일의 중복 포함을 막는 예 중복 포함을 막는 방법 정리 헤더 파일의 이름을 따서 심볼을 만든다 ( 예: POINT_H ) 헤더 파일의 제일 앞에 이 심볼을 사용해서 #ifndef, #define 명령을 추가한다. 헤더 파일의 제일 끝에 #endif를 추가한다. // Point.h #ifndef POINT_H #define POINT_H struct Point { int x, y; }; #endif

표준 라이브러리의 헤더 파일 표준 라이브러리의 헤더 파일은 <> 를 사용해서 포함한다. 우리가 만든 헤더 파일은 “”를 사용해서 포함한다. <> 를 사용한 경우에는 컴파일러와 함께 표준 라이브러리 설치된 디렉토리에서 헤더 파일을 찾는다. 반면에 “”를 사용한 경우에는 여러 분이 작업 중인 프로젝트가 위치한 디렉토리에서 헤더 파일을 찾는다. #include <iostream> #include <string> #include <cmath> #include “Example1.h”

26장. 접근 범위와 존속 기간 01_ 변수와 함수의 접근 범위와 존속 기간

지역 변수와 전역 변수의 비교(1) 지역 변수와 전역 변수를 정의하고 사용하는 예 int global = 10; // 전역 변수의 정의 void MyFunction(); int main() { int local = 20; // 지역 변수의 정의 global = 100; // 전역 변수에 접근 - 성공 local = 200; // 같은 함수의 지역 변수에 접근 - 성공 MyFunction(); // 함수 호출 return 0; } void MyFunction() local = 200; // 다른 함수의 지역 변수에 접근 – 실패!!

지역 변수와 전역 변수의 비교(2) 지역 변수와 전역 변수의 접근 범위와 존속 기간 [26-1] [표 26-1]

extern 다른 소스 파일에 정의된 전역 변수를 사용하는 예 // Example.cpp // 다른 파일에 있는 전역 변수에 // 접근 하기위한 준비 extern int ga; int main() { // 다른 파일에 있는 전역 변수에 접근 ga = 200; // 성공 return 0; } // A.cpp // 전역 변수 int ga = 100;

블록 안에서 정의한 변수(1) 다른 소스 파일에 정의된 전역 변수를 사용하는 예 int main() { // 블록을 만든다. // 블록 안에서 변수 정의 int var_in_block = 10; // 변수에 접근 var_in_block = 100; // 성공 } var_in_block = 1000; // 실패 return 0;

블록 안에서 정의한 변수(2) 블록 안에서 정의한 변수의 접근 범위와 존속 기간 [26-2]

다른 영역에 정의한 변수의 이름 중복 각각 다른 영역에 같은 이름의 변수를 정의하는 예 실행 결과 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]

for 명령 안에서 정의한 변수 for 명령 안에서 정의한 변수의 존속 기간과 접근 범위는 for 명령의 블록 안쪽으로 제한된다. 그러므로, 다음과 같이 for 명령 바깥쪽에서 같은 이름의 변수를 정의하는 것이 가능하다. (표준) 그러나, VC++ 6.0 같이 오래된 컴파일러는 for 명령 바깥쪽에서도 변수를 접근할 수 있도록 구현되어 있기 때문에, 위와 같은 코드는 컴파일 오류를 발생시킨다. VC++.NET 의 경우에는 기본적으로 두 가지 방식 모두를 허용하며, 컴파일 옵션으로 한 가지 방식을 강요할 수도 있다. for (int i = 0; i < 10; i++) { } int i = 100; // 성공

static으로 정의한 지역 변수 static인 지역 변수는 프로그램이 종료될 때까지 살아있게 된다. 실행 결과 void Sub() { static int n = 0; cout << "n = " << ++n << "\n"; } int main() Sub(); return 0; [26-4]

static으로 정의한 전역 변수 static인 전역 변수는 다른 파일에서 접근 할 수 없게 된다. // Example.cpp // 다른 파일에 있는 전역 변수에 // 접근 하기위한 준비 extern int ga; int main() { // 다른 파일에 있는 전역 변수에 접근 ga = 200; // 실패 !! return 0; } // A.cpp // 정적 전역 변수 static int ga = 100;

register 변수 레지스터 변수는 메모리가 아닌 레지스터에 위치한다. 레지스터 변수는 읽고, 쓰는 속도가 빠르므로 자주 접근되는 변수를 레지스터 변수로 만들면 좋다. 레지스터 변수를 만든다고 해도 상황에 따라서 메모리에 위치할 수도 있다. 요즘의 컴파일러들은 자주 접근되는 변수들을 자동적으로 레지스터 변수로 만들어주기 때문에 일반적으로는 직접 사용할 일이 많지 않다. // 레지스터 변수의 정의 register int i = 0; while ( i < 1000000 ) { // 중간 코드 생략 ++i; }

다른 파일에서 정의한 함수에 접근하기 변수와 마찬가지로 extern 키워드를 사용할 수 있다 // Example.cpp extern void Func(); int main() { Func(); // 성공 return 0; } // A.cpp void Func() { }

static 으로 정의한 함수 static으로 정의한 전역 변수와 마찬가지로 다른 파일에서 접근 할 수 없게 된다. // Example.cpp extern void Func(); int main() { Func(); // 실패!! return 0; } // A.cpp static void Func() { }

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]