강의자료3

614 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
614
On SlideShare
0
From Embeds
0
Number of Embeds
6
Actions
Shares
0
Downloads
1
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

강의자료3

  1. 1. 제 2 장 자료설계와 구현
  2. 2. Data Abstraction ( 자료 추상화 ) <ul><li>Separation of a data type’s logical properties from its implementation. ( 자료형의 논리적인 성질을 구현으로부터 분리 ) </li></ul>LOGICAL PROPERTIES IMPLEMENTATION What are the possible values? How can this be done in C++? - domain What operations will be needed? How can data types be used?
  3. 3. Data Encapsulation ( 자료 캡슐화 ) <ul><li>The representation of data is surrounded </li></ul><ul><li>정보은닉을 해 주는 프로그래밍 언어의 특성 </li></ul><ul><li>자료의 표현을 이의 응용으로부터 분리 </li></ul><ul><li>User of data does not see the implementation </li></ul><ul><li>Deals with the data only in terms of logical properties </li></ul><ul><ul><li>부적절한 자료 사용을 배제하기 위한 보호막 </li></ul></ul>int y; y = 25; APPLICATION 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 REPRESENTATION
  4. 4. Encapsulated C++ Data Type int Value range: INT_MIN . . INT_MAX Operations: + prefix - prefix + infix - infix * infix / infix % infix Relational Operators infix TYPE int (inside) Representation of int as 16 bits two’s complement + Implementation of Operations
  5. 5. Abstract Data Type (ADT) <ul><li>A data type whose properties (domain and operations) are specified independently of any particular implementation. </li></ul><ul><li>자료와 이 자료에 대한 연산들을 명시한 자료형 ; 구현방법은 명시하지 않음 </li></ul><ul><li>자료와 이 자료에 대한 연산들의 명세를 자료의 표현과 연산의 구현으로부터 분리시킨 데이타 타입 </li></ul><ul><li>명세 (specification) 와 구현 (representation, implementation) 의 분리가 핵심개념 </li></ul><ul><li>사용자 정의 데이타 타입 </li></ul>
  6. 6. <ul><li>Application (or user) level: modeling real-life data in a specific context. </li></ul><ul><li>Logical (or ADT) level: abstract view of </li></ul><ul><li>the domain and operations. </li></ul><ul><li>Implementation level: specific representation of the structure to hold the data items, and </li></ul><ul><li>the coding for operations. </li></ul>Data from 3 different levels WHAT HOW
  7. 7. 추상 데이타 타입과 C++ 클래스 <ul><li>C++ 는 명세와 구현을 구별하고 사용자로 부터 ADT 의 구현을 은닉하기 위해 클래스 (class) 제공 </li></ul><ul><li>C++ 클래스의 구성 </li></ul><ul><ul><li>(1) 클래스 이름 : ( 예 : Rectangle ) </li></ul></ul><ul><ul><li>(2) 데이타 멤버 : 데이타 ( 예 : xLow , yLow , height , width ) </li></ul></ul><ul><ul><li>(3) 멤버 함수 : 연산의 집합 ( 예 : GetHeight (), GetWidth ()) </li></ul></ul><ul><ul><li>(4) 프로그램 접근 레벨 : 멤버 및 멤버함수 </li></ul></ul><ul><ul><ul><li>공용 (public), 보호 (protected), 전용 (private) </li></ul></ul></ul><ul><ul><ul><li>public: 프로그램 어디에서도 접근 </li></ul></ul></ul><ul><ul><ul><li>private: 같은 클래스 내 , friend 로 선언된 함수나 클래스에 의해 접근 </li></ul></ul></ul><ul><ul><ul><li>protected: 같은 클래스 내 , 서브클래스 , friend 에 의해서만 접근 </li></ul></ul></ul>
  8. 8. C++ 에서의 데이타 추상화와 캡슐화 (1) <ul><li>데이타 멤버 </li></ul><ul><ul><li>한 클래스의 모든 데이타 멤버를 private( 전용 ) 또는 protected( 보호 ) 로 선언 </li></ul></ul><ul><ul><li>  데이타 캡슐화 </li></ul></ul><ul><li>멤버 함수 </li></ul><ul><ul><li>외부에서 데이타 멤버에 접근할 필요가 있는 경우 </li></ul></ul><ul><ul><li>외부에서 기동될 것 : public 으로 선언 </li></ul></ul><ul><ul><li>나머지 : private 나 protected 로 선언 </li></ul></ul><ul><ul><li>( 다른 멤버 함수에서 호출 ) </li></ul></ul><ul><ul><li>C++ 에서는 멤버함수의 구현을 클래스 정의 내에 포함 가능  인라인 (inline) 함수로 처리 </li></ul></ul>
  9. 9. Use of C++ data type class <ul><li>Variables of a class type are called objects (or instances) of that particular class. </li></ul><ul><li>Software that declares and uses objects of the class is called a client. </li></ul><ul><li>Client code uses public member functions (called methods in OOP) to handle its class objects. </li></ul><ul><li>Sending a message means calling a public member function. </li></ul>
  10. 10. C++ 에서의 데이타 추상화와 캡슐화 (2) <ul><li>클래스 연산의 명세와 구현의 분리 </li></ul><ul><ul><li>명세 부분에서 함수 프로토타입 ( 함수 이름 , 인자 타입 , 결과 타입 ) 정의 </li></ul></ul><ul><ul><li> 헤더 화일 </li></ul></ul><ul><ul><li> ( 예 ) Rectangle.h 파일 </li></ul></ul><ul><ul><li>함수의 기능 기술 : 주석 (comment) 을 이용 </li></ul></ul><ul><ul><li>함수의 구현 : 같은 이름의 소스 화일에 저장 </li></ul></ul><ul><ul><li>( 예 ) Rectangle.cpp 파일 </li></ul></ul>
  11. 11. Information Hiding <ul><li>Class implementation details are hidden from the client’s view. This is called information hiding. </li></ul><ul><li>Public functions of a class provide the interface between the client code and the class objects. </li></ul>client code specification implementation abstraction barrier
  12. 12. 클래스 객체의 선언과 멤버 함수의 기동 <ul><li>클래스 객체 : 변수와 똑같이 선언되고 생성됨 </li></ul><ul><li>객체 멤버들에 대한 접근 / 기동 </li></ul><ul><ul><li>점 (.) : 직접 구성 요소 선택 </li></ul></ul><ul><ul><li>화살표 (->) : 포인터를 통한 간접 구성 요소 선택 </li></ul></ul>// 소스화일 main.cpp 속에 #include <iostream> #include &quot;Rectangle.h&quot; main() { Rectangle r , s ; // r 과 s 는 Class Rectangle 의 객체들이다 . Rectangle *t = &s ; // t 는 클래스 객체 s 에 대한 포인터이다 . . . // 클래스 객체의 멤버를 접근하기 위해서는 점 (.) 을 사용한다 . // 포인터를 통해 클래스 객체의 멤버를 접근하기 위해서는  를 사용한다 . if ( r.GetHeight ()* r.GetWidth () > t  GetHeight () * t  GetWidth ()) cout << &quot; r &quot;; else cout << &quot; s &quot;; cout << &quot;has the greater area&quot; << endl ; } 어떻게 Rectangle 객체가 선언되고 멤버 함수가 기동되는가를 예시하는 C++ 코드 부분
  13. 13. 생성자 ( constructor ) 와 파괴자 ( destructor ) <ul><li>생성자와 소멸자 : 클래스의 특수한 멤버 함수 </li></ul><ul><li>생성자 </li></ul><ul><ul><li>한 객체의 데이타 멤버들을 초기화 </li></ul></ul><ul><ul><li>클래스 객체가 만들어질 때 자동적으로 실행 </li></ul></ul><ul><ul><li>해당 클래스의 공용 멤버 함수로 선언 </li></ul></ul><ul><ul><li>공용 멤버 함수로 선언 </li></ul></ul><ul><ul><li>생성자 이름은 클래스의 이름과 동일 </li></ul></ul>Rectangle :: Rectangle ( int x , int y , int h , int w ) { xLow = x ; yLow = y ; height = h ; width = w ; } Rectangle 클래스의 생성자 정의
  14. 14. 생성자 ( constructor ) 와 파괴자 ( destructor ) <ul><li>생성자를 이용한 Rectangle 객체 초기화 </li></ul><ul><li>Rectangle 클래스의 세련된 생성자 정의 </li></ul><ul><ul><li>데이터 멤버들이 멤버 초기화 리스트에 의해 초기화 </li></ul></ul><ul><ul><li>보다 효율적 </li></ul></ul>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 ) { }
  15. 15. 생성자 (constructor) 와 소멸자 (destructor) <ul><li>소멸자 </li></ul><ul><ul><li>객체가 없어지기 직전 데이타 멤버들을 삭제 </li></ul></ul><ul><ul><li>클래스 객체가 범위를 벗어나거나 삭제될 때 자동적으로 기동 </li></ul></ul><ul><ul><li>해당 클래스의 공용 멤버로 선언 </li></ul></ul><ul><ul><li>이름은 클래스 이름과 동일 , 단 앞에 틸데 (~) 붙임 </li></ul></ul><ul><ul><li>반환 타입이나 반환 값을 명기해서도 안되고 인자를 받아서도 안됨 </li></ul></ul><ul><ul><li>삭제되는 객체의 한 데이타 멤버가 다른 객체에 대한 포인터인 경우 </li></ul></ul><ul><ul><ul><li>포인터에 할당된 기억장소는 반환 </li></ul></ul></ul><ul><ul><ul><li>지시되는 객체는 삭제되지 않음 </li></ul></ul></ul><ul><ul><ul><li>  명시적으로 수행하는 소멸자를 정의해야 됨 </li></ul></ul></ul>
  16. 16. 연산자 다중화 (operator overloading) <ul><li>C++ 는 특정 데이터 타입을 위한 연산자를 구현하는 정의를 허용 </li></ul><ul><ul><li>이를 통해 사용자 정의 데이터 타입에 대한 연산자 다중화 허용 </li></ul></ul><ul><ul><li>클래스 멤버 함수나 보통의 함수 형식 </li></ul></ul><ul><ul><li>사용될 함수 프로토타입은 특정 연산자의 명세와 일치해야 됨 </li></ul></ul><ul><ul><li>( 예 ) 연산자 == </li></ul></ul><ul><ul><ul><li>두 실수 (float) 데이타의 동등성 검사 </li></ul></ul></ul><ul><ul><ul><li>두 정수 (int) 데이타의 동등성 검사 </li></ul></ul></ul><ul><ul><ul><li>두 사각형 (Rectangle) 객체 동등성 비교 : 연산자 다중화 필요 </li></ul></ul></ul><ul><ul><ul><li>- 같은 객체 </li></ul></ul></ul><ul><ul><ul><li>- 위치와 크기가 같은 사각형 </li></ul></ul></ul>
  17. 17. 연산자 다중화 (operator overloading) <ul><li>Class Rectangle 을 위한 연산자 == 의 다중화 </li></ul><ul><li>this: 멤버 함수를 기동 시킨 특정 클래스 객체에 대한 포인터 (self) </li></ul><ul><li>*this: 클래스 객체 자신 </li></ul><ul><li>비교과정 </li></ul><ul><ul><li>두 피연산자가 동일 객체이면 결과는 true ( this == &s ) </li></ul></ul><ul><ul><li>아니면 데이터 멤버를 개별적으로 비교하여 모두 동일하면 결과는 true </li></ul></ul><ul><ul><li>아니면 결과는 false </li></ul></ul>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 ; }
  18. 18. 연산자 다중화 (operator overloading) <ul><li>class Rectangle 을 위한 << 연산자의 다중화 </li></ul><ul><li>클래스 Rectangel 의 전용 데이터 멤버에 접근 </li></ul><ul><li>  Rectangle 의 friend 로 만들어져야 됨 </li></ul><ul><li>cout << r 의 출력 예 </li></ul><ul><ul><li>r 의 왼쪽하단 좌표가 1,3 이고 한변이 6 인경우 ) </li></ul></ul><ul><ul><li>Position is: 1 3 </li></ul></ul><ul><ul><li>Height is: 6 </li></ul></ul><ul><ul><li>Width is: 6 </li></ul></ul>ostream & operator << ( ostream & os , Rectangle & r ) { os << &quot;Position is: “ << r.xLow << &quot; &quot;; os << r.yLow < endl ; os << &quot;Height is: “ << r.height << endl ; os << &quot;Width is: &quot;r.width << endl ; return os ; }
  19. 19. 기타 내용 <ul><li>C++ 의 struct </li></ul><ul><ul><li>묵시적 접근 레벨 = public </li></ul></ul><ul><ul><li>(cf. class 에서는 private) </li></ul></ul><ul><ul><li>C 의 struct 에 대한 일반화 </li></ul></ul><ul><ul><li>( 멤버 함수도 정의 가능 ) </li></ul></ul><ul><li>union </li></ul><ul><ul><li>제일 큰 멤버에 맞는 저장장소 할당 </li></ul></ul><ul><ul><li>보다 효율적으로 기억장소 사용 </li></ul></ul><ul><li>static( 정적 ) 클래스 데이타 멤버 </li></ul><ul><ul><li>클래스에 대한 전역 변수 : 오직 하나의 사본 </li></ul></ul><ul><ul><li>모든 클래스 객체는 이를 공유 </li></ul></ul><ul><ul><li>정적 데이타 멤버는 클래스 외부에서 정의 </li></ul></ul>
  20. 20. ADT 와 C++ 클래스 <ul><li>ADT 와의 차이 </li></ul><ul><ul><li>C++ 의 일부 연산자들은 해당 클래스의 멤버 함수로 존재하지 않음 </li></ul></ul><ul><ul><li> 보통의 C++ 함수로 외부에서 선언 </li></ul></ul><ul><ul><li> ( 해당 클래스에서 friend 선언 ) </li></ul></ul>
  21. 21. 추상 데이타 타입으로서의 배열 <ul><li>일련의 연속적인 메모리 위치 : 구현 중심 </li></ul><ul><li>< 인덱스 , 값 > : <index,value> 의 쌍 집합 </li></ul><ul><ul><ul><li>index -> value : 대응 (correspondence) 또는 사상 (mapping) </li></ul></ul></ul><ul><ul><ul><li>same data type </li></ul></ul></ul><ul><li>C++ 배열 </li></ul><ul><ul><li>인덱스 집합이 0 부터 시작 </li></ul></ul><ul><ul><li>배열의 인덱스 범위를 확인하지 않음 </li></ul></ul><ul><ul><li>( 예 ) float floatArray[n]; </li></ul></ul><ul><ul><li>i 번째 원소값 : floatArray[ i ], *(floatArray+ i ) </li></ul></ul><ul><li>함수 </li></ul><ul><ul><li>GeneralArray ( int j, RangeList list, float initValue=defaultValue) </li></ul></ul><ul><ul><li>Retrieve(index) </li></ul></ul><ul><ul><li>Store(index, item) </li></ul></ul>
  22. 22. 다항식 추상 데이타 타입 <ul><li>순서 리스트 , 선형 리스트 </li></ul><ul><ul><li>examples </li></ul></ul><ul><ul><ul><li>한 주일의 요일 : ( 일 , 월 , 화 , 수 , .., 토 ) </li></ul></ul></ul><ul><ul><ul><li>카드 한 벌의 값 : (Ace, 2, 3, 4, 5, 6, 7, 8, 9, 10, Jack, Queen, King) </li></ul></ul></ul><ul><ul><ul><li>건물 층 : ( 지하실 , 로비 , 일층 , 이층 ) </li></ul></ul></ul><ul><ul><ul><li>미국의 제 2 차 세계대전 참전년도 : (1941, 1942, 1943, 1944, 1945) </li></ul></ul></ul><ul><ul><ul><li>스위스의 제 2 차 세계대전 참전년도 : () </li></ul></ul></ul><ul><ul><li>리스트 형태 : (a 0 , a 1 , ... , a n-1 ) </li></ul></ul><ul><ul><li>공백 리스트의 예 : () </li></ul></ul>
  23. 23. 순서 리스트 , 선형 리스트 <ul><ul><li>리스트에 대한 연산 </li></ul></ul><ul><ul><ul><li>리스트의 길이 n 의 계산 </li></ul></ul></ul><ul><ul><ul><li>리스트의 항목을 왼쪽에서 오른쪽 ( 오른쪽에서 왼쪽 ) 으로 읽기 </li></ul></ul></ul><ul><ul><ul><li>리스트로부터 i 번째 항목을 검색 , 0 ≤ i<n </li></ul></ul></ul><ul><ul><ul><li>리스트의 i 번째 항목을 대체 , 0 ≤ i<n </li></ul></ul></ul><ul><ul><ul><li>리스트의 i 번째 위치에 새 항목 삽입 , 0 ≤i<n 이것은 원래 i, i+1,…., </li></ul></ul></ul><ul><ul><ul><li>n-1 항목 번호를 i+1, i+2, …. , n 으로 만듦 </li></ul></ul></ul><ul><ul><ul><li>리스트의 i 번째 항목을 제거 , 0 ≤ i<n 이것은 원래 i+1, ….., n-1 항목 </li></ul></ul></ul><ul><ul><ul><li>번호를 i, i+1, …., n-2 로 만듦 </li></ul></ul></ul><ul><ul><li>순서 리스트의 일반적인 구현 </li></ul></ul><ul><ul><ul><li>배열을 이용 </li></ul></ul></ul><ul><ul><ul><li>인덱스 i  ai, 0  i < n </li></ul></ul></ul><ul><ul><ul><li>... i, i+1, ... </li></ul></ul></ul><ul><ul><ul><li>... ai, ai+1, ... </li></ul></ul></ul><ul><ul><ul><li>순차 사상 (sequential mapping) </li></ul></ul></ul><ul><ul><ul><li>문제점 : 삽입 , 삭제시 오버헤드 </li></ul></ul></ul>
  24. 24. 배열의 표현 <ul><li>배열 원소 a[i 1 ][i 2 ],…,[i n ] 의 1 차원 배열 위치로의 변환 </li></ul><ul><ul><li>( 예 ) a[0][0][0][0] ⇒ 위치 0 </li></ul></ul><ul><ul><li>a[0][0][0][1] ⇒ 위치 1 </li></ul></ul><ul><ul><li>a[1][2][1][1] ⇒ 위치 23 </li></ul></ul><ul><li>1 차원 배열 a[u 1 ] </li></ul><ul><ul><li> : a[0] 의 주소 </li></ul></ul><ul><ul><li>임의의 원소 a[i] 의 주소 :  +i </li></ul></ul>a[u 1 ] 의 순차적인 표현 배열 원소 a[0] a[1] ... a[i] ... a[u 1 -1] 주소   +1 ...  +i ...  +u 1 -1
  25. 25. 배열의 표현 <ul><li>2 차원 배열 </li></ul><ul><ul><li> :a[0][0] 의 주소 </li></ul></ul><ul><ul><li>a[i][0] 의 주소 :  +i*u 2 </li></ul></ul><ul><ul><li>a[i][j] 의 주소 :  +i*u 2 +j </li></ul></ul>x x … x x x … x x x … x x x … x col0 col1 col u 2 -l row 0 row 1 row u 1 -1 (a) u 2 element u 2 element row 0 row 1 ... ... row i i*u 2 element (b) a[u 1 ][u 2 ] 의 순차적 표현 row u i -1 row 2
  26. 26. 배열의 표현 <ul><li>3 차원 배열 </li></ul><ul><ul><li> ;A[0][0][0] 의 주소 </li></ul></ul><ul><ul><li>A[i][0][0] 의 주소 :  +i </li></ul></ul><ul><ul><li>A[i][j][k] 의 주소 :  + iu 2 u 3 + ju 3 + k </li></ul></ul>u 2 u 3 u 1 (a) 3 차원 배열 A[u 1 ][u 2 ][u 3 ] 가 u 1 개의 2 차원 배열로 취급됨
  27. 27. 다차원 배열의 표현 <ul><li>n 차원 배열 a[u 1 ][u 2 ]…,[u n ] </li></ul><ul><ul><li> ; A[0][0],…,[0] 의 주소 </li></ul></ul><ul><ul><li>a[i 1 ][i 2 ][0],…,[0] 의 주소 :  +i 1 u 2 u 3 …u n </li></ul></ul><ul><ul><li>a[i 1 ][i 2 ][0],…,[0] 의 주소 :  + i 1 u 2 u 3 … u n + u 3 + i 2 u 2 u 3 … u n </li></ul></ul><ul><ul><li>a[i 1 ][i 2 ],…,[i n ] 의 주소 </li></ul></ul>i u 2 u 3 elements A(0,u 2 ,u 3 ) A(1,u 2 ,u 3 ) ... A(u 1 -1,u 2 ,u 3 ) (b) 3 차원 배열의 순차 행 우선 표현 여기서 A(1,u 2 ,u 3 ) ... 1 1 , 1        n n j k k j a n j u a

×