기초 C++ 프로그래밍 #1

Similar documents
C++ Programming

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

설계란 무엇인가?

PowerPoint Presentation

쉽게 풀어쓴 C 프로그래밍

1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y; public : CPoint(int a

슬라이드 1

C++ Programming

PowerPoint Template

Microsoft PowerPoint - C++ 5 .pptx

PowerPoint Presentation

Microsoft PowerPoint - additional07.ppt [호환 모드]

C++ Programming

PowerPoint Template

쉽게 풀어쓴 C 프로그래밍

chap10.PDF

Microsoft PowerPoint - Chap12-OOP.ppt

<4D F736F F F696E74202D2036C0CFC2B05FB0B4C3BCC1F6C7E2C7C1B7CEB1D7B7A1B9D62E707074>

Microsoft PowerPoint - Chapter 6.ppt

JAVA PROGRAMMING 실습 08.다형성

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

Microsoft PowerPoint - additional08.ppt [호환 모드]

11장 포인터

설계란 무엇인가?

Microsoft PowerPoint - ch07 - 포인터 pm0415

슬라이드 1

Microsoft PowerPoint - additional01.ppt [호환 모드]

쉽게 풀어쓴 C 프로그래밍

1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout << " 양수입력 : "; cin >> *p; if (*p <= 0) cout << " 양수를입력해야합니다 " << endl; return; 동적할

Lab 3. 실습문제 (Single linked list)_해답.hwp

(Microsoft Word - \301\337\260\243\260\355\273\347.docx)

금오공대 컴퓨터공학전공 강의자료

쉽게 풀어쓴 C 프로그래밍

PowerPoint Template

4 장클래스와객체 클래스와객체 public과 private 구조체와클래스객체의생성과생성자객체의소멸과소멸자생성자와소멸자의호출순서디폴트생성자와디폴트소멸자멤버초기화멤버함수의외부정의멤버함수의인라인함수선언 C++ 프로그래밍입문

Slide 1

Blog

PowerPoint 프레젠테이션

chap 5: Trees

Microsoft PowerPoint - chap06-2pointer.ppt

Microsoft PowerPoint - additional03.ppt [호환 모드]

02장.배열과 클래스

Microsoft PowerPoint - additional06.ppt [호환 모드]

JAVA PROGRAMMING 실습 02. 표준 입출력

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

C++ Programming

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

gnu-lee-oop-kor-lec06-3-chap7

17장 클래스와 메소드

11장 포인터

PowerPoint Presentation

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조

Microsoft PowerPoint - Chapter 1-rev

Lab 4. 실습문제 (Circular singly linked list)_해답.hwp

Microsoft PowerPoint - [2009] 02.pptx

PowerPoint Presentation

제 1 강 희망의 땅, 알고리즘

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

untitled

Microsoft PowerPoint - 제11장 포인터(강의)

Microsoft PowerPoint - 8ÀÏ°_Æ÷ÀÎÅÍ.ppt

1. 상속의기본개념 다음과같은문제를위한클래스설계 자동차 속성 : 색상, 배기량, 현재속도 메서드 : 가속하라, 멈춰라, 시동을켜라 트럭 속성 : 색상, 배기량, 현재속도, 최대중량 메서드 : 가속하라, 멈춰라, 시동을켜라 택시 속성 : 색상, 배기량, 현재속도, 요금,

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

PowerPoint Template

Design Issues

Microsoft PowerPoint - 제11장 포인터

(Microsoft PowerPoint - 07\300\345.ppt [\310\243\310\257 \270\360\265\345])

Chapter 4. LISTS

Microsoft PowerPoint - chap11-포인터의활용.pptx

Microsoft PowerPoint 장강의노트.ppt

Microsoft PowerPoint - java1 [호환 모드]

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2

Microsoft PowerPoint - chap10-함수의활용.pptx

프입2-강의노트-C++배경

080629_CFP °ø°³¿ë.hwp

Chapter 4. LISTS

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

C++ Programming

1. 표준입출력 C++ : C의모든라이브러리를포함 printf, scanf 함수사용가능예 : int, double, 문자열값을입력받고출력하기 #include <cstdio> int ivar; double dvar; char str[20]; printf("int, dou

untitled

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

Microsoft PowerPoint - CSharp-10-예외처리

Microsoft PowerPoint - 2강

Microsoft PowerPoint - 02-Class Review.pptx

Microsoft PowerPoint - Chapter 10.ppt

C# Programming Guide - Types

Microsoft PowerPoint - chap06-5 [호환 모드]

PowerPoint Presentation

03_queue

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

설계란 무엇인가?

윤성우의 열혈 TCP/IP 소켓 프로그래밍

C프로-3장c03逞풚

<432B2BC7C1B7CEB1D7B7A1B9D628BABBB9AE5FC3D6C1BE295B315D2E687770>

Microsoft PowerPoint - 6주차.pptx

금오공대 컴퓨터공학전공 강의자료

구조체정의 자료형 (data types) 기본자료형 (primitive data types) : char, int, float 등과같이 C 언어에서제공하는자료형. 사용자정의자료형 (user-defined data types) : 다양한자료형을묶어서목적에따라새로운자료형을

1. 클래스와배열 int 형배열선언및초기화 int ary[5] = 1, 2, 3, 4, 5 ; for (int i = 0; i < 5; i++) cout << "ary[" << i << "] = " << ary[i] << endl; 5 장클래스의활용 1

PowerPoint 프레젠테이션

Transcription:

< 컴퓨터학실험 I> 기초 C++ 프로그래밍 #1 서강대학교컴퓨터학과 Dept. of Computer Science, Sogang Univ. 1

C++ 프로그래밍언어 1979 년, Bjarne Stroustrup 의 C with Classes 의작업으로부터시작 C 의장점 : 범용성, 빠른속도, 높은보급률 Simula 의특성 : 최초의객체지향프로그래밍언어로서, 객체, 클래스, 상속등의요소포함 C 를 Simula 의특성을통해확장하고자함 1983 년 C++ 로개명됨 1998 년국제표준제정 (ISO/IEC 14882:1998, known as C++98) 2011 년 8 월최신국제표준개정 (ISO/IEC 14882:2011, known as C++11, or C++0x) Dept. of Computer Science, Sogang Univ. 2

객체지향프로그래밍 Object-Oriented Programming(OOP) OOP 는컴퓨터프로그램을디자인하기위해, 객체 (objects) 데이터필드 (data fields) 와메소드 (methods) 및이들간의상호작용으로구성되는 - 를사용하는프로그래밍패러다임이다. OOP 에서, 객체는클래스 (class) 의특정한인스턴스 (instance) 연구자들은대부분의객체지향언어에서, OOP 프로그래밍스타일을뒷받침하는근본적인특성들을다음과같이확인함 동적결합 (Dynamic Binding) 캡슐화 (Encapsulation) 서브타입다형성 (Subtype polymorphism) 상속 (Inheritance) Dept. of Computer Science, Sogang Univ. 3

절차적프로그래밍 vs. 객체지향프로그래밍 전통적인절차적프로그래밍 (traditional procedural programming) 알고리즘이우선, 그리고자료구조는나중에고려 객체지향프로그래밍 (object-oriented programming ) 자료구조가우선, 그후데이터를활용하는알고리즘에대해생각함 각각의객체가일련의연관된작업들의수행을전담하도록함 재사용성을최대화, 데이터의존성을축소, 디버깅시간을최소화 Dept. of Computer Science, Sogang Univ. 4

절차적프로그래밍 vs. 객체지향프로그래밍 메소드 데이터 객체 함수 함수 함수 메소드 메시지 메소드 전역데이터 데이터 객체 메소드 절차적프로그래밍 객체지향프로그래밍 Dept. of Computer Science, Sogang Univ. 5

객체지향프로그래밍의예 문제 : 테트리스게임을만들어야함 절차지향프로그래밍 테트리스의블록의집합을정의 게임데이터로점수가필요함 블록이쌓인것을표현하는 2 차원배열이필요함 테트리스블록을랜덤하게생성하는함수 블록이떨어지는것을계산하는함수 블록의이동을화면에표현할함수 블록이바닥에도착했는지를판단하는함수 특정라인이블록으로가득찼는지를판단하여지우는함수 특정라인이지워진후위의내용을한칸내리는함수 사용자의키보드입력을받아블록을움직이는함수 프로그램 = 데이터 + 함수 객체지향프로그래밍 크게블록생성기와게임엔진, UI로프로그램을분해 블록생성기의속성으로서현재블족의종류를정의 블록생성기의행위로서블록을랜덤하게생성하는함수정의 게임엔진의속성으로서점수, 블록의상태를정의 게임엔진의행위로서블록생성기에새로운블록요청, 블록의떨어짐, 바닥에도달, 라인의꽉참, 지워진칸위를내리는등의기능을정의 UI의속성으로서현재화면의픽셀정도를정의 UI의행위로서게임엔진에현재상태요청, 화면에새로그리기등의기능을정의프로그램 = 객체 + 객체 + Dept. of Computer Science, Sogang Univ.

클래스와객체 객체는두가지구성요소를지님 상태 (State): 객체가가지고있는속성또는특성 ; 데이터, 속성 행동 (Behavior): 객체가가지고있는행동또는할수있는반응양식 ; 메소드, 오퍼레이션 OOP 에서, 클래스는그자신의인스턴스를만들기위하여청사진 ( 또는형틀 ) 으로사용되는구조물이라할수있음 Blue Car Car Class (Abstract) Red Car Yellow Car Example: The Car Class and Car Instances Dept. of Computer Science, Sogang Univ. 7

클래스와객체 클래스 ( 개념 ) 인스턴스생성 객체 ( 구체화 ) John 의은행계좌잔액 : $5,257 은행계좌 Bill 의은행계좌잔액 : $1,245,069 Mary 의은행계좌잔액 : $16,833 동일한클래스로부터생성된다수의객체들 Dept. of Computer Science, Sogang Univ. 8

클래스의예 클래스 : 자동차 데이터 : 제조사명 모델명 제조날짜 색상 문의개수 엔진크기 etc. 메소드 : 데이터항목정의 ( 제자사명, 모델명, 제조날짜등등명세 ) 데이터항목변경 ( 색상, 엔진등등 ) 데이터항목출력 비용계산 etc. Dept. of Computer Science, Sogang Univ. 9

C++ 의기초 C++ 프로그래밍의기초개념을공부하고, 그내용을바탕으로유명한자료구조중하나인스택자료구조가 C++ 로어떻게구현되는지살펴본다. 학습할내용 C++ 의프로그래밍패러다임 C++ 의표준입출력 C++ 에서의동적메모리할당 C++ 의참조연산자 C++ 에서의클래스 접근지정자, 생성자, 소멸자 C++ 로구현한스택 Dept. of Computer Science, Sogang Univ. 10

C++ 의프로그래밍패러다임 전역함수는 main() 함수하나만필요함 모든프로그램의수행은클래스에서생성된객체들사이의메시지전달로수행됨 : 메시지의세가지구성요소는 1) 메시지가전달될객체, 2) 수행하고자하는멤버함수의이름, 3) 그멤버함수가수행되는데필요한인자 Ex) // C++ 표준헤더는확장자.h 를붙이지않는다. #include <iostream> #include <string> int main(){ // sample 클래스의인스턴스생성 sample obj; // sample 클래스선언 class sample{ // C 언어에서는함수호출을통해작업을수행함 printf(" 함수호출 \n"); ; private: int value; public: int getvalue(){ return value; ; void setvalue(int param) { value=param; ; // C++ 에서는메시지전달로작업을수행함 /* 메시지를통해객체에게메소드를호출하여줄것을요청하며, 객체가알아서스스로동작함 ( 내부적인활동을외부에서알수없음, Encapsulation) */ obj.setvalue(10); // 메시지가전달될객체 : obj // 수행하고자하는멤버함수 : setvalue() // 멤버함수가수행되는데필요한인자 : 10 Dept. of Computer Science, Sogang Univ. 11

