검색결과 리스트
C++/C/C++로배우는 자료구조론에 해당되는 글 1건
- 2011.09.17 I.객체지향 방법론
글
1. 객체지향의 개념
- 어떤문제를 해결하기 위한 과정을 순차적으로 설계하는것 ▶절차적 방법론
절차적언어: Pascal , Fortran, C, C++등..
2. 객체 클래스와 상속
- 유사한 특징을 지닌 객체를 묶어서 그룹지은것이 객체클래스(Object Class)
- 인스턴시에이션(Instantiation): 추상적 개념으로 부터 구체적 실례 하나를 만드는것.
- 같은 클래스에 속한 모든 객체는 동일한 메세지에 대하여 동일하게 반응함. 즉,동일한 메소드를 사용.
- 클래스를 바라보면 클래스간의 계층구조가 존재하는것을 알수 있음. 즉,어떤 클레스(Child Class,
sub Class, Derived Class)는 더높은 일반적인클래스(Parent Class, Super Class, Base Class)에
속하고, 그 클래스는 다시 더높고 포괄적인 클래스에 속한다.
- 객체지향 언어에서 클래스간 계층구조를 선언하는것은 상위클래스의 속성(Attribute)을
상속(Inheritance) 받기위함.
객체지향 설계과정 | |
1단계 | 문제를 풀기위해 필요한 객체설정 |
2단계 | 객체간의 유사한 속성파악 |
3단계 | 유사한 속성을 지닌객체를 모아 기본클래스 선언 |
4단계 | 기본 클래스로부터 특수한 속성을 지닌 하위 클래스 정의 |
- 상위 클래스에서 메소드를 선언하였을때, 어떤 클래스가 그하위 클래스라고 선언하기만 하면 자동으로
상위메소드를 상속받게된다. 자신의 소속을 밝힘으로써, 자신이 속한 단체의 재산 을 가져오는 행위.
3. C++객체지향
-프로그램의 단위성(Modularity)이 높음.
-큰문제 전체를 하나로 놓고 한꺼번에 모든 세부사항을 처리하는것보다 그문제를 잘라서
작은단위(Module)로 분할한 다음 이들을 개별, 단위별로 구현하는것이 훨씬 수훨한방법이다.
-객체단위로 잘라놓으면 나중에 다른문제를 해결할때에도 필요한 객체만 가져다가 조합함으로써
재사용성(Reusablity)을 높일수 있다.
①인터페이스 파일
-클래스의 선언은 Public 섹션과 Private색션 두부분으로 구성.
Public은 '공유'라는뜻으로, 내부에서 선언된 메세지를 외부사용자가 공유할수 있다는 의미이다.
따라서, 외부사용자는 여기에서 선언된 메세지를 사용하여, 이클래스의 객체에게 일을 시킬수 있다.
-객체지향 개념에서의 메세지를 C++에서는 맴버함수라고 부른다.
클래스 선언은 인터페이스의 역활만 하면 충분함으로 맴버함수의 구체적인 구현 내용은 나타나지않고
함수명(Function Prototype)만표시한다. 객체를 불러서 사용하는 외부에서는 구체적인 외부내용은 볼
필요가 없기때문이다. 외부에서 이파일만 보고 메세지를 던져야 하는사람을 위해서 메세지가
구체적으로 무엇을 해주는 것인지 쉬벡 알아볼수 있도록하여야함(주석처리)
-맴버함수중 클래스명과 동일한 함수명을 사용하되 리턴타입을 선언하지않는 함수가
"생성자(Constructor)"함수이다.
이함수는 문자 그대로 새로운 객체를 만드는 함수로써, 객체의 선언시 자동으로 불려져온다.
반면,객체를 없애고 그객체가 사용하던 메모리 공간을 운영체제에게 반납하기 위한 함수가
"소멸자(Destruct)"함수이다.
소멸자 함수는 클래스명앞에 물결(Tilde,~)표시로 구분하며, 생성자 함수와 마찬가지로 리턴타입을
선언하지 않음.
-C++클래스 선언의 두번째 섹션은 Private 라는 키워드로 시작, 이부분은 사적인것으로 외부사용자와
공유하는 부분은 아니다.
즉,이섹션에 선언된 변수나 함수를 읽고 쓰려고 외부에서 직접접근을 할수없다.
이부분을 접근할수 있는 자격을 가진것은 자체클래스 맴버함수 뿐이다.
일반적으로 Private섹션에 나타내는것은 맴버함수를 수행하는데 필요한 객체의 내부 저장공간.
즉, 변수들로써 이를 C++에서는 맴버데이터라고 부른다. 객체자신의 변화상태를 나타내는 변수라는
의미에서 객체지향에서는 이를 "상태변수:라고도한다.
②구현파일
-구현함수에서는 클래스명을 먼저쓰고, 콜론(:) 두개를 붙인다음. 이어서 메세지명을 써야한다
ex) Card::card()
이렇게 함으로써, 어느클래스에 속한 함수인지 나타낼수 있다.
같은 이름의 메세지라 할지라도, 클래스에따라서 처리방식이 달라질수있기 때문이다.
③메세지전달요령
-어떤클래스에 속한 객체를 선언하려면 클래스명다음에 객체를 선언.
ex)Card MyCard;
Card는 클래스 MyCard는 해당클래스에 속한 객체명.
-C++에서 메세지전달은 메세지를 받을 객체 다음에 점을 찍고 메세지명을대면된다.
ex) MyCard.Flip();
필요하다면 괄호안의 파라미터를 같이넣어 전달하면됨. 객체의 맴버데이터를 지정할때에도 객체명
다음에 점을찍고 변수명을 지정한다.
맴버함수 다음에는 파라미터가 없어도 빈괄호를 넣는것이 상례.
※ 괄호가 없을시 그것이 맴버함수인지,맴버데이터인지 헷갈릴수가있다.
④상속과 다형성
Class triangle: Public Shape{
Public:
Triangle();
~Triangle();
void Draw();
float Area();
float GetBase();
Private:
float Base();
float Height();
};
Public:
Triangle();
~Triangle();
void Draw();
float Area();
float GetBase();
Private:
float Base();
float Height();
};
이어받는것은 맴버함수와 맴버데이터 모두를 이어받는것.
-EX)1-1의 경우 triangle.T;라고 선언하고 T.Rotate(); 명령을 내릴수도있다. 맴버함수가 없음에도 이러한
명령을 내릴수있는것은 상위클래스인 Class Shape에 Rotate라는 맴버함수가 정의되고 구현되어있기
때문. 즉, 상속에 의한것임.
-T.Rotate();라고한다면 T클래스인 triangle 클래스에 해당함수가 있는지 먼저 검색함. 만약 해당함수가
있다면, triangle클래스에 선언된 함수가 직접실행. 그곳에 없을때에 한해서만 그 상위 클래인 Shape
클래스로 올라가서 , 가장먼저선언된것이 사용된다. 실행시 일어난다는 의미에서 "동적연결"이라함.
-연산자 오버로딩 ▶ 동일연산자에 두개이상의 의미를 부여하는것.
4.절차적설계와비교
-절차적 설계에는 어떤작업을 함수로 정의하고 이를 반복해서, 호출함으로써 재사용성을 높임.
반면 객체 지향설계는 모든 함수를 수행할수 있는 객체를 우선시한다. 어떤객체를 설정하여 그객체가
할수있는 모든 기능을 한군대 모아놓는 접근방법이 재사용 면에서는 더욱유리하다.
객체지향에서 무엇보다 중요한것은 인터페이스와 구현의분리이다.
외부에서 객체를 사용하는 사람의 입장엣서는 인터페이스만 알면된다. 객체 내부가 구체적으로 어떻게
구현되는지 몰라도된다. 이처럼 내부가 외부에 공개되지않도록 "외부와 벽을 쌓고있다"라는 의미에서
이를 "인캡슐레이션"이라고한다.
RECENT COMMENT