본문 바로가기
ComputerScience/Languages

[프로그래밍언어] 절차지향 vs 객체지향 vs 함수형 프로그래밍

by Develaniper 2021. 5. 26.

1. 개요

 절차지향, 객체지향, 함수형 프로그래밍등 코디의 기초라고 할 수 있는 것들을 잘 알고 있을까?

각각의 차이점을 말하라고 한다면 잘 말 할 수 있을까? 라고 물어보면 그렇지않나? 라는 자신감 없는 대답이 나올 것 같다. 따라서 이번 포스팅을 통하여 정리해 보고자 한다.

 

2. 프로그래밍 패러다임

프로그래밍 패러다임

 - 프로그래머에게 프로그래밍 관점을 갖게하고 코드를 어떻게 작성할지 결정하는 역할을 한다. 새로운 프로그래밍 패러다임을 통해서 새로운 방식으로 생각하는 법을 배우게 되고, 이를 바탕으로 코드를 작성하게 된다.

 

최근의 프로그래밍 패러다임

  • 명령형 프로그래밍 : 무엇(What) 할건지를 나타내기 보다 어떻게(How)을 할 건지 설명하는 방식
    • 절차지향 프로그래밍 : 수행되어야 할 순차적인 처리 과정을 포함하는 방식
    • 객체지향 프로그래밍 : 객체들의 집합으로 프로그램의 상호작용 표현
  • 선언형 프로그래밍 : 어떻게(How) 할건지를 나타내기 보다 무엇(What)을 할 건지 설명하는 방식
    • 함수형 프로그래밍 : 순수 함수를 조합하고 소프트웨어를 만드는 방식

 

3. XX지향(형) 프로그래밍

1) 절차지향 프로그래밍

- C언어, 파스칼, 코볼

- 특징

  • 초기의 프로그래밍 방식으로, 일이 진행 순서대로 프로그래밍 하는 방법( 데이터의 흐름에 기반한 프로그래밍 )
  • 순차적인 처리가 중요하며 프로그램 전체가 유기적으로 연결되도록 만드는 프로그램 기법
  • 함수로 부터 데이터를 받아서 기능을 구현하는 방식
  • 컴퓨터의 작업 처리방식과 유사하여 상대적으로 더 빠르다.
  • 순서와 흐름을 먼저 세우고 필요한 자료구조와 함수들을 설계하는 방식.
  • '프로그램이 무슨일을 하는가?' 라는 사고에서 비롯된 개념(기능적 가치)
  • 상위로부터 하위로 쪼개 나가는 방식 때문에 Top-down방식이라고도 함(큰 문제를 해결하기 위해 몇개의 작은 문제들로 나누어 해결)

- 단점

  • 각 코드의 순서가 민감하게 연결되어있어, 규모가 커지고 복잡도가 올라갈 수록 유지보수 및 분석에 어려움이 있다.

2) 객제지향 프로그래밍

- 'JAVA', 'C++', 'Python' 등 최근언어는 모두 적용

  • 모든 데이터를 객체로 취급하고, 객체가 처리 요청을 받았을 때, 객체 내부의 기능을 사용해 처리하는 방법
  • 함수보다 데이터를 표현하는 객체 중심으로 프로그래밍하며 객체간의 유기적인 동작을 한다.
  • 자료구조와 이를 중심으로 한 모듈들을 먼저 설계한 다음에 실행 순서와 흐름을 짜는 방식
  • '현실세계의 어떤 대상을 모델링 하는가?'의 관점으로 바라본 프로그래밍 기법
  • 객체들을 조합하여 큰 문제를 해결하는 Bottom-up방식을 지향함(작은 문제를 해결 해결할 수 있는 객체를 만든 후 이를 조합하여 큰 문제를 해결)
  • 독립성/신뢰성 높게 만들어 놓으면 이후 재사용가능 -> 개발기간, 비용이 줄어듦
  • 객체지향의 특성
    - 캡슐화 : 데이터와 함수를 하나로 묶는 것
    - 정보은닉 : 캡슐화에서 가장 중요한 개념으로, 다른 객체에게 자신의 정보를 숨기고 연산만을 통해 접근허용( 세부적인 내용을 숨김으로써 응집도를 높이고 결합도를 낮춘다. )
    - 추상화 : 객체의 중요한(공통된) 속성에만 중점을 두어 모델화 하는 것
    - 상속성 : 이미 정의된 클래스의 모든 속성, 연산을 물려받는 것
    - 다형성 : 메시지에 의해 클래스가 연산을 수행하게 될 때 각 객체가 가지고 있는 고유의 방법으로 응답할 수 있는 능력(오버라이딩)

