Skip Navigation

XE 레이아웃 카메론 XE LAYOUT CAMERON XE1.9.8.4


객체지향 프로그램 언어

profile 단축주소복사하기
(*.168.0.1) 조회 수 281 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
Extra Form
원문주소

객체지향 프로그래밍(Object-Oriented Programming, OOP)

1. 정의

프로그래밍을 객체라는 단위로 나누고, 각 객체간의 상호작용으로 설계하고 작성하는 개념이자 방법론이다.

2. 역사

 절차지향 프로그래밍에서는 순차적으로 실행해 나가는 프로그램을 사용하였는데, 조금씩 복잡한 프로그램을 작성할수록 순서도를 작성하기도 힘든 복잡한 코드(스파게티 코드)가 작성되어 심지어는 작성자 조차 알아보기 힘든 문제가 발생하였다.

 그래서 커다란 코드를 작게 쪼개어 함수 단위로 만들고 프로시져끼리 호출하는 하향식 방식인 구조적 프로그래밍이 나왔으나, 근본적인 해결책은 되지 못하였다.

 결국에는 하향식 방식과 반대로 작은 문제를 해결할 객체들을 만들고, 이 객체를 조합해서 커다란 코드를 만드는 상향식 방식인 절차지향 프로그램이 등장하게 되었다.

 처음에는 컴퓨터의 처리능력이 좋지 못해 별로 주목을 받지 못하였지만, 윈도우 운영체제 같은 GUI에서 화면에 여러개 띄워야되는 창들을 객체지향 프로그래밍으로 작성하면 재사용이 쉽고, 각각의 제어상황을 이벤트처리하는대도 절차지향 프로그래밍에 비해 훨씬 쉽고 빨랐기 때문에 GUI가 등장하면서 각광받게 된다.

3. 특징

3.1 캡슐화(Encapsulation)

 클래스(Class)라는 캡슐(Capsule)에 코드를 작성하고, 이것을 인스턴스(Instance)하면 객체(Object)를 만들수 있다. 이렇게 만들어진 객체로 캡슐화된 클래스의 데이터나 함수, 프로시저에 접근하여 프로그래밍이 가능하다.


 예를 들어 "국가"라는 클래스에 세계의 모든 국가를 구분지을수 있는 코드를 작성한다. 즉, 이름, 수도 등을 처리하는 함수나 프로시저를 작성하는 것이다.

 이제 "국가"라는 클래스를 인스턴스화(객체화)하여 객체로 만들어 "대한민국_서울"을 입력하면, 1개의 국가가 생성된다. 즉, "국가.대한민국_서울"이 되는것이다. 같은 방식으로 "미국_워싱턴DC"를 입력하면, "국가.미국_워싱턴DC"가 생성된다. 

 이처럼 코드는 전혀 수정하지 않고, 재활용하는 것이 캡슐화의 목적이다.

 참고로 캡슐화는 객체지향 방식의 기본 개념으로 캡슐화를 안지키면 상속과 다형성, 추상화가 성립되지 않는다.

3.2 상속(Inheritance)

 사실 절차지향 프로그래밍 이전에 라이브러리를 통해 코드의 재사용이 가능했으나, 라이브러리의 기능을 약간만 바꿔도 프로그램 전체에 영향을 끼치게 되어 프로그램이 동작하지 않는 문제가 발생하였다. 그래서 추가적으로 소스코드를 수정하는 작업이 필요했다.

 이러한 문제를 해결하기 위해 상속(Inheritance)이라는 개념을 도입하였다. 

 예를 들어 부모가 죽기 전에 유언을 통해 자식에게 재산을 물려줄때 상속한다고 표현한다. 그리고 자식은 물려받은 재산을 자기자신의 마음대로 사용할 수 있다.

 절차지향 프로그래밍에서도 똑같이 부모클래스가 자식클래스에게 자신의 함수, 프로시저 등을 물려주는 것을 상속이라 한다. 또한 자식은 물려받은 부모의 기능들을 재정의(Override)하여 자기 마음대로 수정하여 사용이 가능한 것이 상속이라는 개념이다.

 하지만 상속받지 않는 다른 클래스는 전혀 영향을 받지 않으며, 재정의 된 기능이 부모클래스에 영향을 주진 않는다.

즉, 이미 만들어진 기능을 수정할 때 프로그램 전체에 영향을 주지않고 일부분만 수정하는 것이 상속의 목적이다.

3.3 추상화(Abstraction)

추상화는 공통된 속성을 뽑아내는 것으로 캡슐화의 개념과 많이 비슷하다. 

 바로 예를 들자면, 은행의 계좌를 한번에 조회할 때, 아래와 같은 각각의 은행에서 조회를 실시해야 할 것이다.

국민은행의 계좌조회 

신한은행의 계좌조회

기업은행의 계좌조회

여기서 계좌조회는 계좌번호를 통해, 본인이 인증되면 해당 계좌의 내역을 조회시켜준다는 공통적인 기능을 가지는데, 이러한 공통적인 개념을 뽑아내는 개념을 추상화라 한다. 

 각자 은행마다 계좌조회 기능을 구현하는 방식이 다를테니 총 3개의 구현방식이 나온다. 만약, 하나의 프로그램에서 통합해서 3개의 은행에 접속하여 전부 계좌조회 하는 기능을 만든다고 하면, 공통적인 개념인 계좌조회 기능을 뽑아내어 추상화 클래스를 만든다. 그리고 추상화된 계좌조회 기능을 상속받아 구현하면 국민은행 클래스, 신한은행 클래스, 기업은행 클래스에 공통적인 기능인 계좌조회 기능을 구현할수 있다.

 이로인해 좋아지는 점은 프로그래밍적으로 코드적으로 좋아지는 것이 아닌, 개발자가 생각하기 쉬워진다는 것이다. 한번에 모든 과정을 생각해서 프로그래밍할수 있지만, 모든 부분을 고려한것이 아니며 생각치도 못한 부분에서 오류가 발생하기 쉽다. 

 그래서 구현 가능한 부분을 덩어리로 나누어 만들면, 개발자가 구현하기 쉽고 오류가 발생하였을 시에 수정이 용이해질수 있다.

