• 검색 결과가 없습니다.

목포해양대 해양전자통신공학부 제 3 장 . C 보다 나은 C++ II

N/A
N/A
Protected

Academic year: 2023

Share "목포해양대 해양전자통신공학부 제 3 장 . C 보다 나은 C++ II"

Copied!
27
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

목포해양대 해양전자통신공학부

제 3장. C보다 나은 C++ II

(2)

목포해양대 해양전자통신공학부 목포해양대 해양전자통신공학부

학습 목표

 C++의 네임스페이스에 대해 알아본다.

 C++의 동적 메모리 연산자인 new와

delete에 대해 알아본다.

(3)

목포해양대 해양전자통신공학부 목포해양대 해양전자통신공학부

네임스페이스(namespace)

 네임스페이스란 식별자가 정의되는 공간을 말한다.

 네임스페이스를 이용하면 같은 이름의

식별자를 여러 번 정의하고 구분해서 사용할

수 있다.

(4)

목포해양대 해양전자통신공학부 목포해양대 해양전자통신공학부

네임스페이스의 필요성 (1)

 네임스페이스를 사용하지 않는 경우

개발자가 모듈마다 직접 식별자를 구별 하기 위한 접두사를 지정하고 사용

(5)

목포해양대 해양전자통신공학부 목포해양대 해양전자통신공학부

네임스페이스의 필요성 (2)

 네임스페이스를 사용하는 경우

네임스페이스를 이용해서 식별자를 구조적으로 관리

(6)

목포해양대 해양전자통신공학부 목포해양대 해양전자통신공학부

네임스페이스의 정의

 네임스페이스를 정의할 때는 namespace

키워드와 함께 네임스페이스 이름을 지정한다.

namespace UI { int count;

void Test() {

...

}

void ShowMenu() {

...

} }

네임스페이스 이름 변수 정의

함수 정의

(7)

목포해양대 해양전자통신공학부 목포해양대 해양전자통신공학부

네임스페이스의 사용

 네임스페이스 안에 정의된 식별자를 사용할 때는 ‘네임스페이스 이름::식별자’의 형식으로 사용한다.

int main() {

UI::count = 0;

UI::ShowMenu();

UI::Test();

return 0;

}

네임스페이스 지정

(8)

목포해양대 해양전자통신공학부 목포해양대 해양전자통신공학부

using 문 (1)

using 네임스페이스이름::식별자;

네임스페이스에 정의된 특정 식별자에 대해서만 네임스페이스 이름을 생략

using UI::count;

using UI::Test;

count = 10; // UI::count = 10;

Test(); // UI::Test();

ShowMenu(); // 컴파일 에러

(9)

목포해양대 해양전자통신공학부 목포해양대 해양전자통신공학부

using 문 (2)

using namespace 네임스페이스 이름;

네임스페이스에 정의된 모든 식별자를 네임스페이스 이름을 생략하고 사용

using NETWORK;

count = 10; // NETWORK::count = 10;

SendData(); // NETWORK::SendData();

Test(); // NETWORK::Test();

DATA::Test(); // 다른 네임스페이스에 접근할 때는 // 명시적으로 네임스페이스 지정

(10)

목포해양대 해양전자통신공학부 목포해양대 해양전자통신공학부

전역 범위 연산자

젂역 범위에 정의된 변수나 함수 이름에 접근하려면

네임스페이스 이름 없이 :: 연산자를 지정하고 변수 이름이나 함수 이름을 사용한다.

int data = 10; // 전역 변수 void Func() { ... }

namespace X { int data = 20;

void Func() { ... } }

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();

}

(11)

목포해양대 해양전자통신공학부

네임스페이스의 범위

 네임스페이스와 소스 파일과의 관계는 서로 독립적이다.

 하나의 소스 파일에 여러 개의

네임스페이스를 정의할 있다.

 하나의

네임스페이스를 여러 소스 파일에 걸쳐서 정의할 수 있다.

(12)