- 단점

  • 처리 속도가 상대적으로 느리다.
  • 설계에 많은 시간이 소요된다.

 

※정보은닉의 이유

https://effectiveprogramming.tistory.com/entry/객체지향-정보-은닉information-hiding에-대한-올바른-이해

 

객체지향의 올바른 이해 : 5. 정보 은닉(information hiding)

우리가 어떻게 해서 유연성을 확보할 수 있었는가? 그것은 추상화(Abstraction)에서부터 시작되었다. 추상화를 통해 우리는 여러 요구사항들 중에서 공통점을 찾고, 이 공통점에서 목표한 것과 관

effectiveprogramming.tistory.com

다음 블로그에서 정보은닉에 대해 자세하게 다루고 있다. 여기서는 간단하게 요약을 해보고자 한다.

 

정보은닉은 객체지향의 궁극적인 목적이라 할 수 있다. 객체지향언어를 사용하여 기능의 수정/ 추가/ 교체를 수월하게 하기 위해 세운 전략이기 때문이다. 또한 객체지향의 대부분의 언어적 특성은 정보은닉을 위해 만들어진 것들이라고 볼 수 있다.

 

단순히 정보를 숨기는 것이 정보은닉의 목적이라고 할 수 없을 것이다. 정보은닉은 객체가 다른 객체들이 자신을 모르게 하는 것이 가장 이상적인 형태일 것이다. 즉, 존재감이 없는 객체가 가장 정보은닉을 잘 수행하고 있다는 것을 말한다.

 그 이유는 객체가 더 유연해지기 위함인데, 다른 객체가 A객체를 모르고 실행된다는 뜻은 A객체가 수정되거나 변경될때 심지어 없어지더라도 다른 객체들에 전혀 영향이 없는 것이기 때문이다.

 

정보은닉의 종류
  1. 객체의 구체적 타입 은닉(= 상위 타입 캐스팅)
  2. 객체의 필드 및 메소드 은닉(= 캡슐화)
  3. 구현 은닉(= 인터페이스 및 추상 클래스 기반 구현)
    ( 세가지 다른 케이스가 아니라 겹쳐있을 수 있다.)
정보은닉의 목적
  1. 구체적인 코드(타입, 메소드, 구현)에 의존하는 것을 막아줌으로써 객체간 구체적인 결합도를 약화시킨다.
  2. 동일한 타입의 다른 구현 객체들을 교체하며 동적으로 기능을 변경할 수 있게 함(추상클래스 OR 인터페이스 활용)
  3. 연동할 구체적인 구현이 없는 상태에서도 정확한 연동 코드 생성이 가능하다. 즉, 연동할 객체가 변경되거나 삭제되더라도 연동하는 코드에 영향을 끼치지 않는다.(추상클래스 OR 인터페이스를 이용)

3) 함수형 프로그래밍

- 클로저, 하스켈, 리스프

  • 함수 자체가 일급객체가되는 프로그래밍 기법. (객체지향에서는 클래스(또는 Object)가 일급객체이다.)
    일급 객체란 다른 요소들과 아무런 차별이 없는 객체를 뜻함.
  • 상태값을 지니지 않는 함수들의 연속. (객체지향에서는 프로그램에서 상호작용하는 객체들의 집합)
  • 값의 연산 및 결과 도출 중심으로 코드작성이 이루어짐.
  • 함수는 인자로 받은 값을 별도로 저장하지 않고, 간결한 과정으로 처리하고 매핑하는데 목적을 둠.
  • 객체지향보다 코드가 간결하여 사이드이펙트를 미연에 방지한다.
  • 데이터형에 구애받지 않는다.

명령형과 선언형 자바스크립트 비교

- 명령형

function mult2 (arr){
    let results = []
    for(let i=0; i<arr.length; i++{
    	results.push(arr[i]*2);
    }
    return result
}

- 선언형

function mult2(arr){
    return arr.map((v) => item *2);
}

 위에서 보는바와 같이 명령형(절차/객체 지향)은 어떻게(HOW) 하는지 차근차근 풀어쓰는 반면 선언형(함수형) 프로그래밍은 무엇(What)을 할것인가를 짧게 나타낸다.

 

  명령형 프로그래밍 함수형 프로그래밍
프로그램이란? 명령의 수행이다. 함수의 계산이다.
중점적 시각 How What
이론적 배경 튜링 머신 람다 계산식
주요 프로그래밍 언어 C언어, 자바 등 Scheme, Haskell, ML, Erlang

 

https://velog.io/@sgyos000/함수형-객체지향-프로그래밍
https://jhnyang.tistory.com/322
https://velog.io/@jonah/객체지향-언어의-특징
https://daehwa123.com/181



댓글