티스토리 뷰

반응형

0. 객체지향 프로그래밍 & 절차적 프로그래밍 

: 프로그램을 어떻게 설계해야하는지에 대한 개념이자 방법론이다. 




1. 객체지향 프로그래밍 

: Object-Oriented Programming, 줄여서 OOP라고 한다. 

프로그램을 단순히 데이터와 처리방법으로 나누는 것이 아니라,

'객체'라고 불리우는 수많은 기본단위로 쪼갬으로써 이 객체들의 상호작용을 이용해 프로그래밍을 하는 방식이다.

큰 문제를 작게 쪼개는 것이 아닌, 작은 문제들을 해결할 수 있는 객체들을 만든 후 조합하여 큰 문제를 해결하는 상향식(Bottom-up) 해결법이다.


절차적 프로그래밍에서는 데이터(원료)가 함수(기계) 사이를 통과하면서 차츰 차츰 데이터가 가공되어 나가는 방식이라면,

객체지향 프로그래밍은 반대로 메소드가 데이터에 접근해서 수정한다는 개념이다.

즉 원료가 움직이느냐(절차적프로그래밍) / 기계가 움직이느냐(객체지향프로그래밍)의 차이.


초기 프로그래밍 방식은 절차지향적 프로그래밍이었으나 그 단점을 보완,극복하기 위하여 객체지향 프로그래밍이 대안으로 제시되었다.

대표적인 언어로 JAVA,Ruby,Python,C++ 등이 있다.


1_1. 특징


- 캡슐화(Encapsulation)

: <코드를 재수정없이 재활용하기> 위한 객체지향 프로그래밍의 기본 개념 중 기본.  

동일한 목표를 가진 기능들이 함수 및 데이터가 곳곳에 분산되어 있으면 코드를 재활용하기가 힘들다.

따라서 관련 기능과 특성을 한곳으로 모아 클래스(Class)라는 캡슐에 집어 넣는 것이다. 

이 클래스를 실체화(Instance)하면 객체(Object)를 만들 수 있다.

예시) 붕어빵틀과 붕어빵들 간의 관계 _ 다같이 붕어빵 틀(클래스)에서 태어났지만 붕어빵 A(인스턴스)와 붕어빵 B(인스턴스)는 엄연히 다른 존재다.


- 상속(Inheritance)

: '라이브러리'의 단점을 보완하기 위해 도입된 대안. 

상속을 이용해 부모 클래스의 특성과 기능은 그대로 물려받되, 기능의 일부분을 수정하고 싶은 경우 상속받은 자식 클래스에서 해당 기능만을 다시 정의하여 수정할 수 있다. (덮어쓰기, 재정의, Override) 

당연히 부모클래스에게는 아무런 영향도 없다.


cf) 라이브러리의 단점 

: 코드의 재활용을 가능케 했던 방식이었으나, 라이브러리의 기능을 바꾸기 위해 소스코드를 수정할 경우 "전혀 다른" 라이브러리가 된다는 치명적인 단점이 있었다.

즉, 동일한 프로그램의 작동 유무가 라이브러리 버전에 심하게 의존하게 되고 이로 인해 불필요한 코드수정작업이 생기는 것.


- 다형성(Polymorphism)

: 하나의 변수명&함수명이 상황에 따라 다르게 해석될 수 있는 것.

앞서 서술했던 오버라이딩 말고도, 변수에 따라 함수 기능이 달라지는 '오버로딩'도 이에 해당한다.



1_2. 장단점

: 코드의 재사용성 덕분에 개발시간을 단축시킬 수 있다. 하지만 상속이라는 양날의 검을 지닌 특성때문에,

다중상속이나 순환상속(죽음의 다이아몬드, the Deadly Diamond of Death) 문제가 생기면 코드의 난이도가 굉장히 올라간다.



2. 절차적 프로그래밍

: Procedural Programming. Procedure가 '절차'라는 의미가 아닌 '프로시져'(함수)에 중심을 둔 의미임에 유의할 것. 

프로시저(함수)를 이용하여 프로그래밍하기 때문에 코드의 재활용성을 높일 수 있다.

뿐만 아니라 함수 호출을 이용해 함수 내의 여러 부분을 생략할 수 있기 때문에 프로그램 흐름도 쉽게 볼 수 있고 가독성도 높아진다.

하지만 프로시저를 호출하는 것은 단순히 코드를 쓰는 것보다 시간이 더 많이 소모된다는 단점이 있다. 더 복잡한 과정을 거치기 때문. 

이러한 문제는 C++에서 지원하는 인라인 함수로 해결할 수 있다. (본격 프로시저를 프로시저가 아닌 것처럼 사용하기)

게다가 하드웨어 성능도 나날히 발전하고 있기 때문에 함수 콜 오버헤드에 대한 걱정은 점점 옛것이 되어가는 중.


2_1. 문제점 

: 간단한 알고리즘이면 모를까 조금만 복잡해져도 순서도로 나타내는 것이 불가능한 '스파게티 코드'가 나올 수 있다. 

스타크래프트를 순서도로 그려야 한다고 상상해보면 이해할 수 있는 대목. 

이 때문에 구조적 프로그래밍이 제안되었고  결국엔 객체지향 프로그래밍이 등장하게 된다.





반응형

'개인 서재..* > 개념정리' 카테고리의 다른 글

#1. 디버깅  (0) 2016.12.28
댓글