1 1 1 장. 객체지향 방법론 객체지향 방법론 본문의 C++ 코드를 이해하기 위해 추상 자료형 개념과 어떻게 일치하는지 이해하기 위해 객체 지향 방법론의 장점은 사용과 구현을 분리하는데 있음 학습목표 프로그램 설계 차원에서 객체지향 방법론의 개념이해 C++ 의 객체지향적 요소를 파악 인터페이스와 구현을 분리하는 이유를 이해 절차적 방법론과 객체지향 방법론의 차이를 이해
2 2 객체지향 방법론 객체지향은 프로그램 설계기법 프로그램을 구현하기 위한 언어가 아님 문제 : 부산에 사시는 할머니에게 꽃을 보낸다 절차적 방법론, 절차적 언어 객체지향적 방법론, 객체지향적 언어
3 3 객체지향 방법론 객체지향 용어 메시지, 요구사항 객체, 대리인, 메시지을 받는 사람 객체는 메시지 수신자이며 동시에 전달자 정보의 은닉 객체지향 방법론 주체지향에 대응되는 개념 객체 설정이 중요 ( 예 : 인사관리 객체, 수금관리 객체, 재고관리 객체, … )
4 4 객체지향 방법론 조교에게 책임을 전가
5 5 객체 클래스 클래스 유사한 특징을 지닌 객체를 묶어서 그룹지은 것 객체 = 클래스 인스턴스 같은 메시지에 같은 클래스 객체라면 동일하게 반응 다형성 Poly-Morphism 같은 메시지에 대해 클래스 별로 서로 달리 반응하게 할 수 있음
6 6 클래스 계층구조 상위 클래스, 하위 클래스 하위 클래스를 일반화한 것이 상위 클래스 상위 클래스의 특수한 경우가 하위 클래스 계층구조 선언의 목적은 상속에 있음 한정식 주얼리 오패션 김꽃분 박나리 오난초 Class 인간 Class … Class 상점주인 Class 노래방주인 Class 음식점 주인 Class 꽃집주인 …
7 7 객체지향 설계과정 1 단계 문제를 풀기위해 필요한 객체를 설정 2 단계 객체들 간의 유사속성을 파악 3 단계 유사한 속성을 지닌 객체를 모아 기본 클래스로 선언 4 단계 기본 클래스로부터 특수한 속성을 지닌 하위 클래스를 선언
8 8 C++ 와 객체지향 객체 단위로 2 개의 파일 인터페이스 파일 (.h) 과 구현 파일 (.cpp) 객체 단위의 재사용성을 높일 수 있음 인터페이스 파일 C 용어로는 헤더파일 외부 사용자를 위한 파일 메시지가 정의됨 구현을 몰라도 이 파일만 읽고 불러서 사용할 수 있음 ( 정보의 은닉 ) 제대로 된 커멘트가 중요함 ( 이유 ?) 구현파일 내부 구현자를 위한 파일
9 9 인터페이스 파일 예 코드 1-1: enum suits {diamond, clover, heart, spade} 타입 suit 는 카드무늬 집합 중 하나 enum colors {red, black} 타입 colors 는 카드색 집합 중 하나 class card{ public: card( ); 생성자 함수 ~card( ); 소멸자 함수 colors Color( ); 현재 카드의 색깔을 되돌려 주는 함수 bool IsFaceUp( ); 앞면이 위인지 아래인지 되돌려주는 함수 int Rank( ); 카드에 쓰인 숫자를 되돌려주는 함수 void SetRank(int x); 카드의 숫자를 x 로 세팅하는 함수 void Draw( ); 카드를 화면에 그려내는 함수 void Flip( ); 카드를 뒤집는 멤버함수 private: bool Faceup; 그림이 위로 향하고 있는지 나타내는 변수 int Rval; 카드 숫자를 나타내는 변수 suits Sval; 카드 종류를 나타내는 변수 };
10 인터페이스 파일 인터페이스 파일 외부사용자와의 인터페이스 클래스 선언 파일 퍼블릭 섹션 외부 사용자에게 공개된 ( 직접 불러서 사용할 수 있는 ) 부분 메시지 = C++ 멤버함수 함수 프로토타입만 선언됨 구현내용을 여기에 써서는 안됨 ( 정보의 은닉 ) 선언만 보고도 불러쓸 수 있도록 자세하고도 정확한 커멘트 처리 프라이빗 섹션 외부사용자에게 비공개된 ( 직접 사용할 수 없는 ) 부분 자체 클래스의 멤버함수만이 사용할 수 있음 멤버 데이터 (Member Data, State Variable, Instance Variable) 여기에 멤버함수를 정의하면 그 함수는 자체 클래스의 멤버함수만이 사용할 수 있음 생성자, 소멸자 함수
11 구현파일 예 코드 1-2: #include "card.h" card::card( ) { Sval = diamind; 카드 종류는 다이아몬드 Rval = 7; 카드 숫자는 7 로 Faceup = TRUE; 앞면을 위로 } int card::Rank( ) { return Rval; 현재의 카드 숫자를 되돌려 줌 }
12 구현 파일 클래스명, 더블 콜론 (::), 메시지명 어느 클래스에 속한 함수인지를 표시함 같은 이름의 메시지라 할지라도 클래스에 따라서 처리방식이 다를 수 있음 생성자함수 멤버 데이터 값을 초기화 프라이빗 섹션의 상태변수 사용가능
13 C++ 소스파일 구성 Interface File (.h)Implementation File (.cpp or.c or.cc) 클래스 선언클래스 구현 #define: 매크로 정의 #include: 다른 인터페이스 파일 포함 typedef: 타입선언 #include: 자체 헤더 파일 포함 데이터 / 객체 선언
14 메시지 전달 void main( ) { card MyCard; 내 카드 객체 하나 만들기 MyCard.Flip( ); 내 카드여 ! 뒤집어라 cout << MyCard.Rank( ); 내 카드여 ! 현재 네 숫자가 얼마인지 화면에 찍어라. } 메시지를 받을 객체 다음에 점을 찍고 메시지 명 MyCard 는 객체이고 Flip( ) 은 그 객체가 실행할 수 있는 메시지 필요하다면 괄호 안에 파라미터를 전달 멤버함수 다음에는 파라미터가 없더라도 빈 괄호를 넣는 것이 상례
15 클래스 계층구조 예 class shapeColor Rotate(); Move(); Fillcolor(); class triangleclass circle class rectangle Base, Height Draw(); Area(); GetBase(); Radius Draw(); Area(); GetDiameter(); Width, Length Draw(); Area(); GetWidth();
16 파생 클래스 선언 class triangle: public shape{ public: triangle( ); 생성자 함수 ~triangle( ); 소멸자 함수 void Draw( ); 현재 객체를 화면에 그리는 함수 float Area( ); 현재 객체의 면적을 계산하는 함수 float GetBase( ); 현재 객체의 밑변 길이를 되돌려주는 함수 private: float Base; 밑변의 길이를 나타내는 변수 float Height; 높이의 길이를 나타내는 변수 }; class triangle: public shape 클래스 triangle 이 클래스 shape 의 하위 클래스임을 밝힘.
17 멤버함수의 연결 triangle T; T.Rotate( ); T.Rotate( ); 에 의해 일단 클래스 triangle 에 해당 함수가 있는지를 검색 있으면 그 클래스의 함수가 실행 없으면 상위 클래스인 클래스 shape 에 해당 함수가 있는지를 검색 계속적으로 상위 클래스로 올라가면서 가장 먼저 정의된 것을 상속받음 객체와 메시지의 연결은 실행 시에 일어남 ( 동적 연결 :Dynamic Binding) 하위 클래스에서 상위 클래스와 동일한 함수를 정의 상위 클래스의 함수를 덮어 씌움 일반적인 상위 클래스 함수를, 하위 클래스가 자체 특성에 맞게 특화 (Specialization) 시킬 때 사용되는 기법 triangle T; circle C; rectangle R; T.Draw( ); C.Draw( ); R.Draw( ); Draw 라는 명령은 동일 삼각형, 원, 사각형 등 서로 다른 그림이 그려짐 Draw( ) 라는 동일 메시지를 클래스 별로 다른 방법으로 구현.( 다형성 )
18 프로텍티드 섹션 Protected Section 하위 클래스가 상위 클래스의 상태변수나 메시지를 사용해야 할 때 가 있다. 이를 가능하게 하려면 상위 클래스에서 이들을 protected 섹션 내부 에 정의하면 된다. protected 섹션에 의해서 다른 클래스 객체와 자신의 하위 객체의 접근성을 차별화한다. 즉, 다른 객체는 접근할 수 없지만 같은 가족인 하위 클래스 객체는 접근을 가능하게 한 것이다.
19 연산자 오버로딩 동일한 연산자에 2 개 이상의 의미를 부여 어떤 의미의 함수가 불려오는지는 호출 형태에 의해 결정 Int x, y; x = y; cardClass c1, c2; c1 = c2; 정수 할당인 이퀄 연산자와 카드 할당인 이퀄 연산자는 달라야 함 객체 c1, c2 의 상태변수는 단순한 하나의 변수가 아닐 수 있음. 객체 의 복사는 상태변수 모두를 복사해야 함. 이를 위해 이퀄 연산자에 다른 의미를 부여 연산자 다음에 card 클래스의 객체 C 가 나오면 오버로딩 된 이퀄 연 산자가 실행됨. card.h void operator = (card C); 이퀄 연산자의 우변 c2 에 해당하는 것이 C card.cpp void card::operator = (card C) { FaceUp = C.FaceUp; c1.FaceUp = c2.FaceUp Rval = C.Rval; c1.Rval = c2.Rval Sval = C.Sval; c1.Sval = c2.Sval }
20 객체지향적 언어, 절차적 언어 객체지향 언어, 절차적 언어 객체지향 언어는 객체를 강조 카드 객체에게 뒤집는 작업을 시킬 것인가 절차적 언어는 작업을 강조 뒤집는 함수에게 내 카드를 전달할 것인가 절차적 언어 자주 사용되는 작업을 함수로 정의. 반복 호출에 의해 재 사용성을 높임. 객체 개념이 없음 최소치를 구하는 함수, 평균값을 구하는 함수 객체지향적 언어 객체를 우선적으로 설정 계산기 객체를 일단 선언하고 그 클래스 객체가 실행할 수 있는 함 수를 선언 구조면 객체지향 : 객체 울타리 안에 변수와 함수를 묶어버림 절차적 설계 : 어느 변수가 어느 함수에 사용되는지 분간하기 힘
21 인터페이스와 구현의 분리 객체지향 설계의 최대 장점 인터페이스와 구현의 분리 Message1 Message2 Response1 Response2 인터페이스 관점 : Object=Black Box 구현 관점 : Object=Visible