강의자료3

27
제 2 제 제제제제제 제제

Upload: young-wook-kim

Post on 15-Dec-2014

320 views

Category:

Documents


1 download

DESCRIPTION

 

TRANSCRIPT

Page 1: 강의자료3

제 2 장자료설계와 구현

Page 2: 강의자료3

2

Data Abstraction ( 자료 추상화 )

Separation of a data type’s logical properties from its implementation.( 자료형의 논리적인 성질을 구현으로부터 분리 )

LOGICAL PROPERTIES IMPLEMENTATION

What are the possible values? How can this be done in C++? - domainWhat operations will be needed? How can data types be used?

Page 3: 강의자료3

3

APPLICATION

0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1

REPRESENTATION

Data Encapsulation ( 자료 캡슐화 )

The representation of data is surrounded 정보은닉을 해 주는 프로그래밍 언어의 특성 자료의 표현을 이의 응용으로부터 분리 User of data does not see the implementation Deals with the data only in terms of logical properties 부적절한 자료 사용을 배제하기 위한 보호막

int y;y = 25;

Page 4: 강의자료3

4

Encapsulated C++ Data Type int

Value range: INT_MIN . . INT_MAX

Operations: + prefix - prefix + infix - infix * infix / infix % infixRelational Operators infix

TYPE int

(inside)

Representation of

int

as 16 bits two’s complement

+

Implementation of Operations

Page 5: 강의자료3

5

Abstract Data Type (ADT)

A data type whose properties (domain and operations) are specified independently of any particular implementation.

자료와 이 자료에 대한 연산들을 명시한 자료형 ; 구현방법은 명시하지 않음

자료와 이 자료에 대한 연산들의 명세를 자료의 표현과 연산의 구현으로부터 분리시킨 데이타 타입

명세 (specification) 와 구현 (representation, implementation) 의 분리가 핵심개념

사용자 정의 데이타 타입

Page 6: 강의자료3

6

Application (or user) level: modeling real-life data in a specific context.

Logical (or ADT) level: abstract view of the domain and operations. Implementation level: specific representation of the

structure to hold the data items, and the coding for operations.

Data from 3 different levels

WHAT

HOW

Page 7: 강의자료3

추상 데이타 타입과 C++ 클래스

C++ 는 명세와 구현을 구별하고 사용자로 부터 ADT 의 구현을 은닉하기 위해 클래스 (class) 제공

C++ 클래스의 구성

(1) 클래스 이름 : ( 예 : Rectangle)

(2) 데이타 멤버 : 데이타 ( 예 : xLow, yLow, height, width)

(3) 멤버 함수 : 연산의 집합 ( 예 : GetHeight(), GetWidth())

(4) 프로그램 접근 레벨 : 멤버 및 멤버함수 공용 (public), 보호 (protected), 전용 (private)

public: 프로그램 어디에서도 접근 private: 같은 클래스 내 , friend 로 선언된 함수나 클래스에 의해 접근 protected: 같은 클래스 내 , 서브클래스 , friend 에 의해서만 접근

7

Page 8: 강의자료3

C++ 에서의 데이타 추상화와 캡슐화 (1) 데이타 멤버

한 클래스의 모든 데이타 멤버를 private( 전용 ) 또는 protected( 보호 ) 로 선언 데이타 캡슐화

멤버 함수 외부에서 데이타 멤버에 접근할 필요가 있는 경우 외부에서 기동될 것 : public 으로 선언 나머지 : private 나 protected 로 선언

( 다른 멤버 함수에서 호출 ) C++ 에서는 멤버함수의 구현을 클래스 정의 내에 포함

가능 인라인 (inline) 함수로 처리

8

Page 9: 강의자료3

9

Use of C++ data type class

Variables of a class type are called objects (or instances) of that particular class.

Software that declares and uses objects of the class is called a client.

Client code uses public member functions (called methods in OOP) to handle its class objects.

Sending a message means calling a public member function.

Page 10: 강의자료3

C++ 에서의 데이타 추상화와 캡슐화 (2)

클래스 연산의 명세와 구현의 분리 명세 부분에서 함수 프로토타입 ( 함수 이름 , 인자 타입 ,

결과 타입 ) 정의 헤더 화일

( 예 ) Rectangle.h 파일 함수의 기능 기술 : 주석 (comment) 을 이용 함수의 구현 : 같은 이름의 소스 화일에 저장

( 예 ) Rectangle.cpp 파일

10

Page 11: 강의자료3

11

Information Hiding

Class implementation details are hidden from the client’s view. This is called information hiding.

Public functions of a class provide the interface between the client code and the class objects.

clientcode

specification implementation

abstraction barrier

Page 12: 강의자료3

클래스 객체의 선언과 멤버 함수의 기동 클래스 객체 : 변수와 똑같이 선언되고 생성됨 객체 멤버들에 대한 접근 /기동

점 (.) : 직접 구성 요소 선택 화살표 (->) : 포인터를 통한 간접 구성 요소 선택

12