C++ 에서의표준입출력 C++ 에서의표준입출력은 I/O stream 을이용하여수행됨 stream 이란데이터의연속적인흐름을의미함 표준입력은 cin 객체로수행됨 Ex) int row, col; scanf( %d %d, &row, &clo);// C cin >> row >> col; // C++ 주소를넘기지않아도 >> 가참조 (reference type) 를받도록재정의 (overloading) 되어있으므로변수에값이저장됨 표준출력은 cout 객체로수행됨 Ex) int var1, var2; printf( %d %d, var1, var2); // C cout << var1<< var2; // C++ cout.setf() 를이용하여 printf() 의에서의 formatting 은 cout.setf() 명령어를이용하여수행됨 자세한내용은 reference manual 참고 Dept. of Computer Science, Sogang Univ. 12

C++ 에서의동적메모리할당 C++ 에서는 new 와 delete 이용 2 차원배열동적메모리할당 int *var1; int **var1; // C++ // 메모리할당 var1 = new int; // 메모리할당 var1 = new int*[row]; delete var1; // 메모리해제 for( i = 0; i < row; i++) // C var1[i] = new int[col]; var1 = (int*)malloc(sizeof(int)); free(var1); // 메모리해제 for( i = 0; i < row; i++) 1 차원배열동적메모리할당 delete [] var1[i]; int *var1; delete [] var1; // 메모리할당 var1 = new int[size]; // 메모리해제 delete [] var1; Dept. of Computer Science, Sogang Univ. 13

