ARTICLE | 프로그래밍 패러다임

noopy·2021년 8월 3일
3

📃 ARTICLE

목록 보기
1/5
post-thumbnail
post-custom-banner

Week 1. 프로그래밍 패러다임에 대해서 🔥

프로그래밍 패러다임

함수형, 객체지향 프로그래밍 등을 공부하기에 앞서 프로그래밍 패러다임에 대해 알아보자.
프로그래밍: 컴퓨터 프로그램을 작성하는 일
패러다임: 어떤 문제에 대해 대다수의 사람들이 공통적으로 동의하고, 기대고 싶은 모델 또는 가치관.

프로그래밍 패러다임이란, 어떻게하면 그 언어가 가진 목적에 부합하게 사용할 수 있는지,
어떻게하면 해당 언어처럼 사고하는지와 관련된 것이다.

프로그래밍 패러다임이 있기 이전엔, 언어를 사용하며 특정한 원칙 없이 기능을 구현했기 때문에 불필요하고 복잡한 설계를 야기했다.
또한 해당 언어가 가진 효율을 이용해 올바르게 동작하는지 판단할 도구가 확립되어 있지 않았다.

현대에는 다양한 패러다임들이 있으며, 발전과정에서 모든 프로그램은 순차 👉🏻 분기 👉🏻 반복 👉🏻 참조로 구성된다는 사실을 알아냈다.

👩‍⚖️ 명령형 프로그래밍

명령형 프로그래밍'어떻게' 문제를 해결할 것인지를 정의하는 프로그래밍이다.

명령형의 반의어는 선언형이다. 그 둘의 차이점을 아래 예시를 통해 살펴보자.

A가 외식을 하러 나왔을 때 웨이터에게 각각 명령형과 선언형으로 말을 한다.
명령형 방식(HOW): '12번 테이블 자리가 비어있네요. 저 자리에 앉겠습니다.'
선언형 방식(WHAT): '한 명 앉을 자리 부탁합니다.'

명령형 방식은 내가 실제로 자리에 어떻게 앉을지에 대한 단계를 하나하나 나열한다.
반대로 선언형 방식은 어떻게는 남에게 맡기고 무엇을 원하는지에 더 집중되어 있다.

위 예시에서 알 수 있듯이 선언형 방식은 명령형 방식을 추상화 하는 것이다.
즉, 선언형 방식이 잘 작동되기 위해선 명령형으로 어떻게가 구현된 것들이 추상화되어 있어야 한다.

코드를 통해 명령형 프로그래밍을 이해해보자. 🧐

// 배열을 파라미터로 받고, 각 요소 값에 2를 곱하는 함수
function double (arr) {
	let results = [];
  	for ( let i = 0; i < arr.length; i++ ) {
    	results.push(arr[i] * 2)
  	}
  	return results
}

double 함수는 어떻게를 설명하고 있다.
명시적으로 배열을 반복하거나, 원하는 기능을 수행하기 위한 단계를 설명한다.

  • 명령형 프로그래밍은 상태를 변경한다.

    `상태`: 기본적으로 메모리에 저장된 것에 대한 정보. 변수와 비슷

    double 함수는 results 변수를 만든 다음 push를 통해 계속 수정하고 있다.

다음으로, 코드를 통해 선언형 프로그래밍을 이해해보자. 🧐

function double (arr) {
	return arr.map((item) => item * 2)
}
  • 선언형 프로그래밍은 상태를 직접 변경하지 않는다.
    map과 같은 메서드를 통해 추상화되어 어떻게 이루어지는지 신경 쓸 필요가 없다.
    또한 map 메서드 안쪽으로 추상화되어 상태가 직접 변경되지 않는다.

절차지향 프로그래밍

입력한 로직에 따라 순서대로 코드가 실행되는 방식.

특징

  • 프로시저를 통해 코드의 재활용성을 높인다.
  • 함수 호출을 통해 여러 부분을 생략해 코드의 가독성이 높아진다.
  • 스코프를 통해 프로시저가 모듈성을 잘 지키도록 한다.

