Chapter 27. 파일의 분할과 헤더파일의 디자인

Slides:



Advertisements
Similar presentations
프로그램이란 프로그램 생성 과정 프로젝트 생성 프로그램 실행 컴퓨터를 사용하는 이유는 무엇인가 ? – 주어진 문제를 쉽고, 빠르게 해결하기 위해서 사용한다. 컴퓨터를 사용한다는 것은 ? – 컴퓨터에 설치 혹은 저장된 프로그램을 사용하는 것이다. 문제를 해결하기 위한.
Advertisements

1. 2 차원 배열  배열은 동일한 데이터 유형으로 여러 개의 변수를 사용할 경우 같은 이 름으로 지정하여 간편하게 사용할 수 있도록 하는 것으로서 앞에서 1 차원 배열을 공부하였습니다.  2 차원 배열은 바둑판을 생각하면 되며, 1 차원 배열에서 사용하는 첨자를 2.
재료수치해석 HW # 박재혁.
ㅎㅎ C++ 프로그래밍의 첫 걸음 C++로 프로그래밍한다는 것의 의미 세상에서 가장 간단한 C++ 프로그램
ㅎㅎ C++ 프로그래밍의 첫 걸음 C++ 프로그래밍 기초 : 객체지향의 시작 C++로 프로그래밍한다는 것의 의미
2장. 프로그램의 기본 구성. 2장. 프로그램의 기본 구성 2-1"Hello, World!" 들여다 보기 /* Hello.c */ #include int main(void) { printf("Hello, World! \n"); return 0;
컴퓨터프로그래밍 1주차실습자료 Visual Studio 2005 사용법 익히기.
Image & Video processing
최윤정 Java 프로그래밍 클래스 상속 최윤정
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 07. 반복실행을 명령하는 반복문.
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
1장. 이것이 C 언어다.. 1장. 이것이 C 언어다. 프로그래밍 언어 1-1 C 언어의 개론적 이야기 한글, 엑셀, 게임 등의 프로그램을 만들 때 사용하는 언어 ‘컴퓨터 프로그래머’라는 사람들이 제작 C 언어(C++ 포함)를 가장 많이 사용함.
제 9 장 구조체와 공용체.
컴퓨터 프로그래밍 기초 [Final] 기말고사
C 12장. 고급 기능 #include <stdio.h> int main(void) { int num;
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 12. 포인터의 이해.
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 01. 이것이 C언어다.
10장 함수.
윤성우의 열혈 C++ 프로그래밍 Chapter C++에서의 구조체 윤성우 저 열혈강의 C++ 프로그래밍 개정판.
Chapter 25. 메모리 관리와 메모리의 동적 할당
제 3장. C보다 나은 C++ II.
CHAPTER 02 OpenCV 개요 PART 01 영상 처리 개요 및 OpenCV 소개.
1. C++ 시작하기.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 24. 파일 입출력.
Chapter 06. printf 함수와 scanf 함수 정리하기
26. 매크로와 전처리기.
6주차: Functions in C and Others
23장. 구조체와 사용자 정의 자료형 2.
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 03. 변수와 연산자.
11장. 1차원 배열.
10강. JSP 본격적으로 살펴보기-II 스크립트릿, 선언, 표현식 지시자 주석 Lecturer Kim Myoung-Ho
Method & library.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
어서와 C언어는 처음이지 제14장.
27장. 모듈화 프로그래밍.
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
Device Driver 임베디드 시스템 I.
Java의 정석 제 5 장 배 열 Java 정석 남궁성 강의 의
24장. 파일 입출력.
3D 프린팅 프로그래밍 01 – 기본 명령어 강사: 김영준 목원대학교 겸임교수.
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
2장. 변수와 타입.
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
컴퓨터 프로그래밍 기초 [01] Visual Studio 설치 및 사용방법
빌드 성공.
Fucntion 요약.
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
균형이진탐색트리 이진 탐색(binary search)과 이진 탐색 트리(binary search tree)와의 차이점
( Windows Service Application Debugging )
Chapter 16. C++ 형 변환 연산자와 맺는 글
디버깅 관련 옵션 실습해보기 발표 : 2008년 5월 19일 2분반 정 훈 승
OpenCV 설정 2.21 만든이 딩딩.
Chapter 13. 템플릿(Template) 1
Chapter 15. 예외처리(Exception Handling)
05. General Linear List – Homework
컴퓨터 프로그래밍 기초 - 9th : 배열 / 포인터 -
9 브라우저 객체 모델.
Numerical Analysis Programming using NRs
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 23. 구조체와 사용자 정의 자료형2.
실습과제 (변수와 자료형, ) 1. 다음 작업 (가), (나), (다)를 수행하는 프로그램 작성
윤성우의 열혈 C++ 프로그래밍 윤성우 저 열혈강의 C++ 프로그래밍 개정판 Chapter 04. 클래스의 완성.
동적메모리와 연결 리스트 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
윤성우의 열혈 C++ 프로그래밍 윤성우 저 열혈강의 C++ 프로그래밍 개정판 Chapter 05. 복사 생성자.
윤성우의 열혈 C++ 프로그래밍 윤성우 저 열혈강의 C++ 프로그래밍 개정판 Chapter 07. 상속의 이해.
1. 지역변수와 전역변수 2. auto, register 3. static,extern 4. 도움말 사용법
29장. 템플릿과 STL 01_ 템플릿 02_ STL.
7 생성자 함수.
6 객체.
Presentation transcript:

Chapter 27. 파일의 분할과 헤더파일의 디자인 윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 27. 파일의 분할과 헤더파일의 디자인

윤성우의 열혈 C 프로그래밍 Chapter 27-1. 파일의 분할 윤성우 저 열혈강의 C 프로그래밍 개정판

파일을 그냥 나눠도 될까요? 윤성우의 열혈 C 프로그래밍 컴파일러는 파일 단위로 컴파일! 원본 파일 num이 뭐냐? Increment 함수는 어디 있는 거야?

외부 선언 및 정의 사실을 컴파일러에게 알려줘야... 윤성우의 열혈 C 프로그래밍 외부 선언 및 정의 사실을 컴파일러에게 알려줘야... int형 변수 num이 다른 파일에 존재함을 컴파일러에게 알리는 문장 void Increment(void) 함수와 int GetNum(void) 함수가 다른 파일에 정의되었음을 알리는 선언 키워드 extern 이 외부에 존재함을 알리는 용도로 사용된다.

전역변수의 static 선언의 의미 윤성우의 열혈 C 프로그래밍 지역변수로 선언되는 경우 전역변수로 선언되는 경우 함수 내에서만 접근이 가능한, 전역변수와 마찬가지로 한번 메모리 공간에 저장되면 종료 시까지 소멸되지 않고 유지되는 변수의 선언 void SimpleFunc(void) { static int num=0; . . . . } 전역변수로 선언되는 경우 이 경우 int num은 전역변수이다. 단 외부 소스파일에서 접근이 불가능한 전역변수가 된다. 즉, 접근의 범위를 파일로 제한하게 된다. static int num=0; void SimpleFunc(void) { . . . . }

Chapter 27-2. 둘 이상의 파일을 컴파일 하는 방법과 static에 대한 고찰 윤성우의 열혈 C 프로그래밍 Chapter 27-2. 둘 이상의 파일을 컴파일 하는 방법과 static에 대한 고찰 윤성우 저 열혈강의 C 프로그래밍 개정판

파일부터 정리하고 시작합시다. 윤성우의 열혈 C 프로그래밍 #include <stdio.h>의 이 세 개의 파일을 하나의 프로젝트 안에 담아서 하나의 실행파일을 생성해 보는 것이 목적! #include <stdio.h>의 선언은 생략이 되어 있다! 다중파일 컴파일 방법 두 가지 ∙ 첫 번째 방법 → 파일을 먼저 생성해서 코드를 삽입한 다음에 프로젝트에 추가한다. ∙ 두 번째 방법 → 프로젝트에 파일을 추가한 다음에 코드를 삽입한다.

존재하는 파일, 프로젝트에 추가하는 방법 윤성우의 열혈 C 프로그래밍 이미 존재하는 소스파일을 추가하는 방법 1단계 아래에서 보이듯이 다수의 파일이 하나의 프로젝트 안에 포함되었음이 솔루션 탐색기에 나타나야 한다. 추가결과 확인 2단계

