Programming hwp

Similar documents
K&R2 Reference Manual 번역본

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

PowerPoint Template

C++ Programming

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - Chapter 6.ppt

설계란 무엇인가?

Slide 1

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

Microsoft PowerPoint - C++ 5 .pptx

C++ Programming

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

쉽게 풀어쓴 C 프로그래밍

PowerPoint Template

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

프로그램을 학교 등지에서 조금이라도 배운 사람들을 위한 프로그래밍 노트 입니다. 저 역시 그 사람들 중 하나 입니다. 중고등학교 시절 학교 도서관, 새로 생긴 시립 도서관 등을 다니며 책을 보 고 정리하며 어느정도 독학으르 공부하긴 했지만, 자주 안하다 보면 금방 잊어

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

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

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

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

C프로-3장c03逞풚

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

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

C++ Programming

쉽게 풀어쓴 C 프로그래밍

<4D F736F F F696E74202D2036C0CFC2B05FB0B4C3BCC1F6C7E2C7C1B7CEB1D7B7A1B9D62E707074>

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

C++ Programming

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

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

슬라이드 1

chap10.PDF

Microsoft PowerPoint - CSharp-10-예외처리

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

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

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

No Slide Title

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

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 프레젠테이션

03장.스택.key

chap 5: Trees

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

Programming hwp

Microsoft PowerPoint - Chap12-OOP.ppt

PowerPoint Presentation

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

PowerPoint 프레젠테이션

Microsoft PowerPoint - ch07 - 포인터 pm0415

Microsoft PowerPoint - [2009] 02.pptx

Slide 1

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

The C++ Programming Language 4 장타입과선언 4.11 연습문제 Hello,world! 프로그램을실행시킨다. 프로그램이컴파일되지않으면 B3.1 을참고하자. #include<iostream> //#include 문, 헤더파일, 전처리지시

쉽게 풀어쓴 C 프로그래밍

초보자를 위한 C++

PowerPoint Presentation

13주-14주proc.PDF

PowerPoint Template

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

Microsoft PowerPoint - java1-lab5-ImageProcessorTestOOP.pptx

Microsoft PowerPoint - 2강

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

Chapter 6 Objects and Classes

02 C h a p t e r Java

Microsoft PowerPoint - chap06-2pointer.ppt

untitled

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

JAVA PROGRAMMING 실습 08.다형성

06장.리스트

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CC0E7B0EDB0FCB8AE5C53746F636B5F4D616E D656E74732E637070>

Microsoft PowerPoint - 6주차.pptx

예제 2) Test.java class A intvar= 10; void method() class B extends A intvar= 20; 1"); void method() 2"); void method1() public class Test 3"); args) A

PowerPoint Presentation

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

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

Slide 1

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

쉽게 풀어쓴 C 프로그래밍

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

슬라이드 1

Chapter 4. LISTS

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

C++ 기본문법 정리

Blog

Microsoft PowerPoint - chap11

설계란 무엇인가?

Programming hwp

Microsoft PowerPoint - ch10 - 이진트리, AVL 트리, 트리 응용 pm0600

class Sale void makelineitem(productspecification* spec, int qty) SalesLineItem* sl = new SalesLineItem(spec, qty); ; 2. 아래의액티비티다이어그램을보고 Java 또는 C ++,

PowerPoint 프레젠테이션

03_queue

The C++ Programming Language 5 장포인터, 배열, 구조체 5.9 연습문제 다음의선언문을순서대로작성해보자. 문자에대한포인터, 10개정수의배열, 10개정수의배열의참조자, 문자열의배열에대한포인터, 문자에대한포인터에대한포인터, 상수정수, 상수

설계란 무엇인가?

Microsoft PowerPoint - java2 [호환 모드]

PowerPoint 프레젠테이션

1. 기본형의형변환복습 C/C++ 형변환의종류 자동형변환 ( 묵시적형변환 ) 강제형변환 ( 명시적형변환 ) 기본형의자동형변환의예 1. 배열 to 포인터변환 배열명은해당배열의첫번째원소의 주소로변환됨 int ary[10]; int *pary = ary; 2. 함수 to 포

PowerPoint Presentation

Chapter 4. LISTS

슬라이드 1

17장 클래스와 메소드

Transcription:

