프로그래밍의 관점을 갖게하고 결정하는 역할인 프로그램의 패러다임에 대해 알아보겠습니다.

발전하게 된 순서는 '절차적 -> 객체지향 -> 함수형'으로 단점들을 극복을 위해 나왔다고 합니다.

 

 

프로그래밍 패러다임

명령형 프로그래밍(How): 알고리즘을 명시하고 목표는 명시하지 않는다

  • 프로그램의 상태와 상태 변경을 시키는 '구문'의 관점에서 연산을 설명하는 방식
    • 절차적 프로그래밍: 수행되어야 할 연속적인 계산 과정을 포함하는 방식
    • 객체지향 프로그래밍: 객체들의 집합으로 프로그램의 상호작용을 표현
  • 선언형 프로그래밍(What): 알고리즘을 명시 하지않고 목표만 명시한다
    • 어떤 방식(How)가 아닌 무엇(What)과 같은지를 설명하는 방식
      • 함수형 프로그래밍: 순수함수를 보조함수와 조합하는 방식

 

 

명령형 프로그래밍

절차적 프로그래밍 (위키백과)

실행 절차에 중점을 둔 프로그래밍 방식으로 순차적인 처리방식으로 프로그램 전체가 유기적인 연결이 있다. 

순차적인 처리방식은 컴퓨터의 동작 방식과 같아서 처리 시간이 빠르다고 한다.

 

특징

  1. 하나의 큰 기능을 처리하기 위해 작은 단위의 기능들로 나누어 처리하는 Top-Down 방식
  2. 비교적 작은 규모의 작업을 수행하는 함수 생성
  3. 인수, 반환 값으로 명령을 전달하고 수행
  4. 데이터와 함수를 별개 취급
  5. 특정 기능을 수행하려면 해당 메소드를 직접 호출

 

장단점

장점

  • 개인 프로젝트에 적합
  • 객체 지향에 비해 빠르다

단점

  • 대형 프로젝트에 부적합
  • 유지보수가 어렵다
  • 코드 순서가 중욯서 순서 변경 시 다른 결과 초래 가능
  • 분석과 디버깅이 어렵다

 

 

객체지향 프로그래밍 (위키백과, 관련포스팅)

기능별로 모듈화하여 하드웨어가 같은 기능을 중복하지 않게하고 모듈을 재활용하여 하드웨어의 처리량을 줄인다.

'객체'라는 기본 단위로 나누고 이들의 상호작용으로 서술하는 방식

클래스를 이용해 연관있는 처리부분과(함수) 데이터부분(변수)을 하나의 객체(인스턴스)로 묶어 생성, 사용, 작은 문제를 해결하는 객체를 생성해 큰문제를 해결하는 Bottom-Up 방식.

네가지 특징(추상화, 캡슐화, 다형성, 상속)을 지키며 코딩해야하며 이 조건을 지키지 않고 클래스 단위로 프로그래밍하는 것은 객체지향이 아닌, 클래스기반(캡슐화)을 사용하는 것이다.  

 

특징

1. 추상화

현실세계 대상을 관찰하여 핵심적인 특징(속성과 행위)을 뽑아내는 과정이다.

이때 관련있는 것들을 묶게되면 캡슐화가 되고 묶은 개념은 추상화가 되고 주체는 클래스가 된다.

'객체'는 클래스로 부터 실체화 된것으로 눈에 보이며 실체한다.

'클래스'는 추상적이기에 눈에 보이지 않고 개념적으로만 존재한다.

 

2. 캡슐화

속성과 행위를 관련있는 것끼리 묶는다.

여기서 중요한 것은 접근이 필요한 부분을 제외하고 구체적인 로직은 내부로 숨긴다. (=은닉성)

구체적인 로직을 내부로 은닉하는 목적

  • 클래스 내부 구현의 '응집도'를 증가
  • 외부 다른 클래스와의 '결합도'를 감소
    • 이때 일반적인 객체지향언어는 '접근제한자'를 지원한다. (public, private, protected)

 

3. 상속

대상이 되는 클래스의 모든 특징을 물려받는 것, 이때 자식 클래스로 부터 부모 클래스가 대체되어도 의미가 성립되어야한다.

계층형 구조

  • 부모 클래스와 자식클래스는 '상속관계'
  • 관계가 아래로 내려갈수록 '구체화된다'라고 말한다. (=> 고유 특징이 증가)
  • 관계가 위로 올라올수록 '일반화된다'고 말한다. (=> 더 많은 객체에 영향을 준다)

 

장단점

장점

  • 부모 클래스로 부터 물려 받은 특징으로 인해 같은 내용을 다시 구현할 필요가 없어 '코드의 재사용성'이 향상된다.

단점

  • 재 사용성만 고려하여 상속한다면 혼란이 생긴다.
  • 상속은 '다형성'을 구현하기 위해 사용할 것을 권장한다.
    • 좋은 상속관계는 is-a 관계 (~은 ~이다) : 바나나는 과일이다 / 자동차는 바퀴가 있는 탈 것이다
    • 혼란을 줄 수 있는 상속관계는 has-a 관계 : 사람-팔 / 자동차-바퀴 / 새-날개

 

