티스토리 뷰

객체지향 프로그래밍(OOP)

객체지향 프로그래밍이란? 컴퓨터 프로그래밍의 패러다임 중 하나이다.
절차 지향의 경우 - 수행되어야 할 연속적인 계산 과정을 포함하고 있는 프로그램을 지향.
객체 지향의 경우 - 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나,
여러 개의 독립된 단위, 객체들의 모임으로 파악하고자 함. (각각의 객체는 메세지를 주고받고, 데이터를 처리할 수 있다.)


기본적인 구성 요소
1. 클래스(class)

문제 해결 또는 특정한 기능을 하기 위한 속성(arrtibute - 자료를 담을 수 있는 변수)와 행위(behavior - method(procedure))를 정의한 것으로,

객체지향 프로그래밍의 기본적인 사용자 정의 데이터형(user defined data type)이라고 할 수 있다.

클래스를 구성할 때는 외부 요소와 독립적으로 디자인하여야 한다.

2. 객체(Object)

클래스의 인스턴스이다. (실제로 메모리에 할당되게 된다.)

이 때, 클래스의 behavior(method)는 클래스에 정의된 행위에 대한 정의(code)를 공유하게 되어 메모리를 경제적으로 사용하게 된다.

: vftable로 선언된 함수들. (?)

: __thiscall을 이용하여 object instance ptr + attribute offset 을 이용해 method를 실행하며 현재 사용중인 object의 속성값에 액세스.

3. 메소드(Method)

클래스로부터 생성된 객체를 사용하느 방법, 객체에 명령을 내려 객체로 하여금 데이터를 조작하거나 원하는 작업을 실행함.

4. 메세지(Message)

객체 간의 통신을 위해 사용된다.

: ex) SendMessage, GetMessage, PeekMessage 등.



특징
1. 자료 추상화 (Abstraction)
사전적으로는, 추상화는 특정한 개별 사물과 관련되지 않은 공통된 속성이나 관계 등을 뽑아내는 것을 의미한다.
프로그래밍의 관점에서 생각해 본다면, 클래스의 데이터나, 프로세스(Method - behavior)등을 의미가 비슷한 개념이나 표현으로 정리하며 동시에 각 개별 개체의 구현에 대한 상세함은 감추는 것이라 할 수 있다.
ex) 웹 페이지를 파싱해오는 클래스를 만들 때,
: 웹 주소를 인자로 받아 파싱을 시작하는 메소드(char* myClass.StartParsing(char* pageUrl))는 public으로 정의하고,
: 이 메소드 내부에서 웹 서버와 통신하는 함수(UrlDownloadBody)와 같은 함수는 private로 감추는 것이라 할 수 있다.
2. 자료 은닉

위 추상화와 비슷한 개념으로, 내부적으로 구현에 필요한 메소드, 변수 중 외부에서 필요 없는 것들은 접근 불가능하도록 하는 것.(ex - private declare) 

3. 상속 (Inheritance)
새로운 클래스가 기존의 클래스의 자료와 연산(Method)를 이용할 수 있게 하는 기능이다.
이 때, 상속을 받는 새로운 클래스를 "부클래스, 파생 클래스, 하위 클래스, 자식 클래스" 라고 부르며,
새로운 클래스가 상속받게 되는 기존의 클래스를 "기반 클래스, 상위 클래스, 부모 클래스" 라고 한다.
상속을 통해, 기존의 클래스를 상속받은 하위 클래스를 이용해 프로그램의 요구에 맞추어 클래스를 수정할 수 있고, 클래스 간의 종속 관계를 형성함으로써, 객체를 조직화할 수 있다. (어떠한 특징을 가지는 여러 개의 클래스. 해당 특징을 구현한 클래스를 부모로 상속받는다.)
4. 다중 상속
클래스가 2개 이상의 클래스로부터 상속받을 수 있게 하는 기능.
클래스들의 기능이 동시에 필요할 때 용이하지만, 클래스의 상속 관계에 혼란을 줄 수 있고, 지원하지 않는 언어가 존재한다. (ex - Java 등)
5. 다형성 개념
메소드 오버로딩의 개념으로 보면 될 듯하다. (오버로딩이 다형성인지 아닌지에 대해서는 이견이 존재하는 것으로 보임)
메소드를 인자의 타입, 갯수에 따라 오버로딩 함으로써, 상황에 따라 그에 맞는 다양한 동작을 할 수 있도록 한다.
이에 따라 프로그램 안의 객체 간의 관계를 조직적으로 나타낼 수 있다.
6. 동적 바인딩(프로그램 구성 요소의 성격을 결정해주는 것을 말한다.)
::: 작성 보류 (C, C++, Java.. 정적 타입 사용 / Python, SmallTalk.. 동적 타입 사용)
정적 타입 : 컴파일 시에 타입을 결정. (안정성 향상)
동적 타입 : 런타임 시에 변수에 들어가는 값으로 타임을 결정. (편리, 안정성 문제 - 다양한 상황에서 exception 발생 확률 증가)
7. 캡슐화
(자료 추상화와 일부 비슷한 것 같다.)
객체의 속성과 행위를 하나로 묶고, 실제 구현 내용 중 일부를 외부에 감추어 은닉한다.


참고 : https://ko.wikipedia.org/wiki/%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D

http://jochiwon.tistory.com/admin/entry/post/?id=41

http://blog.daum.net/sox25/2

추가 참고 : 

http://lacti.me/2013/11/16/cpp-message-dispatcher/


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함