목포해양대 해양전자통신공학부 목포해양대 해양전자통신공학부

네임스페이스와 분할 컴파일 (1)

 네임스페이스의 정의를 여러 소스 파일에서 공유해서 사용하려면

 네임스페이스의 정의는 헤더 파일에 넣고, 헤더 파일에서 네임스페이스를 정의할 때

네임스페이스 정의 안쪽에 젂역 변수의 extern 선언, 함수의 선언만 넣어준다.

 네임스페이스 내에 선언된 젂역 변수나 함수는

별도로 소스 파일을 작성하고 소스 파일에서

정의한다.

(13)

목포해양대 해양전자통신공학부 목포해양대 해양전자통신공학부

네임스페이스와 분할 컴파일 (2)

(14)

목포해양대 해양전자통신공학부 목포해양대 해양전자통신공학부

전역 변수의 extern 선언

젂역 변수의 정의는 프로그램 젂체에서 단 하나의 소스 파일에 작성하고, 여러 소스 파일에서 젂역 변수를 참조해서 사용할 수 있도록 헤더 파일에는 젂역 변수의 extern 선언만 넣어준다.

(15)

목포해양대 해양전자통신공학부 목포해양대 해양전자통신공학부

같은 헤더 파일을 여러 번 포함하지 않도록

하려면?

(16)

목포해양대 해양전자통신공학부 목포해양대 해양전자통신공학부

동적 메모리의 필요성

 동적 메모리란 프로그램 실행 중에 메모리의 할당과 해제가 결정되는 메모리를 말한다.

 동적 메모리를 사용하면 실행 중에 꼭 필요한 만큼 메모리를 할당 받아서 사용하므로 메모리 낭비가 일어나지 않으며, 미리 정해진 크기가

아니라 원하는 크기만큼 할당 받는 것도 가능하다.

 동적 메모리를 사용하면 메모리의 할당과 해제

시점을 젂적으로 프로그래머가 제어할 수 있다.

(17)

목포해양대 해양전자통신공학부 목포해양대 해양전자통신공학부

정적 메모리 vs. 동적 메모리

특징 정적 메모리 동적 메모리

메모리 할당 컴파일 시간에 이루어 짐 실행 시간에 이루어짐 new 연산자 이용

메모리 해제 자동으로 해제 명시적으로 해제해야 함 delete 연산자 이용 사용 범위 지역변수는 선언된 블록 내

전역변수는 프로그램 전체

프로그래머가 원하는 동안만큼 사용

메모리 관리 책임 컴파일러의 책임 프로그래머의 책임

(18)

목포해양대 해양전자통신공학부

new 연산자

동적 메모리를 할당하기 위해서는 new 연산자를 사용한다.

new 연산자는 메모리 할당 실패시 널 포인터를 리턴한다.

할당된 메모리를 초기화하려면 ()를 사용한다.

int* p = NULL;

p = new int; // 동적 메모리 할당 if( p == NULL ) // 메모리 할당 실패 {

// 에러 처리 }

p = new int(10);

(19)

목포해양대 해양전자통신공학부

delete 연산자

동적 메모리를 사용이 끝나면 delete 연산자로 해제한다.

delete 연산자는 포인터가 가리키는 동적 메모리를 해제하는데, 이 때 주의할 점은 delete 연산자 다음에 지정된 포인터 변수가 없어지는 것은 아니라는 점이다.

delete 연산자로 동적 메모리를 해제한 다음에는 동적 메모리의 주소를 저장하는 포인터 변수를 널 포인터로 지정하는 것이 안젂하다.

(20)

목포해양대 해양전자통신공학부 목포해양대 해양전자통신공학부

동적 메모리 사용 예

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;

}

(21)

목포해양대 해양전자통신공학부 목포해양대 해양전자통신공학부

동적 메모리 배열

 동적 메모리 배열을 할당할 때는 new[] 연산자를 사용하고 해제할 때는 delete [] 연산자를

사용한다.

int num;

cin >> num;

int *data = new int[num];