// 현재노드다음에포인터 p 가가리키는노드를삽입한다. void Dlink::insert(Dlink* p) { p->succ = succ; // (1) p->pred = this; // (2) succ->pred = p; // (3) succ = p; // (4) 2.7 상속 (inheritance) 새로운클래스 B를정의해야하는데기존의클래스중유사한기능의클래스 A가있다고하자. 이경우클래스 A를위한코드를활용할수있는데, 이를코드재사용 (code reuse) 이라고한다. 전통적인코드재사용방식은소스코드를편집하여새로필요한코드를만드는것인데, 이경우편집과정에서기존의올바른코드를잘못수정할수도있고, 버전관리문제도발생할수있다. 객체지향프로그래밍을지원하는언어들에서는코드재사용을위해클래스사이의상속기능을제공한다. 앞에서예로들고있는경우, 클래스 A가가지고있는데이터멤버나멤버함수를클래스 B에서상속받아사용하며, 클래스 A에없는부분만추가하거나일부멤버함수들을재정의하는등의방법을사용한다. 이경우기존클래스 A의내용은전혀수정하지않으며, 일반적으로클래스선언부만참조하고클래스구현부의함수정의코드는소스형태로는볼필요조차없다. 상속은소스편집방식에비해훨씬안전하고간편한코드재사용방식으로평가되고있다. C++ 에서클래스를상속받아정의하는것을파생 (derivation) 이라고한다. 파생에서원래의클래스를기본클래스 (base class) 또는부모클래스 (parent class) 라고한다. 새로정의되는클래스는파생클래스 (derived class) 또는자식클래스 (child class) 라고한다. 부모클래스, 부모클래스의부모클래스,... 등을조상클래스라고부르며, 반대의관계에있는클래스는자손클래스로부른다. 상속의예 먼저기본클래스로사용될클래스 List를정의한다. List 객체는여러개의숫자들의목록을나타내며, 이를위해숫자들을저장할배열 array[] 와배열안에들어있는숫자의개수를나타내는변수 count를두고있다. List 클래스의기본생성자함수는 count를 0으로초기화한다. 소멸자는하는일이전혀없으며, 따라서필요하지도않지만그냥두고있다. Insert(x, pos) 함수는숫자 x를 pos를인덱스로하는위치에끼워넣는데, 이를위해원래 pos 이후의위치에들어있던숫자들을한칸씩뒤로이동시킨다. Get(pos) 은 pos위치에있는값을리턴하며, Size() 는현재의숫자개수를리턴한다. - 45 -

#include <iostream> using namespace std; class List { int int array[100]; count; public: List(): count(0) { // count is set to 0 ~List() { void Insert(int x, int pos) { for (int i = count; i > pos; i--) array[i] = array[i - 1]; array[pos] = x; count++; int Get(int pos) { return array[pos]; ; int Size() { return count; void main() { List list; for (int i = 0; i < 10; i++) list.insert(i, i); list.insert(100, 5); list.insert(200, 7); list.insert(300, 0); // list: 300 0 1 2 3 4 100 5 200 6 7 8 9 for (i = 0; i < list.size(); i++) cout << list.get(i) << endl; 위의 List 클래스에아래두가지기능을추가하여새로운클래스 SortedList를정의하려고한다. (1) 숫자들의목록이정렬된순서를유지할수있게숫자를끼워넣는삽입함수 SortedInsert() 를둔다. (2) 목록안의숫자들의합을구하는일이자주일어난다고하자. 합이필요할때마다목록안의모든숫자들의합을새로계산하는대신, 합을나타내는변수를두고매번숫자가삽입될때마다이변수를갱신한다. SortedList 클래스를처음부터새로정의하는대신이미만들어진 List 클래스를상속받 - 46 -

