SeoulTech 2011-2 nd 프로그래밍입문 (2) Chapter 11. 분리컴파일과 네임스페이스 박종혁교수 (http://www.parkjonghyuk.net) Tel: 970-6702 Email: jhpark1@snut.ac.kr
분리컴파일 프로그램부분 분리된파일에저장 분리되어컴파일 프로그램이실행되기전에상호간에링크됨 클래스정의 사용프로그램에서분리됨 클래스라이브러리생성 많은다른프로그램에재사용됨 사전정의라이브러리와유사 11-2
클래스분리 클래스독립성 클래스정의분리 인터페이스 클래스구현분리 두개의파일에존재 구현부분의변경 해당파일만변경 클래스정의부의변경은필요없음 사용 ( 응용 ) 프로그램의변경도필요없음 11-3
캡슐화리뷰 캡슐화원칙 : ( 프로그래머에게 ) 어떻게사용되는가 와 구현의세부사항 을분리 완전한분리 구현부분을수정해도 다른프로그램에는영향이없음 OOP 기본원칙 11-4
캡슐화규칙 분리규칙 : 1. 모든멤버변수는 private 2. 클래스의기본함수 : public 멤버함수 프렌드또는일반함수 오버로딩된함수 클래스정의와함수원형의그룹화 클래스인터페이스 3. 클래스사용자에게클래스구현을감춤 11-5
클래스분리 인터페이스파일 함수의원형을포함하는클래스의정의부분 사용자는인터페이스파일을보고프로그래밍 분리된컴파일단위 구현파일 멤버함수정의부분 분리된컴파일단위 11-6
클래스헤더파일 클래스인터페이스는헤더파일에위치 *.h 클래스를사용하는프로그램은헤데파일을 include #include "myclass.h" 사용자정의파일 작업디렉토리 라이브러리 includes <iostream> < > 사전정의라이브러리헤더파일지정 라이브러리디렉토리 11-7
클래스구현파일 클래스구현부분은 *.cpp 파일에존재 일반적으로인터페이스파일과구현파일은같은이름을사용 myclass.h, myclass.cpp 클래스의모든멤버함수의정의 구현파일은반듯이클래스헤더파일을 include 해야함 *.cpp 파일에는일반적으로실행코드가포함됨 예 ) 함수정의, main() 함수 11-8
클래스파일 클래스헤더파일은다음의파일에의해 #included 됨 : 구현파일 프로그램파일 응용파일또는드라이버파일이라고도함 파일의구성은시스템의존적 일반적으로 IDE 는 project 나 workspace 를가짐 구현파일과헤더파일의위치는 IDE 에따라다름 11-9
헤더파일의중복컴파일 헤더파일 일반적으로여러번 include 됨 클래스인터페이스는클래스구현파일과프로그램파일에서 include 됨 한번만컴파일되게해야함! 어떠한곳에서먼저컴파일될지장담할수없음 선행처리기 (preprocessor) 사용 컴파일러에게헤더파일을한번만 include 하라고알려줘야함 11-10
#ifndef 사용 헤더파일구조 : #ifndef FNAME_H #define FNAME_H //Contents of header file #endif FNAME 은일관성과가독성을위해일반적으로파일이름을사용 위의구문은헤더파일의중복정의를방지 11-11
기타라이브러리파일 라이브러리에클래스많이있는것은아님 관련함수 원형 헤더파일 정의 구현파일 기타자료형정의 구조체, typedef 헤더파일 상수선언 헤더파일 11-12
네임스페이스 네임스페이스정의 : 네임정의의집합 클래스정의 변수선언 프로그램에서많은클래스와함수를사용 일반적으로중복된이름이존재 네임스페이스는이러한충돌을방지 On/Off 가능 충돌 Off 11-13
using 지시자 using namespace std; std 네임스페이스에있는모든정의의사용가능 사용자가 std 네임스페이스를사용하지않은다면? cout, cin 등을다른의미로사용가능 cout, cin 의재정의필요 나머지도재정의가능 11-14
Namespace std 많은표준라이브러리파일에정의된모든네임을포함 예 : #include <iostream> cin, cout, etc. 프로그램은네임을모름 프로그램에서이러한네임으로접근하기위해서는 std 네임스페이스를명시해야함 11-15
전역네임스페이스 모든코드는특정한네임스페이스에속함 명시하지않으면 전역네임스페이스 using 지시자가필요없음 전역네임스페이스는항상사용가능 묵시적으로 using 지시자사용 11-16
중복된네임 복수의네임스페이스사용 전역과 std 가일반적으로사용 네임정의가양쪽에모두존재할경우 에러 사용시어떠한네임스페이스에위치하는지명시해야함 11-17
네임스페이스명시 두개의네임스페이스 NS1, NS2 두개모두 void myfunction() 를가질경우 { using namespace NS1; myfunction(); } { using namespace NS2; myfunction(); } using 지시자는블록영역을가짐 11-18
네임스페이스생성 네임스페이스그룹화 : namespace Name_Space_Name { Some_Code } 블록내에정의된모든정의는 Name_Space_Name 소속 사용 : using namespace Name_Space_Name; 11-19
네임스페이스생성예제 함수선언 : namespace Space1 { void greeting(); } 함수정의 : namespace Space1 { void greeting() { cout << "Hello from namespace Space1.\n"; } } 11-20
using 선언 사용가능한네임스페이스에서유일한네임을생성 다음의예 : 네임스페이스 NS1, NS2 각각은함수 fun1(), fun2() 을가짐 선언구문 : using Name_Space::One_Name; 각각의네임이어떠한네임스페이스소속인지명시 : using NS1::fun1; using NS2::fun2; 11-21
using 선언과지시자사용 차이점 : using 선언 네임스페이스내에하나의네임만사용 같은네임스페이스내의다른네임을사용할수없음 using 지시자 네임스페이스내의모든네임의사용가능 사용할수있는잠재적인네임들을알림 11-22
이름제한 (Qualifying Name) 네임이어느네임스페이스소속인지명시가능 :: 사용 단한번또는적은사용 NS1::fun1(); 함수 fun() 는네임스페이스 NS1 소속임을명시 매개변수에유용 : int getinput(std::istream inputstream); 매개변수는 std 네임스페이스 istream 코드에 using 지시자와 using 선언을제거할수있음 11-23
네임스페이스명명 유일한문자열포함 예 ) 자신의성 다른네임스페이스와중복을줄여줌 종종같은프로그램을위해복수의프로그래머가네임스페이스를정의 네임스페이스명은구분되어야함 고려하지않으면 에러발생 11-24
디스플레이 11.6 네임스페이스안에서클래스정의하기 ( 헤더파일 ) 4-25
디스플레이 11.7 네임스페이스안에서클래스정의하기 ( 구현파일 ) 4-26
명명되지않은네임스페이스 컴파일단위정의 : 파일단위로 예 ) 구현파일, 헤더파일 모든컴파일단위는명명되지않은네임스페이스의사용가능 같은방식으로사용, 하지만네임이없음 컴파일단위에서만사용가능 명명되지않은네임스페이스의영역은컴파일단위 helping function 등의감춤에사용 11-27
전역네임스페이스 vs. 명명되지않은네임스페이스 같지않음 전역네임스페이스 : 네임스페이스그룹화를하지않음 전역영역 명명되지않은네임스페이스 : 네임스페이스단위를네임없이그룹화 지역영역 11-28
내포된네임스페이스 구문 namespace S1 { namespace S2 { void sample() { } } 네임스페이스를모두명시 : S1::S2::sample(); 11-29
도움함수감추기 helping function: 저수준도구 public 섹션에위치시키지않음 두가지방법 : private 멤버함수 호출객체사용시 명명되지않은네임스페이스에위치! 함수가호출객체를사용하지않을경우 코드를명확하게함 ( 디스플레이 11.2) 11-30
요약 1 클래스정의와구현부의분리가능 분리된파일 분리컴파일단위 네임스페이스는클래스정의및변수선언들과같은이름정의의집합 네임스페이스에서이름을사용하는방법 : Using 지시어 Using 선언 이름제한 (qualifying name) 11-31
요약 2 네임스페이스정의는네임스페이스그룹내에존재 명명되지않은네임스페이스 지역네임정의에사용 컴파일단위의영역을가짐 전역네임스페이스 특정한네임스페이스에그룹화되지않았을경우 전역영역 11-32
Q&A 4-33