즉, 개발자가 구현하기 쉽게 공통된 부분을 뽑아 구현해 나가는 과정을 추상화라 한다. 

3.4 다형성(Polymorphism)

 다형성은 하나의 함수나 클래스가 다양한 방법으로 동작이 가능한 것을 의미한다.

 예를 들어 본인은 게임 클라이언트 프로그래밍 할때는 C# 이라는 언어를 사용한다. 그런데, 서버 클라이언트 프로그래밍 할때는 PHP라는 언어를 사용한다. 이렇게 같은 사람인데 하는 일에 따라 사용하는 도구가 달라지는 것을 다형성이라 할수 있다.

즉, 하나의 변수명, 함수명 등이 상황에 따라 다른 의미로 해석될 수 있는 것을 다형성이라 말한다.

Who's 부운영자

profile

<빌립보서 4장 10절-13절> "내가 주 안에서 크게 기뻐함은 너희가 나를 생각하던 것이 이제 다시 싹이 남이니 너희가 또한 이를 위하여 생각은 하였으나 기회가 없었느니라 내가 궁핍하므로 말하는 것이 아니라 어떠한 형편에든지 내가 자족하기를 배웠노니 내가 비천에 처할 줄도 알고 풍부에 처할 줄도 알아 모든 일에 배부르며 배고픔과 풍부와 궁핍에도 일체의 비결을 배웠노라  내게 능력 주시는 자 안에서 내가 모든 것을 할 수 있느니라 "


List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
87 기타자료 무료 온라인 C++/C# 강좌 사이트 code academy가 정말 좋은데 C++나 C#이 없어서 많이 아쉽습니다. 그래서 찾다 보니 이런곳이 있군요. 코스와 챌린지 등으로 구성되어 있고, 꽤 많은 언어들이 있... 1 부운영자 2017.10.30 158
86 기타자료 '기차모델'로 갈아탄 'C++17'이 가져온 변화는? &#039;기차모델&#039;로 갈아탄 &#039;C++17&#039;이 가져온 변화는? ‘기차모델’로 갈아탄 ‘C++17’이 가져온 변화는? Bloter.net 블로터 / 2017-10-13 1 부운영자 2017.10.14 146
85 c++ 객체지향프로그래밍 (C++) 본 강좌에서는 대표적인 객체지향 프로그래밍 언어인 C++ 언어에 대해 학습함으로써 객체지향 프로그래밍 언어의 필요성 및 개념을 이해하고, 응용 문제 해결을 ... 부운영자 2016.03.06 117
84 객체지향 [객체지향] 객체지향 기법 ▣ 객체지향의 개념 - 실 세계의 개체(Entity)를 속성(Attribute)과 메소트(Method)가 결합된 형태의 객체(Object)로 표현하는 개념 - 객체간의 메시지 통신을 통... 부운영자 2016.03.06 134
83 객체지향 객체지향 프로그래밍이란? 객체지향 프로그래밍 특징 및 장점 객체지향 프로그래밍의 가장 큰 특징은 클래스를 이용해 연관 있는 처리부분(함수)과 데이터 부분(변수)를 하나로 묶어 객체(... 부운영자 2016.03.06 126
» 객체지향 객체지향 프로그래밍(Object-Oriented Programming, OOP) 객체지향 프로그래밍(Object-Oriented Programming, OOP) 1. 정의 프로그래밍을 객체라는 단위로 나누고, 각 객체간의 상호작용으로 설계하고 작성하는 개념이자 ... 부운영자 2016.03.06 281
81 객체지향 객체 지향 프로그래밍 부운영자 2016.03.06 143
80 c++ 63 Stack Unwinding 스택풀기 부운영자 2014.12.01 354
79 c++ 62 예외처리의 매카니즘 부운영자 2014.12.01 228
78 c++ 61 기존의 예외처리 방식 부운영자 2014.12.01 214
77 c++ 60 템플릿의 원리 부운영자 2014.12.01 239
76 c++ 59 클래스 템플릿 부운영자 2014.12.01 201
75 c++ 58 함수 템플릿 부운영자 2014.12.01 197
74 c++ 57 템플릿 부운영자 2014.12.01 239
73 c++ 56 사용자 정의 string 클래스 부운영자 2014.12.01 179
72 c++ 55 표준 string 클래스의 이해 부운영자 2014.12.01 188
71 c++ 54 대입 연산자 오버로딩 부운영자 2014.11.28 196
70 c++ 53 cout, cin 그리고 endl의 원리 이해 부운영자 2014.11.28 419
69 c++ 52 교환 법칙의 해결 부운영자 2014.11.28 205
68 c++ 51 단항 연산자 오버로딩2 부운영자 2014.11.28 224
목록
Board Pagination Prev 1 2 3 4 5 Next
/ 5

서버에 요청 중입니다. 잠시만 기다려 주십시오...