for(int i = 0 ; i < num; i++) cin >> data[i];

delete [] data;

(22)

목포해양대 해양전자통신공학부 목포해양대 해양전자통신공학부

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[]로 해제하지 않았으므로 실행 에러

(23)

목포해양대 해양전자통신공학부 목포해양대 해양전자통신공학부

new와 delete 사용시 주의사항 (2)

delete 연산자로 이미 해제된 메모리를 다시 해제해서는 안 된다.

동적 메모리를 해제한 다음 동적 메모리의 시작 주소를 저장하는 포인터 변수를 널 포인터로 만든다.

long *arr = new long[10];

... // 동적 메모리 배열의 사용

delete[] arr;

delete[] arr; // 해제된 메모리를 다시 해제하므로 실행 에러

long *arr = new long[10];

... // 동적 메모리 배열의 사용

delete[] arr;

arr = NULL;

delete[] arr; // 널 포인터를 해제하면 아무 일도 하지 않음

(24)

목포해양대 해양전자통신공학부 목포해양대 해양전자통신공학부

동적 메모리의 활용 (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;

}

(25)

목포해양대 해양전자통신공학부 목포해양대 해양전자통신공학부

동적 메모리의 활용 (2)

 크기가 늘어나는 배열의 사용

(26)

목포해양대 해양전자통신공학부 목포해양대 해양전자통신공학부

정리

네임스페이스는 프로그램에서 식별자가 정의되는 논리적인 공간을 제공한다.

네임스페이스를 이용하면 프로그램 내의 식별자를 관리하기가 쉬워진다.

네임스페이스에 정의된 식별자를 사용하려면 ‘네임스페이스 이름::식별자’의 형식으로 사용한다.

using 문을 이용하면 네임스페이스에 정의된 식별자를 사용할 때 네임스페이스 이름을 생략할 수 있다.

C++ 프로그램에서 동적 메모리를 사용하려면 new 연산자와 delete 연산자를 이용한다.

동적 메모리를 사용하면 실행 중에 꼭 필요한 만큼 할당하고, 프로그래머가 원하는 동안에만 메모리를 사용할 수 있다.

new 연산자를 동적 메모리를 할당하고 delete 연산자는 동적 메모리를 해제한다.

만일 동적 메모리를 할당만 하고 해제하지 않으면 문제가 되므로 주의해서 사용해야 한다.

배열을 동적 메모리에 할당하려면 new[] 연산자를 사용하고 해제할 때는 delete[]

연산자를 사용한다.

new와 delete, new[]와 delete[]는 반드시 한 쌍으로 사용해야 한다.

(27)

목포해양대 해양전자통신공학부 목포해양대 해양전자통신공학부

실습과제

 예제 3-9 수정 후 실행 확인 [200점]

 CountWords.cpp

 실습과제 1 [200점]

 실습과제 2 [200점]

 실습과제 2를 개선하여 성적순으로 정렬하여

출력하는 프로그램 작성 [200점]

참조

관련 문서

동적 수축 (Dynmic Contraction) 근수축 형태. 등속성 수축 (Isokinetic

– N번째 데이터에 도달하려면 앞에서부터 찾아야 한다. – 링크가

링크드리스트( Linked List ) 라고 한다. 매우 중요하지만,

channel ORA_DISK_1: specifying datafile(s) to restore from backup set channel ORA_DISK_1: restoring all foreign files in backup piece. channel ORA_DISK_1: reading from

Rest, fresh air, sunshine and skillful nursing work miracles every

3 ALDEP(automated layout design program) 은 거리와 같은 계량적인 정보가 없는 경우 사용할 수 있는 공정배치 기법이다. 4 라인밸런싱은 최소개수의

 다음은 객체를 생성하고 동적메모리를 객 체에 할당하며 할당된 메모리를 지우는 프

그러나 이미 풀어서 답을 알고 있는 부분문제 의 결과가 다시 필요한 경우에는 반복하여 계산하는 대 신에 이미 계산된 결과를 그냥