제 3장. C보다 나은 C++ II
학습 목표 C++의 네임스페이스에 대해 알아본다. C++의 동적 메모리 연산자인 new와 delete에 대해 알아본다. 2011-1학기 프로그래밍언어및실습(C++)
네임스페이스(namespace) 네임스페이스란 식별자가 정의되는 공간을 말한다. 네임스페이스를 이용하면 같은 이름의 식별자를 여러 번 정의하고 구분해서 사용할 수 있다. v 2011-1학기 프로그래밍언어및실습(C++)
네임스페이스의 필요성 (1) 네임스페이스를 사용하지 않는 경우 개발자가 모듈마다 직접 식별자를 구별 하기 위한 접두사를 지정하고 사용 2011-1학기 프로그래밍언어및실습(C++)
네임스페이스의 필요성 (2) 네임스페이스를 사용하는 경우 네임스페이스를 이용해서 식별자를 구조적으로 관리 2011-1학기 프로그래밍언어및실습(C++)
네임스페이스의 정의 네임스페이스를 정의할 때는 namespace 키워드와 함께 네임스페이스 이름을 지정한다. 네임스페이스 이름 namespace UI { int count; void Test() { ... } void ShowMenu() 네임스페이스 이름 변수 정의 함수 정의 v 2011-1학기 프로그래밍언어및실습(C++)
네임스페이스의 사용 네임스페이스 안에 정의된 식별자를 사용할 때는 ‘네임스페이스 이름::식별자’의 형식으로 사용한다. int main() { UI::count = 0; UI::ShowMenu(); UI::Test(); return 0; } 네임스페이스 지정 v 2011-1학기 프로그래밍언어및실습(C++)
using 문 (1) using 네임스페이스이름::식별자; 네임스페이스에 정의된 특정 식별자에 대해서만 네임스페이스 이름을 생략 using UI::count; using UI::Test; count = 10; // UI::count = 10; Test(); // UI::Test(); ShowMenu(); // 컴파일 에러 v 2011-1학기 프로그래밍언어및실습(C++)
using 문 (2) using namespace 네임스페이스 이름; 네임스페이스에 정의된 모든 식별자를 네임스페이스 이름을 생략하고 사용 using NETWORK; count = 10; // NETWORK::count = 10; SendData(); // NETWORK::SendData(); Test(); // NETWORK::Test(); DATA::Test(); // 다른 네임스페이스에 접근할 때는 // 명시적으로 네임스페이스 지정 2011-1학기 프로그래밍언어및실습(C++)
전역 범위 연산자 전역 범위에 정의된 변수나 함수 이름에 접근하려면 네임스페이스 이름 없이 :: 연산자를 지정하고 변수 이름이나 함수 이름을 사용한다. int data = 10; // 전역 변수 void Func() { ... } namespace X { int data = 20; } int main() { using namespace X; int data = 30; // 지역 변수 cout << "data = " << data << "\n"; // 지역 변수 data cout << "data = " << X::data << "\n"; // X::data cout << "data = " << ::data << "\n"; // 전역 변수 data X::Func(); ::Func(); 2011-1학기 프로그래밍언어및실습(C++)
네임스페이스의 범위 네임스페이스와 소스 파일과의 관계는 서로 독립적이다. 하나의 소스 파일에 여러 개의 네임스페이스를 정의할 수 있다. 하나의 네임스페이스를 여러 소스 파일에 걸쳐서 정의할 수 있다. 2011-1학기 프로그래밍언어및실습(C++)
네임스페이스와 분할 컴파일 (1) 네임스페이스의 정의를 여러 소스 파일에서 공유해서 사용하려면 네임스페이스의 정의는 헤더 파일에 넣고, 헤더 파일에서 네임스페이스를 정의할 때 네임스페이스 정의 안쪽에 전역 변수의 extern 선언, 함수의 선언만 넣어준다. 네임스페이스 내에 선언된 전역 변수나 함수는 별도로 소스 파일을 작성하고 소스 파일에서 정의한다. 2011-1학기 프로그래밍언어및실습(C++)
네임스페이스와 분할 컴파일 (2) 2011-1학기 프로그래밍언어및실습(C++)
전역 변수의 extern 선언 전역 변수의 정의는 프로그램 전체에서 단 하나의 소스 파일에 작성하고, 여러 소스 파일에서 전역 변수를 참조해서 사용할 수 있도록 헤더 파일에는 전역 변수의 extern 선언만 넣어준다. 2011-1학기 프로그래밍언어및실습(C++)
같은 헤더 파일을 여러 번 포함하지 않도록 하려면? 2011-1학기 프로그래밍언어및실습(C++)
동적 메모리의 필요성 동적 메모리란 프로그램 실행 중에 메모리의 할당과 해제가 결정되는 메모리를 말한다. 동적 메모리를 사용하면 실행 중에 꼭 필요한 만큼 메모리를 할당 받아서 사용하므로 메모리 낭비가 일어나지 않으며, 미리 정해진 크기가 아니라 원하는 크기만큼 할당 받는 것도 가능하다. 동적 메모리를 사용하면 메모리의 할당과 해제 시점을 전적으로 프로그래머가 제어할 수 있다. 2011-1학기 프로그래밍언어및실습(C++)
정적 메모리 vs. 동적 메모리 2011-1학기 프로그래밍언어및실습(C++)
new 연산자 동적 메모리를 할당하기 위해서는 new 연산자를 사용한다. 할당된 메모리를 초기화하려면 ()를 사용한다. int* p = NULL; p = new int; // 동적 메모리 할당 if( p == NULL ) // 메모리 할당 실패 { // 에러 처리 } p = new int(10); 2011-1학기 프로그래밍언어및실습(C++)
delete 연산자 동적 메모리를 사용이 끝나면 delete 연산자로 해제한다. 2011-1학기 프로그래밍언어및실습(C++)
동적 메모리 사용 예 int main() { int *p = NULL; p = new int(0); // 동적 메모리 할당 및 초기화 if( p == NULL ) cout << "동적 메모리 할당 실패\n"; return 1; } cout << "정수를 입력하세요 : "; cin >> *p; // 동적 메모리 사용 cout << "입력된 정수는 " << p[0] << "\n"; // 동적 메모리 사용 delete p; // 동적 메모리 해제 p = NULL; return 0; v 2011-1학기 프로그래밍언어및실습(C++)
동적 메모리 배열 동적 메모리 배열을 할당할 때는 new[] 연산자를 사용하고 해제할 때는 delete [] 연산자를 사용한다. int num; cin >> num; int *data = new int[num]; for(int i = 0 ; i < num; i++) cin >> data[i]; delete [] data; v 2011-1학기 프로그래밍언어및실습(C++)
new와 delete 사용시 주의사항 (1) 동적으로 할당한 메모리를 자동으로 해제되지 않으므로 반드시 프로그래머가 명시적으로 해제해야 한다. new로 할당한 메모리는 delete로 해제하고, new []로 할당한 메모리는 delete []로 해제한다. char *msg = “Hello World”; char *str = new char[strlen(msg) + 1]; strcpy(str, msg); // 동적 메모리를 해제하지 않으므로 문제 short *tmp = new short[100]; ... // 동적 메모리 배열의 사용 delete tmp; // delete[]로 해제하지 않았으므로 실행 에러 v 2011-1학기 프로그래밍언어및실습(C++)
new와 delete 사용시 주의사항 (2) delete 연산자로 이미 해제된 메모리를 다시 해제해서는 안 된다. 동적 메모리를 해제한 다음 동적 메모리의 시작 주소를 저장하는 포인터 변수를 널 포인터로 만든다. long *arr = new long[10]; ... // 동적 메모리 배열의 사용 delete[] arr; delete[] arr; // 해제된 메모리를 다시 해제하므로 실행 에러 long *arr = new long[10]; ... // 동적 메모리 배열의 사용 delete[] arr; arr = NULL; delete[] arr; // 널 포인터를 해제하면 아무 일도 하지 않음 2011-1학기 프로그래밍언어및실습(C++)
동적 메모리의 활용 (1) 함수 안에서 만들어진 데이터의 리턴 char* NumberToString(int n) { char *p = new char[20]; sprintf(p, "%d", n); return p; } int main() int num; cout << "정수를 입력하세요 : "; cin >> num; char *str = NumberToString(num); cout << "문자열로 변환된 값 : " << str << "\n"; delete [] str; return 0; 2011-1학기 프로그래밍언어및실습(C++)
동적 메모리의 활용 (2) 크기가 늘어나는 배열의 사용 2011-1학기 프로그래밍언어및실습(C++)
정리 네임스페이스는 프로그램에서 식별자가 정의되는 논리적인 공간을 제공한다. 네임스페이스를 이용하면 프로그램 내의 식별자를 관리하기가 쉬워진다. 네임스페이스에 정의된 식별자를 사용하려면 ‘네임스페이스 이름::식별자’의 형식으로 사용한다. using 문을 이용하면 네임스페이스에 정의된 식별자를 사용할 때 네임스페이스 이름을 생략할 수 있다. C++ 프로그램에서 동적 메모리를 사용하려면 new 연산자와 delete 연산자를 이용한다. 동적 메모리를 사용하면 실행 중에 꼭 필요한 만큼 할당하고, 프로그래머가 원하는 동안에만 메모리를 사용할 수 있다. new 연산자를 동적 메모리를 할당하고 delete 연산자는 동적 메모리를 해제한다. 만일 동적 메모리를 할당만 하고 해제하지 않으면 문제가 되므로 주의해서 사용해야 한다. 배열을 동적 메모리에 할당하려면 new[] 연산자를 사용하고 해제할 때는 delete[] 연산자를 사용한다. new와 delete, new[]와 delete[]는 반드시 한 쌍으로 사용해야 한다. 2011-1학기 프로그래밍언어및실습(C++)