티스토리 뷰

프로그래밍을 한다면 요즘은 대부분 객체지향 프로그래밍을 하고 있다.

그렇다면 그 이전에는 어떠한 패러다임을 가지고  프로그래밍을 하였을까?

 

목차

  • 절차적 프로그래밍 (Procedural Programming)
  • 구조적 프로그래밍 (Structural Programming)
  • 객체지향 프로그래밍 (OOP, Object Oriental Programming)

절차적 프로그래밍 (절차 지향 프로그래밍)

프로그래밍의 초창기에는 대부분 절차 지향적 프로그래밍 방식을 사용했다.

즉, 자료 입력을 받아서 이미 작성한 순서대로 처리를 한 다음에 그 처리 결과를 출력해내는 방식이다.

명령의 단순한 순차적 수행은 물론이고 매서드, 함수, 루틴, 서브루틴 등 (프로시저)을 이용한 프로그래밍이다.

 

그런데, 이러한 방식은 물 흐르듯 순서대로만 하면 잘 진행될 것 같지만

일단 무엇인가에 대한 순서와 절차를 올바르게 작성한다는 것부터 쉬운 일이 아니다. 

이미 잘 알고 있는 것이라면 순서도를 작성하는 것이 쉽다.

 

예컨대, 라면 만들기에 대한 순서를 만드는 것은 누워서 떡먹기처럼 쉽다.

그러나, 헌법소원에 대한 자동 프로그램을 만든다면 갑자기 앞이 캄캄해질 것이다.

물론 로직을 파악하기 위한 절차가 따로 존재하겠지만

미지의 것에 대한 최상의 순서와 절차를 만든다는 것은 매우 어렵다는 것이다.

 

한편 절차적 프로그래밍은 Goto문을 좀 사용하게 되면 그때부터 그 코드는 억지스러운 운 순서를 갖기 시작한다.

원치 않는 스파게티를 만나게 된다. 

그래서 그 유명한 난잡한 "스파게티 코드"가 만들어진다.

 

구조적 프로그래밍 

위에서 언급한 절차적 프로그래밍의 단점들 특히 Goto문으로 인한 갑작스러운 순차 진행의 변경 등을 해결하기 위한 논문이 나왔다.

그것은 다익스트라(dijkstra)의 "Goto문의 나쁜 점"이다.

이 논문에서 그는 순서에만 너무 신경 쓰지 말고 프로그램을 함수 단위로 쪼개서 함수(프로시저) 간에 상호 호출이 가능한 구조로 프로그래밍을 하자고 제안했다.

이 방식은 하나의 큰 프로그래밍을 함수 단위의 작은 몇 개의 프로그래밍으로 나누어서 하는 하향식(Top-down) 프로그래밍이다.

그러나 자료를 처리하는 함수(프로시저)를 구조화했지만 함수에 대입되는 많은 자료들을 구조화하지 못했다.

결국엔 구조적 프로그래밍 방식도 크게 보자면 절차적 프로그래밍의 아류일 수밖에 없다. 

 

객체지향 프로그래밍

프로그래밍으로 구현하고자 하는 현실 세계의 대상(Entity)을 가상 세계(프로그래밍 세계?)의 객체(Object)로 만들자는 것이다. 자동차라는 완성체를 만들 때 여러 부품들이 결합되어 만들어진다. 그것처럼 소프트웨어 작성 시에도 "클래스"를 이용하여 여러 부품을 만들어 그 부품들을 결합하여 하나의 객체로 만들자는 것이다.

프로그래밍 사례
대상의 부품화

일단 프로그램을 함수 및 데이터로 묶은 객체들의 집합으로 구성한다.

이 방식은 위에서 언급한 하향식 (Top-down) 이 아니라 상향식 (Bottom-up) 해결법이다.

즉, 큰 문제를 한 방에 처리하는 것이 아니라 작은 문제로 여러 개로 쪼갠 다음에 그 작은 문제들의 해결책을 객체 단위로 만들어 놓은 후에 조합하여 큰 문제를 해결하는 것이다.

 

이런 방식으로 신뢰할 수 있는 부품(객체)을 만들어 놓으면 재사용이 가능하기 때문에 프로그램 개발을 위한 시간과 비용 등이 상당히 단축될 수 있다.

 

예컨대, A라는 자동차를 구현하는 객체지향 프로그래밍에서 문짝, 바퀴 등과 같은 클래스 (부품)를 만들어 놓았다면 B라는 자동차를 만들 때 그 부품들을 갖다가 그냥 사용하면 된다.

 

이러한 객체지향 언어에는 Smalltalk, Java, C++, Python 등이 있다.

 

public class Car { //자동차 구현하기 위한 클래스
	String name;
    int wheel;
    boolean start;
    String color;
    
    void srart(){ // 자동차 시동여부를 알수 있는 메소드
    System.out.println("시동이 걸렸습니다.");
    start=true
    }
}