C++ 의참조연산자 (Reference Operator) & 연산자가 C++ 에서확장됨 참조연산자는포인터와달리별도의메모리공간을차지하지않으며, 객체를지칭하는또다른이름처럼사용됨 // 포인터이용 void swap(int *a, int *b){ int tmp; tmp = *a; *a = *b; *b = tmp; // 참조연산자이용 void swap(int &a, int &b){ int tmp; tmp = a; a = b; b = tmp; swap(&a, &b); swap(a, b); 참조연산자의사용으로함수간인자전달에서포인터연산이사라짐 리턴타입도참조연산으로지정가능 Dept. of Computer Science, Sogang Univ. 14

C++ 에서의클래스 C++ 에서의클래스선언과구현은분리되어있다. 클래스의선언 class < 클래스이름 >{ 접근지정자 : 멤버 ( 멤버변수또는멤버함수 ) ; 클래스의구현 클래스선언의멤버함수들을구현함 #include " 클래스이름.h" 리턴타입 < 클래스이름 >::< 멤버함수이름 >( 자료형인자 1, 자료형인자 2, ){ code; 일반적으로 < 클래스명 >.h 파일에서클래스선언, < 클래스명 >.cpp 파일에서클래스구현 #include " 클래스명.h" 으로헤더를포함하여클래스사용 Dept. of Computer Science, Sogang Univ. 15

접근지정자, 생성자, 소멸자 접근지정자는객체의멤버를외부에서접근 ( 다른객체나 main() 함수등 ) 할때어떤내용을외부로공개할지를결정한다. 접근지정자 객체내멤버함수 상속받은클래스의객체내멤버함수 외부함수 ( 특히 main() 함수등 ) public O O O private O X X protected O O X 일반적으로멤버변수는 private 으로, 멤버함수는 public 으로지정한다. ( 지정하지않았을경우에는기본적으로 private 로설정 ) 생성자 (constructor) 클래스로부터객체가생성될때자동으로호출되는함수 일반적으로객체의초기화를수행한다. 생성자는반드시클래스의이름과같아야하며, 리턴타입을갖지않는다. 소멸자 (destructor) 클래스로부터생성된객체가소멸될때자동으로호출되는함수 일반적으로메모리의해제등에사용된다. 반드시하나만존재하며 ~< 클래스이름 >(); 의형태로선언된다. Dept. of Computer Science, Sogang Univ. 16

접근지정자, 생성자, 소멸자의예 #include <iostream> #include <string> using namespace std; /* cin, cout, endl 등과같은명령어들은표준라이브러리에속하는데, 이들은 std 라는 namespace 안에존재하므로명령어사용시 std 안에있는것을사용할것임을명시해주는구문이다. 이것이없으면 std::cout<<std::endl; 과같이사용 */ // student 클래스선언 class student { private: // 객체외부에서는접근불가 int id; char *name; public: // 객체외부에서는접근가능 student(int stid, char *stname); // 생성자 ~student(); // 소멸자 ; Dept. of Computer Science, Sogang Univ. 17

접근지정자, 생성자, 소멸자의예 // 생성자 student::student(int stid, char *stname){ id = stid; int tmp = strlen(stname); name = new char[tmp+1]; /* 메모리할당. 일반적으로생성자에서는변수초기화만처리하는것이좋다. 인스턴스가내부적으로완전한상태가아님. */ strcpy(name, stname); cout<<"student 생성 "<<endl; // 소멸자 student::~student(){ delete(name); // 메모리해제 cout<<"student 소멸 "<<endl; int main(){ student *s = new student(10," 홍길동 "); /* 인자가 int 와 char[] 인생성자로객체가생성된후포인터 s 에연결 */ delete s; // s 에할당된객체가제거되면서소멸자가자동으로호출됨. return 0; Dept. of Computer Science, Sogang Univ. 18

C++ 로구현한스택 (stack.h) #define MAX_SIZE 100 typedef int Item; Struct Node{ Item item; struct Node *next; // int 를스택의자료단위로지정 // 스택의각노드에들어갈데이터 // 다음노드를가리키는포인터 class Stack{ private: // 외부에서직접접근불가 Node *top; // 스택의 top을지정하는포인터 int MaxSize; // 스택의최대크기 int currentsize; // 스택의현재크기 public: // 외부에서직접접근가능 Stack(); // 디폴트생성자 ( 스택의크기가최대크기로설정됨 ) Stack(int); // 스택의최대크기를사용자가정할수있는생성자 ~Stack(); // 소멸자 bool isempty(void) const; // 스택이비었는지를판단하는멤버함수 bool isfull(void) const; // 스택이가득찼는지를판단 int stackcount(void) const; // 스택에노드가몇개있는지를판단 bool push(const Item &item); // 스택에새로운노드를삽입 bool pop(item &item); // 스택의 top에서하나의노드를가져옴. ; Dept. of Computer Science, Sogang Univ. 19

C++ 로구현한스택 (stack.cpp) #include "stack.h" Stack::Stack(){ currentsize=0; MaxSize=MAX_SIZE; top = NULL; 생성자에서변수초기화수행 Stack::Stack(int maxstacksize){ currentsize = 0; MaxSize=maxStackSize; top = NULL; Stack::~Stack(){ Item i; while(isempty()){ pop(i); 소멸자에서객체가소멸될때처리할작업을수행 ( 메모리에할당된아이템들을모두없애는작업을수행함 ) bool Stack::push(const Item &item){ if(isfull()) return false; Node *add = new Node; if(!add) return false; add->item = item; add->next = NULL; currentsize++; if(!top) top = add; else{ add->next = top; top = add; return true; bool Stack::pop(Item &item){ if(isempty()) return false; Node *tmp; currentsize--; item = top->item; tmp = top; top = top->next; tmp->next = NULL; delete(tmp); return true; bool Stack::isEmpty(void) const{ return currentsize==0; bool Stack::isFull(void) const{ return currentsize==maxsize; int Stack::stackCount(void) const{ return currentsize; 새로노드를할당한후에현재의 top 변수가가리키는노드를그뒤에연결하고, 새로할당한노드를 top 변수가가리키게함 top 의바로다음노드를새로운 top 으로변경하고이전 top 의노드를할당해제 Dept. of Computer Science, Sogang Univ. 20

C++ 의객체지향적특성 ( 다시 3 페이지의 OOP 설명으로돌아가서,) 연구자들은대부분의객체지향언어에서, OOP 프로그래밍스타일을뒷받침하는근본적인특성들을다음과같이확인함 동적결합 (Dynamic binding) 캡슐화 (Encapsulation) 서브타입다형성 (Subtype polymorphism) 상속 (Inheritance) 1 주차에서는, C++ 에서지원하는객체지향의중요한특성중하나인상속 (Inheritance) 에대해서공부하고실습을통해개념을이해함 캡슐화및서브타입다형성은다음시간에공부함 Dept. of Computer Science, Sogang Univ. 21

상속 상속은객체지향에서가장혁신적인발명이라고일컬어지는개념 클래스가인스턴스를생성할때, 다른클래스의속성 / 오퍼레이션을빌려와서자신이갖고있는것과합친후하나의인스턴스를생성하는것 Dept. of Computer Science, Sogang Univ. 22

상속 상속은 is-a 관계를구현하는경우에사용 Ex> 학생 is a 인물 class Person { ; class Student : public Person { ; class Teacher : public Person { ; 인물 : 기반클래스 (Base Class), 학생 : 파생클래스 (Derived Class) 기반클래스는파생클래스로부터독립됨 파생클래스들에대한공통기반클래스를미리만들어두면파생클래스의공통된부분에대한분석, 설계, 구현, 테스트, 디버그, 유지관리의필요성이사라짐 아무리클래스를파생시키더라도 ( 예 : 인물의파생클래스교사 ) 기반클래스에는영향이없음 Dept. of Computer Science, Sogang Univ. 23

상속이되었을때생성자, 소멸자호출순서 파생클래스로부터객체가생성될때는상속계층구조상의모든생성자가호출되고, 소멸될때는모든소멸자가호출됨. Ex) D class 로객체를생성한다면 A::A(); B::B(); C::C(); D::D(); 순으로호출됨. A B C D::~D(); C::~C(); B::~B(); A::~A(); 순으로호출됨. D Dept. of Computer Science, Sogang Univ. 24

상속이되었을때생성자, 소멸자호출 파생클래스의생성자는자동적으로기반클래스의디폴트생성자 (default constructor, 인자가없는생성자 ) 를호출한다. 인자가있는생성자를따로정의하면디폴트생성자는없어진다. 이때만약기반클래스에서디폴트생성자가없는체로파생클래스에서생성자를호출하면존재하지도않는디폴트생성자를호출하게되어에러가발생한다. 이를해결하기위해기반클래스에디폴트생성자를추가해주거나, 또는기반클래스의생성자를명시적으로호출해주어야한다. ( 아래는 CPP-1 에서의예 ) 기반클래스 Array RangeArray::RangeArray(int l, int h) : Array(h-l+1) { 파생클래스 RangeArray 기반클래스의생성자를명시적으로지정하는방법. Dept. of Computer Science, Sogang Univ. 25

CPP-1: RangeArray RangeArray 클래스는배열이인덱스 0 에서시작하는것이아닌, 생성자에전달된임의의범위를갖는다. EX> RangeArray A(-10, 10); // 인덱스 -10~10 을가지고, 21 개원소저장 C++ 에서제공하는다른기본자료형 (int, float, double ) 과마찬가지로, [] 연산자를사용하여배열의값을얻거나또는배열에값을저장할수있도록설계한다. [] 연산자에대한연산자다중정의가필요 배열에원소를삽입하는경우 ( 등호의왼쪽에연산자를사용, left value), 원소가저장되는메모리영역의참조 (Reference) 를반환하도록해야함 배열의값을반환하는경우 ( 등호의오른쪽에연산자를사용, right value), 내부저장소에서원소의값을찾아서반환하도록하여야함 임의의인덱스를처리하게하는것이어려우므로, 일단인덱스 0 부터시작하는 Array 클래스를완벽하게작성한후이를상속하는 RangeArray 클래스를작성함 Dept. of Computer Science, Sogang Univ. 26

다중정의 (Overloading) 본실습에필요한연산자다중정의를위해다중정의에대해알아보자. 다중정의는크게함수다중정의 (function overloading) 와연산자다중정의 (operator overloading) 로구분된다. 함수다중정의는함수의이름은같고, 인자의개수나자료형이다른함수들을프로그램이자동으로구분하는것이다. Ex) int func(int a, int b); int func(float a, float b); 위의함수는이름은같지만서로다른함수다. 사용자가입력하는인자의자료형에따라다른함수가호출된다. int func(int a, int b); float func(int a, int b); 위의경우는컴파일에러를유발한다. 함수다중정의는리턴자료형만다른것으로는구현불가능 연산자다중정의는 C++ 에서사용되는특정객체에적절한연산을수행하도록연산자에또다른의미를부여하는것이다. Ex) cin, cout cin>>a; 처럼 cin 객체를위해 >> 연산자를추가로구현하고있다. 이를위해서는다음과같이정의해야한다. < 리턴자료형 > < 클래스이름 >::operator < 연산자 >( 인자 1, 인자 2 ) { Dept. of Computer Science, Sogang Univ. 27

함수다중정의의예 #include <iostream> using namespace std; int add(int, int); double add(double, double); 두함수의이름은같지만인자의자료형이다르다. int main(void) { cout<<"result 1 : "<<add(5,10)<<endl; cout<<"result 2 : "<<add(5.2,10.3)<<endl; return 0; int add(int, int) 가호출됨 double add(double, double) 가호출됨 int add(int a, int b){ return a+b; double add(double a, double b){ return a+b; Dept. of Computer Science, Sogang Univ. 28

연산자다중정의의예 char string::operator[](int i) { return s[i]; string 클래스의멤버로 [] 연산자를다중정의함으로써, 객체의인스턴스명 [int형값] 의형태로사용할때 s의인덱스의값을 char형으로리턴한다. Ex> string ss("hello"); char ichar = ss[1]; // 'e' 가 ichar에저장 string& string::operator=(string& str) { strcpy(s,str); return *this; this: 멤버함수를호출한객체에대한포인터즉, 객체자기자신에대한포인터 string 클래스의멤버로 = 연산자를다중정의함으로써, 객체의인스턴스명 =string객체의레퍼런스 의형태로사용할때그값을내부데이터로복사하고객체자신의포인터를리턴한다. Ex> string ss("hello"); string ss2("bye"); ss = ss2; // "bye" 가 ss에복사됨 Dept. of Computer Science, Sogang Univ. 29

Array 를이용한 RangeArray 의구현 Array 를구현한후 RangeArray 는 Array 를상속하여필요한부분만코딩하고나머지는 Array 의멤버변수와멤버함수를그대로이용한다. 예를들어, RangeArray 의인스턴스를인덱스 -10~10 으로생성하였다면, 이를 Array 의멤버변수에인덱스 0~20 으로저장하고, 대신에값을저장하거나얻는경우에 RangeArray 의인스턴스를생성시입력받은인덱스값을이용하여참조하면된다. (-7 인덱스의값을얻고자할경우 Array 의변수데이터에서인덱스 7 의값을사용하도록함 ) [] 의경우연산자다중정의를사용해야한다. (29, 31 쪽참조 ) 생성자의연결구조를반드시고려해야한다. 파생클래스에서생성자를호출할경우기반클래스의생성자를호출할수있도록명시적으로지정해주어야한다. (26 쪽참조 ) 다음두슬라이드에있는선언을기초로작성한다. Dept. of Computer Science, Sogang Univ. 30

Array 를이용한 RangeArray 의구현 ( 샘플프로그램과출력 ) int main(){ int i,x,y; Array a(10), b(5); for (i=0; i<a.length(); i++) a[i] = i + 1; for (i=0; i<b.length(); i++) b[i] = i * 2; cout << a(10) ; a.print(); cout << b(5) ; b.print(); cout << a[-1] ; a[-1] = 7; x = a[0]; y = b[0]; cout << a[0]= << x << b[0] = << y << endl; 출력 : a(10) [1 2 3 4 5 6 7 8 9 10] b(5) [0 2 4 6 8] a[-1] Array bound error! a[0] = 1 b[0] = 0 c(-1,3) [-3 0 3 6 9] d(3,7) [12 16 20 24 28] c[-2] Array bound error! c[-1] = -3 d[3] = 12 RangeArray c(-1,3), d(3,7); for (i=c.basevalue(); i<=c.endvalue(); i++) c[i] = i * 3; for (i=d.basevalue(); i<=d.endvalue(); i++) d[i] = i * 4; cout << c(-1,3) ; c.print(); cout << d(3,7) ; d.print(); cout << c[-2] ; c[-2] = 3; x = c[-1]; y = d[3]; cout << c[-1] = << x << d[3] = << y << endl; Dept. of Computer Science, Sogang Univ. 31

Array.h #ifndef ARRAY #define ARRAY class Array{ protected: int *data; int len; public: Array(int size); ~Array(); int length(); int& operator[](int i); int operator[](int i) const; ; #endif void print(); Dept. of Computer Science, Sogang Univ. 32

RangeArray.h #include Array.h" class RangeArray : public Array{ protected: int low; int high; public: RangeArray(int, int); ~RangeArray(); int basevalue(); int endvalue(); ; int& operator[](int); int operator[](int) const; Dept. of Computer Science, Sogang Univ. 33

예비보고서에추가되어야할내용 다음을명확하게설명하라. OOP 객체 클래스 인스턴스 OOP를쓰는이유 상속 Dept. of Computer Science, Sogang Univ.