제8장 포인터와 동적객체 생성 포인터의 개념을 이해한다. 포인터와 관련된 연산을 이해한다.

Slides:



Advertisements
Similar presentations
Copyright © 2007 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Chapter 실 습실 습 2.
Advertisements

3. C++와 객체지향 C++ 코딩 방법 객체 단위로 2 개의 파일 인터페이스 파일 구현파일
Vision System Lab, Sang-Hun Han
명품 C++ 프로그래밍 3장. 클래스와 객체.
명품 C++ 8장 상속.
명품 C++ 4장. 객체 포인터와 객체 배열, 객체의 동적 생성.
Power C++ 제6장 포인터와 문자열.
C++ Espresso 제3장 배열과 포인터.
C++ Espresso 제3장 배열과 포인터.
C++ Espresso 제1장 기초 사항.
C++ Espresso 제2장 제어문과 함수.
Java Presentation 중간 시험2 풀이
강좌명 : C++프로그래밍 (C++ Programming)
실전 프로젝트 2 : 숫자야구 숫자 야구를 구현해보자.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
제6장 객체배열과 벡터 객체 배열을 이해한다. 벡터(vector) 클래스를 사용할 수 있다.
명품 C++ 13장 예외 처리와 C 언어와의 링크 지정.
C++ Exspresso 제5장 클래스의 기초.
16강. 자바 빈 빈 이란? 빈 만들기 빈 관련 액션 태그(useBean, getProperty, setProperty)
8. 객체와 클래스 (기본).
제12장 다형성과 가상함수 다형성의 개념을 이해한다. 상향 형변환의 개념을 이해한다. 가상 함수의 개념을 이해한다.
C++ Espresso 제9장 다형성.
10장 템플릿과 표준 템플릿 라이브러리(STL)
배열, 포인터, 참조 배열은 같은 형을 가지는 변수들의 묶음이다..
명품 C++ 8장 상속.
C++ Espresso 제6장 생성자와 소멸자.
6. 기본 클래스 프로그래밍 6 컴퓨터공학과 신동일.
상속이란? - 기반클래스로부터 다른 클래스를 파생하는 법 protected란? 가상함수 (virtual function)
제13장 파일처리 스트림의 개념을 이해한다. 객체 지향적인 방법을 사용하여 파일 입출력을 할 수 있다.
다중 상속 - 가상 상속 추상 자료형 순수 가상함수
명품 C++ 7장 프렌드와 연산자 중복.
18장. 헤더 파일과 구현 파일 01_ 헤더 파일과 구현 파일의 사용.
14장. 함수 1 01_ 함수의 기본 02_ 인자의 전달.
C ++ 프로그래밍 시작.
정적 멤버 변수/정적 멤버 함수 - friend 함수/클래스 template
C++ Programming: chapter 7 – inheritence
제4장 클래스와 객체 객체 지향 기법을 이해한다. 클래스를 작성할 수 있다. 클래스에서 객체를 생성할 수 있다.
배열이란? 배열의 선언? - 배열과 포인터의 관계? 문자열이란? 문자배열 연결 리스트
스택(Stack) 김진수
17장. 문자열 01_ 문자열 사용의 기본 02_ 문자열의 사용.
14. 예외처리.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
제14장 예외처리와 템플릿 예외 처리의 개요를 학습한다. 예외 처리를 적용할 수 있다. 템플릿의 개념을 이해한다.
제5장 생성자와 접근제어 객체 지향 기법을 이해한다. 클래스를 작성할 수 있다. 클래스에서 객체를 생성할 수 있다.
가상함수와 추상 클래스.
Chapter 1 C와는 다른 C++. 최호성.
제2장 제어구조와 배열 if-else 문에 대하여 학습한다. 중첩 if-else 문에 대하여 학습한다.
제 12장. 사용자 정의형으로서의 클래스 학기 프로그래밍언어및실습 (C++).
4. 고급변수 사용 : 포인터와 관련하여 메모리 바라보기
프로그래머를 위한 첫걸음 JDBC Lecture 001 BY MINIO
3장. 클래스의 기본.
루프와 카운트 Looping and counting
멤버 함수인 operator+()가 실행, 또는 전역 함수인 operator+()가 실행 Point p3 = p1+p2; 에서
멤버함수 중첩( 복사 생성자 ) - 연사자 중첩 - 동적 메모리를 가지는 클래스를 지원 하도록 멤버 함수 작성
조 병 규 Software Quality Lab. 한 국 교 통 대 학 교
A Basic of C++.
C-언어와 기반구조 정보보호학과 이정수 교수.
5. 논리적 자료표현 : 구조체.
[ 단원 06 ] 상속과 다형성.
제 11장. 템플릿과 STL 학기 프로그래밍언어및실습 (C++).
03. 메모리 관리 C++ 프로그램에서 다룰 수 있는 메모리의 종류
C++ Espresso 제13장 입출력과 파일처리.
포인터와 배열 조 병 규 한 국 교 통 대 학 교 SQ Lab..
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
자료구조 세미나 발표 주제: 자료구조 기초 - 1회 차: 자료구조의 정의, 기초 지식 (함수, 포인터, 레퍼런스)
10장 템플릿과 표준 템플릿 라이브러리(STL)
컴퓨터 프로그래밍 기초 - 11th : 파일 입출력 및 구조체 -
실습과제 1번 /* 1. 멤버 변수로 반경 radius를 갖고, 그 값을 모니터에 출력하는
개정판 누구나 즐기는 C언어 콘서트 제10장 문자열 출처: pixabay.
C++ 언어의 특징
Presentation transcript:

제8장 포인터와 동적객체 생성 포인터의 개념을 이해한다. 포인터와 관련된 연산을 이해한다. 동적 메모리 할당을 사용할 수 있다. 스마트 포인터를 사용할 수 있다. 동적으로 객체를 생성하는 과정을 이해한다.

이번 장에서 만들어 볼 프로그램 (1) 정수 10개를 저장할 수 있는 동적 배열을 생성하고 난수를 저장한 후에 화면에 출력하는 프로그램을 작성해보자.   (2) 사용자가 입력한 개수만큼의 원을 동적으로 생성하여서 화면에 그리는 프로그램을 작성해보자.

포인터란? 주소를 가지고 있는 변수

포인터 선언 int *p1; double *p2; char *p3; short *p4;

주소연산자 & int number = 10; // 변수 정의 int *p; // 포인터 정의 p = &number; // 변수 number의 주소를 포인터 p에 저장

간접참조연산자 *

예제 #include <iostream> using namespace std; int main() { int number = 10; // 변수 number의 주소를 계산하여 p에 저장한다. int *p = &number; // p가 가리키는 공간에 저장된 값을 출력한다. cout << *p << endl; return 0; }

nullptr int *p = nullptr;(O) int *p = NULL;(X)

동적 할당 메모리 동적 메모리 할당(dynamic memory allocation)이란 프 로그램이 실행 도중에 동적으로 메모리를 할당받는 것을 말한다.

동적 메모리 사용절차

동적 메모리 할당

동적 메모리 초기화 int *p; p = new int[5]; int *p = new int[5] { 0, 1, 2, 3, 4 };

동적 메모리 해제

예제 #include <iostream> #include <time.h> using namespace std; int main() { int *ptr; srand(time(NULL)); // 난수 발생기 시드 설정 ptr = new int[10]; // ① 동적 메모리 할당 for (int i = 0; i<10; i++) ptr[i] = rand(); // ② 동적 메모리 사용 cout << ptr[i] << " "; delete[] ptr; // ③ 동적 메모리 반납 cout << endl; return 0; }

실행결과

스마트 포인터 스마트 포인터를 사용하면 프로그래머가 동적 메모리 할 당 후에 잊어버려도 자동으로 동적 메모리가 삭제된다. 스마트 포인터는 자동으로 nullptr로 초기화된다. #include <iostream> #include <memory> using namespace std; int main() { unique_ptr<int> p(new int); *p = 99; // p를 사용한다. }

스마트포인터로 배열 가리키기 #include <iostream> #include <memory> using namespace std; int main() { unique_ptr<int[]> buf(new int[10]); for (int i = 0; i<10; i++) { buf[i] = i; } cout << buf[i] << " "; cout << endl; return 0;

객체의 동적 생성 #include <iostream> using namespace std; class Dog { private: string name; int age; public: Dog() { cout << "생성자 호출\n"; age = 1; name = "바둑이"; } ~Dog() { cout << "소멸자 호출\n"; };

객체의 동적 생성 int main() { Dog * pDog = new Dog; delete pDog; return 0; }

포인터를 통하여 멤버 접근하기 int main() { Dog * pDog = new Dog; cout << "강아지의 나이: " << pDog->getAge() << endl; pDog->setAge(5); delete pDog; return 0; }

멤버 동적 생성 class Dog { private: int *pWeight; int *pAge; public: Dog() { pAge = new int(1); pWeight = new int(10); } ~Dog() { delete pAge; delete pWeight; int getAge() { return *pAge; } void setAge(int age) { *pAge = age; } int getWeight() { return *pWeight; } void setWeight(int weight) { *pWeight = weight; } };

멤버 동적 생성 int main() { Dog * pDog = new Dog; cout << "강아지의 나이: " << pDog->getAge() << endl; pDog->setAge(5); delete pDog; return 0; }

this 포인터 현재 객체를 참조하는 포인터 class Rectangle { private: int length; int width; public: Rectangle() { width = 30; length = 40; } ~Rectangle() {} void setLength(int length) { this->length = length; } int getLength() { return this->length; } void setWidth(int width) { this->width = width; } int getWidth() { return width; } };

Lab: 동적 원 생성 사용자가 입력한 개수만큼의 원을 동적으로 생성하여서 화면에 그리는 프로그램을 작성해보자.

this 포인터 #include <iostream> #include <string> #include <windows.h> #include <conio.h> using namespace std; class Circle { public: int x, y, radius; // 원의 중심점과 반지름 string color; // 원의 색상 void draw(); }; void Circle::draw() { // 원을 화면에 그리는 함수 HDC hdc = GetWindowDC(GetForegroundWindow()); Ellipse(hdc, x - radius, y - radius, x + radius, y + radius); }

this 포인터 int main() { int n; Circle *p; cout << "몇 개의 원을 만들까요: "; cin >> n; p = new Circle[n]; for (int i = 0; i < n; i++) { p[i].x = 100 + rand() % 300; p[i].y = 100 + rand() % 200; p[i].radius = rand() % 100; p[i].draw(); } delete[] p; getch(); return 0;

const 포인터 p1은 변경되지 않는 정수를 가리키는 포인터이다. 이 포 인터를 통하여 참조되는 값은 변경이 불가능하다. const int *p1; // ① int * const p2; // ② const int * const p3; // ③ p1은 변경되지 않는 정수를 가리키는 포인터이다. 이 포 인터를 통하여 참조되는 값은 변경이 불가능하다. p2는 정수에 대한 상수 포인터이다. 정수는 변경될 수 있 지만 p2는 다른 것을 가리킬 수 없다. p3는 상수에 대한 상수 포인터이다. 포인터가 가리키는 값도 변경이 불가능하고 포인터 p3도 다른 것을 가리키 게끔 변경될 수 없다.

const 포인터와 const 멤버 함수 멤버 함수를 const로 정의하면 함수 안에서 멤버 변수를 변경하는 것이 금지된다. const 객체를 가리키는 포인터 를 정의하면 이 포인터로 호출할 수 있는 함수는 const 함 수뿐이다.

예제 #include <iostream> using namespace std; class Circle { private: int radius; public: Circle() :radius(10){ } ~Circle() { } void setRadius(int radius) { this->radius = radius; } int getRadius() const { return radius; } };

예제 int main() { Circle* p = new Circle(); const Circle *pConstObj = new Circle(); Circle *const pConstPtr = new Circle(); cout << "pRect->radius: " << p->getRadius() << endl; cout << "pConstObj->radius: " << pConstObj->getRadius() << endl; cout << "pConstPtr->radius: " << pConstPtr->getRadius() << endl<<endl; p->setRadius(30); // pConstObj->setRadius(30); pConstPtr->setRadius(30); cout << "pConstPtr->radius: " << pConstPtr->getRadius() << endl; return 0; }

실행결과

Q & A