객체지향 프로그래밍

객체를 통해 데이터와 메서드로 묶고 객체간 통신하는 방식.

절차지향과 객체지향 프로그래밍의 차이는 [절차지향과 객체지향에 관한 고찰]에서 잘 설명되어 있다.

절차지향 프로그래밍은 프로그램의 순서와 흐름을 먼저 세우고 필요한 자료구조와 함수들을 설계하는 방식이고,
객체지향 프로그래밍은 반대로 자료구조와 이를 중심으로 한 모듈들을 먼저 설계한 다음에 이들의 실행순서와 흐름을 짜는 방식이다

그러니까 간단히 말하면, 절차지향큰 흐름에서 작은 흐름으로 설계하고,
객체지향작은 흐름에서 큰 흐름으로 설계한다고 요약할 수 있을 것 같다.

객체지향의 4대 특성 (캡상추다! 🥬)

참고) 프로그래밍 패러다임

특성설명예시
캡슐화접근이 필요한 부분을 제외하고 구체적인 로직은 내부로 숨긴다.getter,setter
상속대상이 되는 클래스의 모든 특징을 물려받는 것.prototype
추상화현실세계 대상을 관찰해 핵심적인 특징(속성과 메서드)을 뽑아내는 과정클래스, 객체
다형성하나의 속성이나 메서드가 상황에 따라 다른 의미로도 해석될 수 있음오버로딩, 오버라이딩

✏️ 정리하면 객체지향 프로그래밍은
추상화: 현실세계 대상을 관찰해 속성과 메서드로 뽑아내어,
캡슐화: 속성과 메서드를 관련있는 것끼리 묶어 구체적인 로직은 내부로 숨긴다.
상속: 상속관계가 있다면 부모 클래스로부터 자식이 상속받고 구체화시킨다.
다형성: 무작정 상속하는 것이 아닌, 매개변수에 따라 다양한 타입을 받아 같은 기능을 하기 위할 때 다형성을 구현한다.

✍️ 선언형 프로그래밍

선언형 프로그래밍은 '무엇을' 해결할 것인지를 정의하는 프로그래밍이다.

함수형 프로그래밍

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

특징

[함수형 프로그래밍이란?]에 함수형 프로그래밍을 한 줄로 요약한 글을 인용하자면,

부수 효과가 없는 순수 함수를 1급 객체로 간주하여 파라미터로 넘기거나 반환값으로 사용할 수 있으며,
참조 투명성을 지킬 수 있다.

  • 순수함수: 함수에 동일한 인자를 주었을 때 항상 같은 값을 리턴하는 함수
  • 1급객체 :보통 함수에 매개변수로 넘기기, 수정하기, 변수에 대입하기와 같은 연산을 지원하는 객체.
  • 참조 투명성: 동일한 input엔 동일한 output을 내는 것. 기존의 값이 변경되지 않고 유지되는 것.

함수형 프로그래밍은 항상 같은 인자에 같은 결과를 리턴하므로, 부작용을 제거해 프로그램의 동작을 예측할 수 있다는 장점이 있다.
JS에서는 map, filter, reduce와 같은 메소드와 재귀함수를 통해 함수형 프로그래밍답게 코드를 구현해볼 수 있다.

느낀점

프로그래밍 패러다임이라는 어휘를 오늘 처음 들어보았고, 정리하면서 다양한 패러다임들의 특징을 파악할 수 있었다.
강의는 눈으로 깜빡하면 지나가지만, TIL로 정리하니 수많은 글들을 참고하는 과정에서 많은 지식을 얻을 수 있었다.
다만 함수형 프로그래밍에 대해 아직 완벽히 이해하지 못해서 서두르지 않고 차근차근 알아갈 때마다 글을 보충해보겠다.
다양한 패러다임들이 실무에 어떻게 적용되는걸까? 이부분은 멘토님께 물어봐야겠다 😉

참고 사이트

profile
💪🏻 아는 걸 설명할 줄 아는 개발자 되기
post-custom-banner

0개의 댓글