강의자료3
DESCRIPTION
TRANSCRIPT
제 2 장자료설계와 구현
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?
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;
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
5
Abstract Data Type (ADT)
A data type whose properties (domain and operations) are specified independently of any particular implementation.
자료와 이 자료에 대한 연산들을 명시한 자료형 ; 구현방법은 명시하지 않음
자료와 이 자료에 대한 연산들의 명세를 자료의 표현과 연산의 구현으로부터 분리시킨 데이타 타입
명세 (specification) 와 구현 (representation, implementation) 의 분리가 핵심개념
사용자 정의 데이타 타입
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
추상 데이타 타입과 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
C++ 에서의 데이타 추상화와 캡슐화 (1) 데이타 멤버
한 클래스의 모든 데이타 멤버를 private( 전용 ) 또는 protected( 보호 ) 로 선언 데이타 캡슐화
멤버 함수 외부에서 데이타 멤버에 접근할 필요가 있는 경우 외부에서 기동될 것 : public 으로 선언 나머지 : private 나 protected 로 선언
( 다른 멤버 함수에서 호출 ) C++ 에서는 멤버함수의 구현을 클래스 정의 내에 포함
가능 인라인 (inline) 함수로 처리
8
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.
C++ 에서의 데이타 추상화와 캡슐화 (2)
클래스 연산의 명세와 구현의 분리 명세 부분에서 함수 프로토타입 ( 함수 이름 , 인자 타입 ,
결과 타입 ) 정의 헤더 화일
( 예 ) Rectangle.h 파일 함수의 기능 기술 : 주석 (comment) 을 이용 함수의 구현 : 같은 이름의 소스 화일에 저장
( 예 ) Rectangle.cpp 파일
10
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
클래스 객체의 선언과 멤버 함수의 기동 클래스 객체 : 변수와 똑같이 선언되고 생성됨 객체 멤버들에 대한 접근 /기동
점 (.) : 직접 구성 요소 선택 화살표 (->) : 포인터를 통한 간접 구성 요소 선택
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++ 코드 부분
생성자 (constructor) 와 파괴자 (destructor) 생성자와 소멸자 : 클래스의 특수한 멤버 함수 생성자
한 객체의 데이타 멤버들을 초기화 클래스 객체가 만들어질 때 자동적으로 실행 해당 클래스의 공용 멤버 함수로 선언 공용 멤버 함수로 선언 생성자 이름은 클래스의 이름과 동일
13
Rectangle::Rectangle(int x, int y, int h, int w){
xLow = x; yLow = y;height = h; width = w;
}
Rectangle 클래스의 생성자 정의
생성자 (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){ }
생성자 (constructor) 와 소멸자 (destructor)
소멸자 객체가 없어지기 직전 데이타 멤버들을 삭제 클래스 객체가 범위를 벗어나거나 삭제될 때
자동적으로 기동 해당 클래스의 공용 멤버로 선언 이름은 클래스 이름과 동일 , 단 앞에 틸데 (~) 붙임 반환 타입이나 반환 값을 명기해서도 안되고 인자를
받아서도 안됨 삭제되는 객체의 한 데이타 멤버가 다른 객체에 대한
포인터인 경우 포인터에 할당된 기억장소는 반환 지시되는 객체는 삭제되지 않음
명시적으로 수행하는 소멸자를 정의해야 됨
15
연산자 다중화 (operator overloading) C++ 는 특정 데이터 타입을 위한 연산자를 구현하는
정의를 허용 이를 통해 사용자 정의 데이터 타입에 대한 연산자
다중화 허용 클래스 멤버 함수나 보통의 함수 형식 사용될 함수 프로토타입은 특정 연산자의 명세와
일치해야 됨
( 예 ) 연산자 == 두 실수 (float) 데이타의 동등성 검사 두 정수 (int) 데이타의 동등성 검사 두 사각형 (Rectangle) 객체 동등성 비교 : 연산자 다중화 필요
- 같은 객체- 위치와 크기가 같은 사각형
16
연산자 다중화 (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; }
연산자 다중화 (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;}
기타 내용 C++ 의 struct
묵시적 접근 레벨 = public(cf. class 에서는 private)
C 의 struct 에 대한 일반화( 멤버 함수도 정의 가능 )
union 제일 큰 멤버에 맞는 저장장소 할당 보다 효율적으로 기억장소 사용
static( 정적 ) 클래스 데이타 멤버 클래스에 대한 전역 변수 : 오직 하나의 사본 모든 클래스 객체는 이를 공유 정적 데이타 멤버는 클래스 외부에서 정의
19
ADT 와 C++ 클래스 ADT 와의 차이
C++ 의 일부 연산자들은 해당 클래스의 멤버 함수로 존재하지 않음
보통의 C++ 함수로 외부에서 선언 ( 해당 클래스에서 friend 선언 )
20
추상 데이타 타입으로서의 배열 일련의 연속적인 메모리 위치 : 구현 중심 < 인덱스 , 값 >: <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
다항식 추상 데이타 타입 순서 리스트 , 선형 리스트
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
순서 리스트 , 선형 리스트 리스트에 대한 연산
리스트의 길이 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
배열의 표현
배열 원소 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] 의 순차적인 표현
배열의 표현 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
배열의 표현 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 차원 배열로 취급됨
다차원 배열의 표현
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