// 소스화일 main.cpp 속에#include <iostream> #include "Rectangle.h"main() {

Rectangle r, s; // r 과 s 는 Class Rectangle 의 객체들이다 .

Rectangle *t = &s; // t 는 클래스 객체 s 에 대한 포인터이다 .

.

.// 클래스 객체의 멤버를 접근하기 위해서는 점 (.) 을 사용한다 .// 포인터를 통해 클래스 객체의 멤버를 접근하기 위해서는 를 사용한다 .

if (r.GetHeight()*r.GetWidth() > tGetHeight() * tGetWidth()) cout << " r ";else cout << " s ";cout << "has the greater area" << endl;

}어떻게 Rectangle 객체가 선언되고 멤버 함수가 기동되는가를 예시하는 C++ 코드 부분

Page 13: 강의자료3

생성자 (constructor) 와 파괴자 (destructor) 생성자와 소멸자 : 클래스의 특수한 멤버 함수 생성자

한 객체의 데이타 멤버들을 초기화 클래스 객체가 만들어질 때 자동적으로 실행 해당 클래스의 공용 멤버 함수로 선언 공용 멤버 함수로 선언 생성자 이름은 클래스의 이름과 동일

13

Rectangle::Rectangle(int x, int y, int h, int w){

xLow = x; yLow = y;height = h; width = w;

}

Rectangle 클래스의 생성자 정의

Page 14: 강의자료3

생성자 (constructor) 와 파괴자 (destructor) 생성자를 이용한 Rectangle 객체 초기화

Rectangle 클래스의 세련된 생성자 정의

데이터 멤버들이 멤버 초기화 리스트에 의해 초기화 보다 효율적

14

Rectangle r(1,3,6,6);

Rectangle *s = new Rectangle(0,0,3,4);

Rectangle t; // 컴파일 시간 오류 ! 생성자 필요

Rectangle::Rectangle (int x = 0, int y = 0, int h = 0, int w = 0): xLow(x), yLow(y), height(h), width(w){ }

Page 15: 강의자료3

생성자 (constructor) 와 소멸자 (destructor)

소멸자 객체가 없어지기 직전 데이타 멤버들을 삭제 클래스 객체가 범위를 벗어나거나 삭제될 때

자동적으로 기동 해당 클래스의 공용 멤버로 선언 이름은 클래스 이름과 동일 , 단 앞에 틸데 (~) 붙임 반환 타입이나 반환 값을 명기해서도 안되고 인자를

받아서도 안됨 삭제되는 객체의 한 데이타 멤버가 다른 객체에 대한

포인터인 경우 포인터에 할당된 기억장소는 반환 지시되는 객체는 삭제되지 않음

명시적으로 수행하는 소멸자를 정의해야 됨

15

Page 16: 강의자료3

연산자 다중화 (operator overloading) C++ 는 특정 데이터 타입을 위한 연산자를 구현하는

정의를 허용 이를 통해 사용자 정의 데이터 타입에 대한 연산자

다중화 허용 클래스 멤버 함수나 보통의 함수 형식 사용될 함수 프로토타입은 특정 연산자의 명세와

일치해야 됨

( 예 ) 연산자 == 두 실수 (float) 데이타의 동등성 검사 두 정수 (int) 데이타의 동등성 검사 두 사각형 (Rectangle) 객체 동등성 비교 : 연산자 다중화 필요

- 같은 객체- 위치와 크기가 같은 사각형

16

Page 17: 강의자료3

연산자 다중화 (operator overloading) Class Rectangle 을 위한 연산자 == 의 다중화

this: 멤버 함수를 기동 시킨 특정 클래스 객체에 대한 포인터 (self)

*this: 클래스 객체 자신 비교과정

두 피연산자가 동일 객체이면 결과는 true ( this == &s ) 아니면 데이터 멤버를 개별적으로 비교하여 모두 동일하면 결과는

true 아니면 결과는 false

17

bool Rectangle::operator==(const Rectangle & s ){ if (this == &s) return true; if ((xLow == s.xLow) && (yLow == s.yLow) && (height == s.height) && (width==s.width) return true; else return false; }

Page 18: 강의자료3

연산자 다중화 (operator overloading) class Rectangle 을 위한 << 연산자의 다중화

클래스 Rectangel 의 전용 데이터 멤버에 접근 Rectangle 의 friend 로 만들어져야 됨

cout << r 의 출력 예 r 의 왼쪽하단 좌표가 1,3 이고 한변이 6 인경우 )

Position is: 1 3Height is: 6Width is: 6

18

ostream& operator << (ostream& os, Rectangle& r){ os << "Position is: “ << r.xLow << " "; os << r.yLow < endl; os << "Height is: “ << r.height << endl; os << "Width is: "r.width << endl; return os;}

Page 19: 강의자료3

기타 내용 C++ 의 struct

묵시적 접근 레벨 = public(cf. class 에서는 private)

C 의 struct 에 대한 일반화( 멤버 함수도 정의 가능 )

union 제일 큰 멤버에 맞는 저장장소 할당 보다 효율적으로 기억장소 사용