아목록표현을위한데이터멤버, 그리고멤버함수들을활용하는방식으로만든다. 먼저위의두가지기능중첫번째기능만먼저추가해보자. class SortedList: public List { public: SortedList():List() { SortedInsert(int x) { int i, v; ; i = 0; do { v = Get(i); if (v < x) i++; while (v < x && i < Size()); Insert(x, i); List 클래스자체에는아무변경도일어나지않으며, 단지 List 클래스의바탕위에새로운클래스 SortedList를정의한다. 상속의표현은다음과같은형식으로표시된다. derived-class : public base-class 파생클래스는기본클래스의전체데이터멤버를상속받지만, 기본클래스의 private 멤버에직접접근할수는없다. 필요할경우기본클래스에서제공되는 public 또는 protected 가시성을갖는멤버함수를통한접근만이가능하다. 멤버함수의경우 private 가시성을갖는함수이외의다른함수들을상속받는다. 상속표현에서콜론 (:) 기호다음에는가시성을나타내는 public, protected, private 중의하나를사용한다. public의의미는기본클래스에서상속받은 (public, protected) 멤버들의가시성을파생클래스에서도그대로유지한다는의미이며, 대부분의상속에서는 public을사용한다. protected를사용하면기본클래스에서상속받은 (public, protected) 멤버들의가시성이파생클래스에서는 protected가된다. private를사용하면기본클래스에서상속받은 (public, protected) 멤버들의가시성이파생클래스에서는 private가된다. 이상속에서파생클래스 SortedList의기본클래스는 List이다. 생성자함수의헤딩뒤에기본클래스생성자함수호출이올수있다. - 47 -

아래다이어그램이위의상속관계를표현한다. 합계산기능의보완을반영하여완성된 SortedList 클래스는아래와같다. class SortedList: public List { private: int total; public: SortedList(): List(), total(0) { void Insert(int x, int pos) { total += x; List::Insert(x, pos); int GetTotal() { return total; SortedInsert(int x) { int i, v; ; i = 0; do { v = Get(i); if (v < x) i++; while (v < x && i < Size()); Insert(x, i); - 48 -

파생클래스인 SortedList 안의 Insert() 함수는 List 클래스와동일한파라미터를갖는다. 따라서이는 List 클래스에서상속받은 Insert() 를대체하게되며, 이를멤버함수재정의 (overriding) 이라고한다. SortedList의 Insert() 함수안에서기본클래스에서정의된 Insert() 함수를호출하기위해서는함수이름앞에소속클래스를지정하기위한 List:: 표현이필요하다. SortedInsert() 함수끝의 Insert() 함수는 SortedList::Insert() 함수이다. 2.8 가상함수 (virtual function) 이절의예제코드에서는 4개의클래스가아래왼쪽그림과같이상속관계에의한계층구조를형성하고있으며, 각클래스의객체구조는아래오른쪽그림과같다. 클래스상속계층구조 클래스객체구조 main() 함수에서는위의각클래스의객체들을정의하고이들의 next 필드를사용하여연결리스트를아래그림과같이구성하고있다. &e 각클래스마다객체구조를구성하는데이터멤버들이다르며, 이들클래스안에각기정의되어있는멤버함수 print() 에서는각자의객체구조에포함된내용을출력하고있다. 함수 print_list() 에서는위의연결리스트의각노드에대해 print() 함수를적용하고있는데, ll->print() 라는함수호출에서 ll의타입은 (employee *) 이지만, ll이가리키는객체의실제타입은각노드마다다르다. 이때실제노드유형에맞는 print() 함수를사용할것인가, 또는포인터변수 ll의타입에따라항상 employee 클래스의 print() 함수를사용할것인가는 print() 함수가일반멤버함수인지, 가상함수인지에따라달라진다. - 49 -

아래의코드에서는 print() 함수를정의하고있는가장상위의클래스인 employee에서 print() 함수선언에 virtual이라는키워드를사용하고있고, 이는이함수가가상함수임을나타낸다. print() 함수의경우와같이가상함수로선언되어있고, 또포인터변수를통해그함수를호출하고있을경우에는실제객체의타입에맞는함수가불려나오게된다. 따라서 print_list() 함수의출력결과는다음과같게된다. K. Lee salary: 10000 Gwangsoo level 10 dept: Sales G. Rhee level 9 J. Brown 만일 print() 함수가가상함수가아니었다면 print_list() 함수안에서매번호출되는 print() 함수는이름만출력하는 employee::print() 이었을것이며, 그경우출력결과는아래와같게되었을것이다. K. Lee Gwangsoo G. Rhee J. Brown 예제코드 #include <iostream> using namespace std; struct employee { employee* next; char* name; virtual void print(); ; void employee::print() { cout << name << " n"; struct manager : public employee { int level; void print(); ; - 50 -

void manager::print() { employee::print(); cout << " tlevel " << level << " n"; struct director : public manager { char* dept; void print(); ; void director::print() { manager::print(); cout << " tdept: " << dept << " n"; struct worker : public employee { double salary; void print(); ; void worker::print() { employee::print(); cout << " tsalary: " << salary << " n"; void print_list(employee* ll) { for (; ll; ll = ll->next) ll->print(); void main() { employee e; e.name = "J. Brown"; e.next = 0; manager m; m.name = "G. Rhee"; m.level = 9; m.next = &e; director d; d.name = "Gwangsoo"; d.level = 10; d.dept = "Sales"; d.next = &m; worker w; w.name = "K. Lee"; - 51 -

w.salary = 10000; w.next = &d; print_list(&w); cout << " n"; m = d; m.print(); e = d; e.print(); 상속관계에있는클래스의객체들을가리키는포인터의경우자손클래스객체에대한포인터값을조상클래스포인터변수에저장하는것은일반적으로허용되며, 이때조상클래스포인터변수가가리키는자손클래스객체는원래의객체구조를그대로유지한다. 포인터변수가아니라객체를나타내는변수들의경우에도자손클래스객체를조상클래스객체변수에저장하는것은일반적으로허용된다. 그러나이경우조상클래스가갖고있는데이터멤버의수가자손클래스보다적으며, 자손클래스에만나타나는데이터멤버들은이과정에서없어진다. 따라서이결과로자손클래스객체는조상클래스객체로변환되며, 아래그림에서이러한예두개를보이고있다. ( 위의 main() 함수의마지막부분참고 ) 이경우 m.print() 나 e.print() 는원래객체가소속된 director 클래스의 print() 함수대신각기 manager 클래스나 employee 클래스의 print() 함수가호출되며, 그출력결과는다음과같다. Gwangsoo level 10 Gwangsoo 참고로반대방향의저장, 즉, 조상클래스객체를자손클래스객체변수에저장하는것은일반적으로허용되지않는다. 만일그와같은값의저장이허용될경우오른쪽그림과같은상황이될텐데, 이경우 d의 dept 필드가정의되지않음을유의하라. 다시정리하자면, 상속관계에있는클래스들에서재정의되어있는멤버함수에대해각객체에맞는클래스의멤버함수를이용할수있기위해서는그멤버함수가가상함수로선언되어있어야하며, 또한함수호출이상위클래스포인터를통해이루어져야한다. - 52 -

2.9 기타 2.9.1 템플릿 (template) 템플릿은일종의메타클래스 ( 클래스의클래스 ) 이다. 클래스를바탕으로객체변수들이만들어지는것과마찬가지로, 템플릿을바탕으로클래스들이만들어진다. 템플릿에의해서만들어지는클래스들은구성원소의데이터타입만다를뿐알고리즘은동일하다예를들어, char를저장하는스택을클래스로구현했다면, 여기에 int나 double을저장할수없다. int나 double을저장하는스택도각각클래스로구현했다면이들클래스는저장하는데이터타입인 char, int, double만다를뿐소스코드는스택알고리즘이므로동일할것이다. 이경우, 스택을템플릿클래스로구현하고, 이템플릿클래스를가지고필요에따라 char, int, double 등의데이터를저장하는클래스를자동으로생성하여사용할수있다. 즉템플릿클래스란특정데이터타입과무관하게만들어진메타클래스이다. 그때그때필요한데이터타입을템플릿파라미터로전달하여템플릿클래스로부터실제클래스를생성하여사용한다. #include <iostream> using namespace std; template <class T> class Stack { T store[100]; int top; public: Stack(); void push(t val); T pop(); ; template <class T> Stack<T>::Stack() : top(0) { template <class T> void Stack<T>::push(T val) { store[top++] = val; template <class T> T Stack<T>::pop() { return store[--top]; - 53 -

void main() { Stack<int> istack; istack.push(3); istack.push(5); istack.push(7); cout << istack.pop(); cout << istack.pop(); cout << istack.pop() << endl; Stack<char *> sstack; sstack.push("abc"); sstack.push("pqr"); sstack.push("xyz"); cout << sstack.pop(); cout << sstack.pop(); cout << sstack.pop() << endl; 753 XYZPQRABC 템플릿은아래예에서와같이함수정의에도적용될수있다. #include <iostream> using namespace std; template <class T> void swappy(t& x, T& y) { T t; t = x, x = y, y = t; void main() { int a = 3, b= 5; swappy(a, b); cout << a << ", " << b << endl; double p = 3.3, q = 5.5; swappy(p, q); cout << p << ", " << q << endl; 5, 3 5.5, 3.3 2.9.2 C++ 키워드 C/C++ 공통 (33 개 ) C++ 전용 (15개) 최근추가된 C++ 전용 (25개) asm auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while catch class delete friend inline new operator private protected public template this throw try virtual and_eq alignof bitand char16_t char32_t compl constexpr const_cast decltype dynamic_cast explicittodo false mutable noexcept not_eq nullptr or_eq reinterpret_cast static_assert static_cast thread_local typeid wchar_t xor_eq true - 54 -

연습문제 1. C 의 struct 와 C++ struct 의가장중요한차이점은무엇인가? 2. C++ 언어에서 struct 와 class 의차이는무엇인가? 3. 가시성수식어 public, protected, private 를구분하여설명하라. 4. C++ 컴파일러가만들어주는기본생성자는어떤일들을하는가? 또어떤경우에 C++ 컴파일러가기본생성자를만들어주는가? 5. 멤버함수의가시성이 private 가될수있는지에대해논하라. 6. friend 메커니즘이란무엇인가? 7. 함수에대한오버로딩 (overloading) 과재정의 (overriding) 를구분하여설명하라. 8. 가상함수를설명하라. 9. (1) 전통적인코드재사용방법과객체지향적언어에서의 inheritance를사용할때의가장중요한차이점한가지를쓰라. (2) 전통적인방법을사용했을때발생할수있는가장큰문제점두가지를쓰라. 10. 아래의코드에서 Array 클래스는동적크기의정수배열을구현하는데, 그크기는 Array 객체생성시에정해진다. 이클래스정의는불완전한데, 이를완성시켜가기위해아래질문들에답하라. #include <iostream> using namespace std; class Array { int int *a; sz; public: Array (int size = 10); Array (Array& b); int get (int loc, int x); int put (int loc, int x); ; - 55 -

Array::Array (int size) { a = new int [sz = size]; Array::Array (Array& b) { copy (b); // return 1 on error; the result is passed through x int Array::get (int loc, int x) { if (loc >= 0 && loc < sz) { x = a[loc]; return 0; else return 1; // return 1 on error int Array::put (int loc, int x) { if (loc >= 0 && loc < sz) { a[loc] = x; return 0; else return 1; void main () { int n; Array a(5); a.put(0, 10); a.put(1, 20); a.put(2, 30); a.put(3, 40); Array b = a; b.get(3, n); cout << "n = " << n << " n"; b.put(4, 50); a = b; a.get(4, n); cout << "n = " << n << " n"; ( 가 ) 위의코드에서멤버함수 copy(b) 는 Array 객체 b의내용을복사하여현재의객체를만들도록정의하라. ( 나 ) 이클래스를위해적절한소멸자를정의하라. - 56 -

( 다 ) 이클래스를위해적절한 = 연산자를정의하라. ( 라 ) 멤버함수 get() 은기대대로동작하지않는다. 문제점을찾아설명하고, 함수를수정하라. ( 마 ) 함수 get() 을 Array 클래스의 friend 함수로만들기로결정하였다고하자. 이함수를다시정의하고, 클래스정의및 main() 함수에필요한변경을표시하라. ( 바 ) main() 함수에서 a.put(0.10) 등을 a[0] = 10 등으로, 그리고 a.get(4, n) 등은 n = a[4] 등과같이표시할수있도록하기위해, 클래스 Array에필요한내용을추가하라. 11. 아래의코드에서 Vector 클래스는 3차원벡터를나타낸다고하자. 아래의질문에따라 Vector 클래스를완성시키되, 가장간단하게구현하여야한다. #include <iostream> using namespace std; #include "Vector.h" int main() { Vector v1(2.0, 3.0, 4.0); Vector v2(5.2, -2.1, 4.3); cout << "v1 = " << v1 << endl; cout << "v1 + v2 = " << v1 + v2 << endl; return 0; v1 = [2, 3, 3] v1 + v2 = [7.2, 0.9, 0.9] ( 가 ) 위의프로그램의실행결과가우측하단의사각형에표시된것과같이될수있도록 Vector 클래스를정의하는헤더파일을작성하라. ( 나 ) Vector 클래스를구현하는 C++ 소스파일을작성하라. - 57 -