4. 다형성

하나의 속성이나 행위가 상황에 따라 다른 의미로도 해석될 수 있는 특성으로 오버로딩, 오버라이딩을 통해 다형성을 구현 할 수 있다.

  • 오버로딩
    • 매개 변수에 따라 여러 종류의 타입을 받아 같은 기능으로 하도록 하기 위한 작업
    • 자바스크립트는 자유로운 언어이므로 기본 제공하지는 않는다
    • 함수는 변수로 취급하며 모든 변수는 전역 객체로 취급하기 때문에 같은 이름이라면 하나만 취급
    • 따라서 타입체크해서 기능을 구현하도록 함수를 만들 수는 있다
  • 오버라이딩
    • 상위 클래스의 메서드를 하위 클래스에서 재 정의하는 것(상속)

 

 

절차적 프로그래밍과 객체지향 프로그래밍 차이

두 방식이 아예 반대개념이라고 할 수는 없다.

둘다 명령형 프로그램의 하위 개념이기에 공유하는 것이 많다.

그리고 절차적이지 않은 프로그램은 없기 때문이다.

다만

  • 절차적 프로그래밍
    • 프로그램의 순서와 흐름을 먼저 세우고 필요한 자료구조와 함수를 설계
    • (=데이터 중심으로 절차적 실행에 초점)
  • 객체지향 프로그래밍
    • 반대로 자료구조와 함수를 먼저 설계하고 그 후 실행순서와 흐름을 설계
    • (=객체간의 관계에 초점)

 

선언현 프로그래밍

함수형 프로그래밍 (위키백과)

순수함수를 보조함수와 조합하고 소프트웨어를 만드는 방식

로직내에 복잡성을 해결하고 변수사용을 억제하여 상태변경을 피하려는 프로그래밍 패러다임

 

특징

1. 일급객체

사용할때 다른 요소와 아무런 차별이 없는 객체 (자바스크립트 함수는 객체, 일급함수)

  1. 변수나 데이터 구조 안에 담을 수 있다
  2. 파라미터로 전달 할 수 있다
  3. 반환값(return value)로 사용할 수 있다
  4. 할당에 사용한 이름과 관계없이 고유한 구별이 가능하다
  5. 동적으로 프로퍼티 할당이 가능하다
  6. 비교연산이 가능하다

 

2. 고차함수

람다 계산법에서 만들어진 용어로 함수는 함수를 파라미터로 전달할 수 있어야하며 함수의 반환값으로 함수를 사용할 수 있습니다. (일급 객체의 부분집합)

(React의 고차컴포넌트는 컴포넌트를 이용하여 위의 조건을 만족하는 컴포넌트를 말한다)

 

3. 불변성

변하지 않는 성질을 말한다.

자바스크립트는 자유로운 언어로 데이터의 변경이 언제든 가능하나 안되는 언어들이 존재한다.

불변성을 지키기 위해서는 데이터 변경이 필요할 경우 원본을 유지한 채 복사본을 만들어 작업해야한다.

 

4. 순수함수

동일한 입력에는 항상 같은 값을 반환해야한다.

함수의 실행은 프로그램의 실행에 영향을 미치지말아야한다. (Side Effect가 없어야함)

함수 내부에서 인자값의 변경이나 프로그램의 상태를 변경하면 안된다.

 

5. 합성함수

새로운 함수를 만들거나 계산하기 위해서는 둘 이상의 함수를 조합하는 과정을 말한다.

함수형 프로그래밍은 작은 여러개의 함수들로 이루어져 있기에 이러한 함수들을 연쇄적으로 또는 병렬로 호출해서 더 큰 함수를 만드는 과정으로 전체 프로그래밍을 구축한다.

 

 

명령형 프로그래밍과 함수형 프로그래밍 비교

 

명령형 프로그래밍

함수형 프로그래밍

프로그램이란

프로그램은 명령의 수행이다

프로그램은 함수의 계산이다

중점적 시각

어떻게?

무엇?

 

 

객체지향 프로그래밍과 함수형 프로그래밍의 차이

함수형 프로그래밍과 객체지향 프로그래밍은 약간의 차이가 있다.

  • 객체지향: 관리하는 모듈함수에 의한 재사용성에 관심을 가지고 있으며 클래스(또는객체,Object)가 일급객체
    • 클래스와 객체들의 관계를 중심으로 코드 작성
    • 상태, 멤버변수, 메서드 간의 긴밀한 관계
    • 멤버변수의 상태에 따라 결과가 달라짐
  • 함수형: 순수함수와 일급객체에 관심을 가지고 있으며 함수(Function)자체가 일급객체
    • 값의 연산 및 결과 도출 중심으로 코드 작성
    • 함수 내부로 넘겨받은 인자 값을 별도로 저장하지 않으며 간결한 과정으로 처리하고 매핑하는데 주 목적입니다.

 

 

 

+ Recent posts