멀티 패러다임, JavaScript

young-gue Park·2023년 1월 10일
0

JavaScript

목록 보기
2/20
post-thumbnail

⚡ 패러다임에 따른 프로그래밍 방식


📌 패러다임이란?

  • 한 시대의 사람들의 견해나 사고를 근본적으로 규정하고 있는 인식의 체계. 또는, 사물에 대한 이론적인 틀이나 체계. 순화어는 `틀'. (Oxford Languages)
  • 패러다임은 프로그램이 순차, 분기, 반복, 참조로 구성된다는 점을 이용한다
  • 이용 방식에 따라 크게 절차지향과 객체지향, 함수형으로 구분할 수 있다.

💡 자바스크립트는 멀티 패러다임이기 때문에 가릴 필요 없이 다 써도 된다!


📌 함수형 패러다임

  • 변수 할당에 데이터를 부과하고 함수 안에 데이터를 담는 데이터 파이프라인을 사용한다.
  • 객체지향 추상화의 최소 단위가 객체인 것 처럼 함수형은 함수가 최소 단위이다.

💡 장점

1) 함수 단위로 나눠지므로 재사용성이 높다
2) 불변성을 지향하여 동작 예측이 쉽고 사이드 이펙트를 방지한다. (스레드로 인한 동시성 문제 해결)
3) 코드가 짧고 간결하다

물론 이 장점들은 단점으로 작용할 수도 있다... 😵‍💫 (콜백지옥 등)


📌 객체 지향 패러다임

💡 객체?

  • 현실에 존재하는 것을 추상화한 것

    추상: 사물이 지니고 있는 여러 측면 중 특정한 부분만 보는 것

💡 객체 지향

1) 객체 위주로 설계하고 프로그래밍 하는 패러다임
2) 객체지향 언어에서는 추상회의 최소 단위가 객체
3) 각각의 객체는 메시지를 주고 받기가 가능

💡 JavaScript에서는 어떻게 사용할까?

1) 클래스 기반 언어처럼 속성(Attribute)과 행위(Method)를 정의 가능
2) 객체 리터럴, Object, 생성자 함수 세 가지 방법을 사용
// 객체 리터럴
const person = {
    name: "박영규",
    age: 26,
    move: function (destination) {
        console.log('${destination}(으)로 이동합니다.')
    },
};

// Object 생성자 함수
const person2 = new Object();
person2.name = "박영순";
person2.age = 26;
person2.dance = function(dancing) {
    console.log('{dancing}(을)를 춥니다.');
};

// 생성자 함수
function Person3(name, age, eat) {
    this.name = name;
    this.age = age;
    this.eat = function(eating) {
        console.log('${eating}(을)를 먹습니다.');
    };
}

그런데...

  • 이런 방식으로는 객체를 생성했을 때 메소드가 함께 따라나오면서 메모리가 낭비된다.
  • 그래서 자바스크립트는 프로토타입을 사용하여 이 문제를 해결한다.

📌 프로토타입

💡 기존의 객체를 복사하여 새로운 객체를 생성하는 방식

  • 프로토타입 객체 안에 추가하면 하위 객체들이 상위 객체들을 바라보게 설정한다.
  • 객체들은 각자 프로토라는 내부 객체를 가지게 되고 이 내부에서 상위 개체를 링크한다.
  • 기존 객체를 효율적으로 사용하게 된다.
// 프로토타입 이용 함수
function Person4(name, age) {
    this.name = name;
    this.age = age;
    Person4.prototype.getName = function() {
        return this.name;
    };
    Person4.prototype.setName = function (name) {
        this.name = name;
    };
}
  • 상속을 흉내낼 수 있다. (부모 객체 이용, 부모 생성자 이용, 기존 객체 재활용)
// 부모 생성자로 상속 흉내내기
function Person5(name) {
    this,name = name;
}

Person5.prototype.getName = function() {
    return this.name || "영규";
};

function Korean(name) {
    Person5.apply(this, arguments); // apply를 이용하면 생성자를 빌려쓸 수 있다
}
Korean.prototype = new Person5();
Korean.prototype.setName = function (name) {
    this.name = name;
};

// 기존 객체 재활용
const park = Object.create(person);
park.name = "박영규";

🤷‍♂️ 그렇다면 절차지향은 무엇인가요?

  • 절차지향언어는 개체를 순차적으로 처리하여 프로그램 전체가 유기적으로 연결한다.
  • 컴퓨터의 처리구조와 유사하여 실행속도가 빠르다는 장점이 있다.
  • 다만 유지보수가 어렵고 비효율적인 문제로 인해 객체지향언어가 나오는 계기가 되었다.

패러다임에 관한 개념을 꼭 기억하도록 하자.

profile
Hodie mihi, Cras tibi

0개의 댓글