프로젝트에 새로운 파일을 추가하는 방법 윤성우의 열혈 C 프로그래밍 새로운 소스파일을 만들어서 추가하는 방법 이는 기존에 해왔던, 소스파일을 새로 생성해서 프로젝트에 추가하는 방법과 100% 동일하다. 그 과정을 재차 진행하면 새로운 소스파일을 생성해서 프로젝트 내에 포함시킬 수 있다.

함수에도 static 선언을 할 수 있습니다. 윤성우의 열혈 C 프로그래밍 static void MinCnt(void) { } 함수의 static 선언은 전역변수의 static 선언과 그 의미가 동일하다. 즉, 외부 소스파일에서의 접근을(호출을) 허용하지 않기 위한 선언이다.

윤성우의 열혈 C 프로그래밍 Chapter 27-3. 헤더파일의 디자인과 활용 윤성우 저 열혈강의 C 프로그래밍 개정판

두 개의 헤더파일과 하나의 소스파일로 이뤄진 프로젝트 윤성우의 열혈 C 프로그래밍 #include 지시자와 헤더파일의 의미 두 개의 헤더파일과 하나의 소스파일로 이뤄진 프로젝트 선행처리 이후의 결과 위의 그림을 통해서 이해할 수 있듯이 #include 지시자는 헤더파일을 단순히 포함시키는 기능을 제공한다. 그리고 기본적으로 헤더파일에는 무엇이든 넣을 수 있다. 그러나 아무것이나 넣어서는 안 된다.

#include <헤더파일 이름> 윤성우의 열혈 C 프로그래밍 헤더파일을 include 하는 두 가지 방법 표준 헤더파일의 포함 #include <헤더파일 이름> 표준헤더 파일을 포함시킬 때 사용하는 방식이다. 표준헤더 파일이 저장된 디렉터리에서 헤더파일을 찾아서 포함을 시킨다. 프로그래머가 정의한 헤더파일의 포함 #include "헤더파일 이름" 프로그래머가 정의한 헤더파일을 포함시킬 때 사용하는 방식이다. 이 방식을 이용하면 이 문장을 포함하는 소스파일이 저장된 디렉터리에서 헤더파일을 찾게 된다.

절대경로의 지정과 그에 따른 단점 윤성우의 열혈 C 프로그래밍 이렇듯 헤더파일의 경로를 명시할 수도 있다. #include "C:\CPower\MyProject\header.h" #include "/CPower/MyProject/header.h" Windows의 절대경로 지정방식. Linux의 절대경로 지정방식 ▶ 절대경로를 지정하면 프로그램의 소스파일과 헤더파일을 임의의 위치로 이동시킬 수 없다(동일 운영체제를 기반으로 하더라도). ▶ 운영체제가 달라지면 디렉터리의 구조가 달라지기 때문에 경로지정에 대한 부분을 전면적으로 수정해야 한다.

상대경로의 지정 방법 윤성우의 열혈 C 프로그래밍 #include "header.h" #include "Release\header0.h" #include "..\CProg\header1.h" #include "..\..\MyHeader\header2.h" 이 문장을 포함하는 소스파일이 저장된 디렉터리 :현재 디렉터리 현재 디렉터리의 서브인 Release 디렉터리 현재 디렉터리의 상위 디렉터리의 서브인 Cporg 디렉터리 현재 디렉터리의 상위 디렉터리의 상위 디렉터리의 서브인 MyHeader 디렉터리 위와 같은 형태로(상대경로의 지정방식을 기반으로) 헤더파일 경로를 명시하면 프로그램의 소스코드가 저장되어 있는 디렉터리를 통째로 이동하는 경우 어디서든 컴파일 및 실행이 가능해진다.

헤더파일에 삽입이 되는 가장 일반적인 선언의 유형 윤성우의 열혈 C 프로그래밍 헤더파일에 무엇을 담으면 좋겠습니까? 헤더파일에 삽입이 되는 가장 일반적인 선언의 유형 extern int num; extern int GetNum(void); // extern 생략 가능 ▶ 총 7개의 소스파일과 헤더파일로 이뤄진 예제를 통해서 다음 두 가지에 대한 정보를 얻자! • 소스파일을 나누는 기준 • 헤더파일을 나누는 기준 및 정의의 형태 ▶ 예제의 소스파일과 헤더파일의 구성 • basicArith.h basicArith.c • areaArith.h areaArith.c • roundArith.h roundArith.c • main.c