static( 정적 ) 클래스 데이타 멤버 클래스에 대한 전역 변수 : 오직 하나의 사본 모든 클래스 객체는 이를 공유 정적 데이타 멤버는 클래스 외부에서 정의

19

Page 20: 강의자료3

ADT 와 C++ 클래스 ADT 와의 차이

C++ 의 일부 연산자들은 해당 클래스의 멤버 함수로 존재하지 않음

보통의 C++ 함수로 외부에서 선언 ( 해당 클래스에서 friend 선언 )

20

Page 21: 강의자료3

추상 데이타 타입으로서의 배열 일련의 연속적인 메모리 위치 : 구현 중심 < 인덱스 , 값 >: <index,value> 의 쌍 집합

index -> value : 대응 (correspondence) 또는 사상 (mapping)

same data type C++ 배열

인덱스 집합이 0 부터 시작 배열의 인덱스 범위를 확인하지 않음

( 예 ) float floatArray[n]; i 번째 원소값 : floatArray[i], *(floatArray+i)

함수 GeneralArray(int j, RangeList list, float initValue=defaultValue) Retrieve(index) Store(index, item)

21

Page 22: 강의자료3

다항식 추상 데이타 타입 순서 리스트 , 선형 리스트

examples 한 주일의 요일 : ( 일 , 월 , 화 , 수 , .., 토 ) 카드 한 벌의 값 : (Ace, 2, 3, 4, 5, 6, 7, 8, 9, 10, Jack, Queen, King) 건물 층 : ( 지하실 , 로비 , 일층 , 이층 ) 미국의 제 2 차 세계대전 참전년도 : (1941, 1942, 1943, 1944, 1945) 스위스의 제 2 차 세계대전 참전년도 : ()

리스트 형태 : (a0, a1, ... , an-1)

공백 리스트의 예 : ()

22

Page 23: 강의자료3

순서 리스트 , 선형 리스트 리스트에 대한 연산

리스트의 길이 n 의 계산 리스트의 항목을 왼쪽에서 오른쪽 ( 오른쪽에서 왼쪽 ) 으로 읽기 리스트로부터 i 번째 항목을 검색 , 0≤i<n 리스트의 i 번째 항목을 대체 , 0≤i<n 리스트의 i 번째 위치에 새 항목 삽입 , 0≤i<n 이것은 원래 i, i+1,…., n-1 항목 번호를 i+1, i+2, …. , n 으로 만듦 리스트의 i 번째 항목을 제거 , 0≤i<n 이것은 원래 i+1, ….., n-1

항목 번호를 i, i+1, …., n-2 로 만듦

순서 리스트의 일반적인 구현 배열을 이용

인덱스 iai, 0 i < n ... i, i+1, ... ... ai, ai+1, ... 순차 사상 (sequential mapping) 문제점 : 삽입 , 삭제시 오버헤드

23

Page 24: 강의자료3

배열의 표현

배열 원소 a[i1][i2],…,[in] 의 1 차원 배열 위치로의 변환 ( 예 ) a[0][0][0][0] ⇒ 위치 0 a[0][0][0][1] ⇒ 위치 1 a[1][2][1][1] ⇒ 위치 23

1 차원 배열 a[u1] : a[0] 의 주소 임의의 원소 a[i] 의 주소 : +i

24

배열 원소 a[0] a[1] ... a[i] ... a[u1-1]

주소 +1 ... +i ... +u1-1

a[u1] 의 순차적인 표현

Page 25: 강의자료3

배열의 표현 2 차원 배열

:a[0][0] 의 주소 a[i][0] 의 주소 : +i*u2

a[i][j] 의 주소 : +i*u2+j

25

x x … xx x … xx x … x

x x … x

col0 col1 col u2-lrow 0

row 1

row u1 -1

(a)

u2

elementu2

element

row 0 row 1

......row i

i*u2 element

(b)

a[u1][u2] 의 순차적 표현

row ui-1row 2

Page 26: 강의자료3

배열의 표현 3 차원 배열

;A[0][0][0] 의 주소 A[i][0][0] 의 주소 : +i A[i][j][k] 의 주소 : + iu2u3 + ju3 + k

26

u2

u3

u1

(a) 3 차원 배열 A[u1][u2][u3] 가 u1 개의 2 차원 배열로 취급됨

Page 27: 강의자료3

다차원 배열의 표현

27

n 차원 배열 a[u1][u2]…,[un] ; A[0][0],…,[0] 의 주소 a[i1][i2][0],…,[0] 의 주소 : +i1u2u3 …un

a[i1][i2][0],…,[0] 의 주소 : + i1u2u3 … un+ u3 + i2u2u3 … un

a[i1][i2],…,[in] 의 주소

i u2u3 elements

A(0,u2,u3) A(1,u2,u3)

...

A(u1-1,u2,u3)

(b) 3 차원 배열의 순차 행 우선 표현

n

jjjai

1

여기서

A(1,u2,u3)

...

1

1,1

n

n

jkkj

a

njua