본문으로 건너뛰기
객체지향 프로그래밍과 절차적 프로그래밍에 대해 알아보자

객체지향 프로그래밍과 절차적 프로그래밍에 대해 알아보자

gunyoung.Park
작성자
gunyoung.Park
Always curious, always exploring new tech
Programming Basics - 이 글은 시리즈의 일부입니다.
부분 1: 이 글

객체지향(OOP)과 절차적 프로그래밍(PP)
#

객체지향언어와 절차지향언어는 절대 반대되는 개념이 아니다. 그렇다면 객체지향언어와 절차지향언어는 무엇인가?

우리는 보통 Java, Python, C# 등의 언어를 객체지향 언어라고 부르며 C언어는 절차지향언어라고 부른다. 하지만 어디까지나 이 언어들이 지향하는 것이지 C언어는 절차적 프로그래밍만 가능하고 Java나 Python 등은 객체적 프로그래밍만 가능하다는 것이 아니다.

어떤 언어를 사용하든 상관없이 절차지향적 프로그래밍을 할 수 있다. 반대로 C언어를 사용하더라도 객체지향적으로 코딩을 할 수 있는 것이다.


‘절차지향’이라는 용어의 오해
#

사실 절차지향적 언어라 하는 것은 잘못된 것이다. 모든 프로그래밍 언어가 절차를 기반으로 두고 있는데 절차를 지향한다는 말은 앞뒤가 맞지 않는다.

하나의 예를 비유하자면:

  • 역도라는 스포츠는 바벨을 이용한 운동을 기반으로 하는 것인데 바벨을 지향하는 스포츠라고 하는 것과 같은 맥락이다.
  • 그럼 역도를 덤벨로 해야 하나…?

다시 말해 절차지향이 아닌 절차적 프로그래밍이 맞는 것이다.

객체지향 프로그래밍(OOP)와 절차적 프로그래밍(PP)는 어디까지나 프로그래밍을 하는데 있어 접근 방식의 차이가 있을 뿐 반대 개념은 아니다!

핵심 차이점
#

  • 절차적 프로그래밍: 데이터를 중심으로 함수를 만들어 사용
  • 객체지향 프로그래밍: 데이터와 기능(함수)들을 묶어 하나의 객체로 만들어 사용

절차적 언어와 객체지향언어를 구분하는 기준
#

여러가지 방식이 있겠지만 큰 틀에서는 아래와 같이 나뉜다.

  1. 캡슐화, 다형성, 클래스 상속을 지원하는가?
  2. 데이터 접근 제한을 걸 수 있는가?

대게 위 기준을 만족하면 객체지향 성향이 강해진다고 보면 된다.


절차적 프로그래밍
#

절차적 프로그래밍은 말 그대로 절차적으로 코드를 구성한다는 것이다.

데이터에 대한 순서를 파악하고 필요한 기능을 함수로 만들어 절차적(순서대로) 진행시키는 방식


객체지향 프로그래밍
#

객체지향 프로그래밍의 경우 기능들을 묶어 하나의 객체로 만든다.

다시 말하면 각각의 객체를 생성하고 그 객체마다 할 수 있는 행위(기능)들과 데이터를 하나로 묶어주는 것이다.

예시
#

자동차 호출 서비스를 구현한다고 가정해보자:

  • 자동차 객체: 자동차가 할 수 있는 행위(기능)를 하나로 묶음
  • 기사 객체: 기사가 할 수 있는 행위를 묶음
  • 승객 객체: 승객이 할 수 있는 행위를 묶음

각 객체의 메소드나 필드를 호출하면서 서로 간의 상호작용을 통해 알고리즘을 구성하는 방식이다.


그럼 어떤 방식이 더 좋은가?
#

정답은 없다. 필요에 맞게 사용을 하고 자신이 선호하는 스타일을 사용하면 된다.

과거의 프로그래밍
#

과거에는 현재처럼 큰 규모의 하드웨어와 소프트웨어가 필요치 않았다. 오래된 언어인 C, 포트란, 코볼 같은 절차적 언어의 대표라 할 수 있는 언어들이 사용되어졌다.

현대의 프로그래밍
#

현대에 들어서면서 점점 소프트웨어 발전이 빨라졌고 이에 따라 코드들도 복잡해져갔다.

그러다 보니 복잡한 알고리즘들이 꼬이기 시작했고 작성한 코드를 사람이 읽었을 때 이해하기 힘들거나 이해할 수 없는 스파게티 코드가 되어버린 것이다.

이러한 문제의 대안으로 객체지향적 프로그래밍이 나온 것이다.


왜 객체지향이 우세한가?
#

다만 현재 기준 객체지향 프로그래밍이 우세하게 사용되어지고는 있다. 그 이유는:

  • 복잡한 프로그래밍일수록 절차적 프로그래밍을 사용한다면 코드들이 꼬이기 쉽다
  • 확장성 측면에서도 유지 보수를 할 때 메리트가 떨어진다

절차적 프로그래밍 장단점
#

장점
#

  • 객체나 클래스 생성 없이 바로 프로그래밍
  • 필요한 기능을 함수로 만들어 복붙하지 않고 호출하여 사용
  • 프로그램 흐름을 쉽게 추적

단점
#

  • 각 코드들의 끈끈한 우정 때문에 수정이 힘들다 (유기성이 높아 추가, 수정이 힘듦)
  • 디버그(오류검사)가 힘듦

객체지향 프로그래밍 장단점
#

장점
#

  • 모듈화, 캡슐화로 유지보수가 편함
  • 객체지향적으로 현실 세계와 유사성에 의해 코드를 이해하기 쉽다
  • 객체는 그 자체가 하나의 프로그램으로 다른 프로그램에서도 재사용이 가능

단점
#

  • 대부분의 객체 지향 프로그램은 속도가 상대적으로 느려지고 많은 양의 메모리를 사용하는 경향이 있음
  • 현실세계와 유사성에 의해 코드를 이해하기 쉽게 만들기 위해 설계 과정에 있어 많은 시간이 들어간다

정답은 없다! 적재적소에 맞추어 사용하자
#

절차적 프로그래밍을 사용하는 경우
#

보통 프로젝트 규모가 크지 않고 재사용할 일이 크지 않는 경우에 많이 사용된다.

장점:

  • 프로그램 자체가 가벼워짐
  • 객체지향으로 만드는 것보다 개발시간과 인력도 줄어듦

객체지향 프로그래밍을 사용하는 경우
#

큰 규모의 프로젝트에서 코드들을 재사용해야 한다면 초기 개발비용을 제외하고 객체지향 프로그래밍이 적합하다.

장점:

  • 유지보수 측면에서 안정적

마무리
#

오늘은 이렇게 객체지향 프로그래밍과 절차적 프로그래밍에 대해 알아보았다. 아직은 깊이있는 내용에 대해서는 알지 못하지만 여러 글들을 찾아보며 객체지향과 절차적 프로그래밍에 대한 큰 틀을 이해하고 넘어가고 다음번에 좀 더 깊이있게 들어가보자 한다!
Programming Basics - 이 글은 시리즈의 일부입니다.
부분 1: 이 글