헤더파일과 소스파일의 포함관계 윤성우의 열혈 C 프로그래밍 areaArith.h basicArith.h roundArith.h ▶ 예제의 소스파일과 헤더파일의 구성 및 내용 • basicArith.h basicArith.c → 수학과 관련된 기본적인 연산의 함수의 정의 및 선언 • areaArith.h areaArith.c → 넓이계산과 관련된 함수의 정의 및 선언 • roundArith.h roundArith.c → 둘레계산과 관련된 함수의 정의 및 선언 • main.c areaArith.h basicArith.h roundArith.h basicArith.c #include #include areaArith.c roundArith.c #include #include main.c

basicArith.h & basicArith.c 윤성우의 열혈 C 프로그래밍 basicArith.h & basicArith.c basicArith.h : 기본연산 함수의 선언 basicArith.c : 기본연산 함수의 정의 매크로의 정의는 파일단위로 유효하다. 그래서 PI와 같은 상수의 선언은 헤더파일에 정의하고, 이를 필요한 모든 소스파일이 PI가 선언된 헤더파일을 포함하는 형태를 띤다.

areaArith.h & areaArith.c 윤성우의 열혈 C 프로그래밍 areaArith.h & areaArith.c areaArith.h : 넓이계산 함수의 선언 areaArith.c : 넓이계산 함수의 정의

roundArith.h & roundArith.c 윤성우의 열혈 C 프로그래밍 roundArith.h & roundArith.c roundArith.h : 둘레계산 함수의 선언 roundArith.c : 둘레계산 함수의 정의

윤성우의 열혈 C 프로그래밍 main.c 실행결과

구조체의 정의는 어디에? : 문제의 제시 윤성우의 열혈 C 프로그래밍 소스파일 intdiv.c 소스파일 main.c 구조체의 정의도 파일 단위로만 그 선언이 유효하다. 따라서 필요하다면 동일한 구조체의 정의를 소스파일마다 추가시켜 줘야 한다. 소스파일 intdiv.c 소스파일 main.c 같은 구조체 정의를 둘 이상의 소스파일에 직접 추가시킨다는 것 자체가 부담!

구조체의 정의는 어디에? : 해결책의 제시 윤성우의 열혈 C 프로그래밍 헤더파일 stdiv.h 소스파일 main.c 구조체의 정의도 헤더파일에 넣어두고 필요할 때마다 include 하는 것이 일반적이다! #include #include 소스파일 main.c 소스파일 intdiv2.c

헤더파일의 중복삽입 문제 윤성우의 열혈 C 프로그래밍 헤더파일을 직접적으로 또는 간접적으로 두 번 이상 포함하는 것 자체는 문제가 아니다. 그러나 두 번 이상 포함시킨 헤더파일의 내용에 따라서 문제가 될 수 있다. 일반적으로 선언(예로 함수의 선언)은 두 번 이상 포함시켜도 문제되지 않는다. 그러나 정의(예로 구조체 및 함수의 정의)는 두 번 이상 포함시키면 문제가 된다. main.c는 결과적으로 구조체 Div의 정의를 두 번 포함하는 꼴이 된다! 그런데 구조체의 정의는 하나의 소스파일 내에서 중복될 수 없다!

조건부 컴파일을 활용한 중복삽입 문제의 해결 윤성우의 열혈 C 프로그래밍 중복 삽입문제의 해결책 매크로 __STDIV2_H__ 와 #ifndef의 효과가 main.c에서 어떻게 나타나는지 그려보자.! 위와 같은 이유로 모든 헤더파일은 #ifndef~#endif로 감싸는 것이 안전하고 또 일반적이다!

'윤성우의 열혈 C 프로그래밍을 사랑해 주신 여러분께 진심으로 감사드립니다. 강의가 끝났습니다. '윤성우의 열혈 C 프로그래밍을 사랑해 주신 여러분께 진심으로 감사드립니다. Chapter 27이 끝났습니다. 질문 있으신지요?