일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- 상태 관리 라이브러리
- 개발
- tanstack query
- 스나이퍼팩토리
- 리액트프로젝트
- 웅진씽크빅
- 프로젝트캠프
- 공식문서
- TypeScript
- 수코딩
- React Query
- frontend
- 프론트엔드 개발
- 유데미
- Server State
- STATE
- 프론트엔드
- sucoding
- React
- Today
- Total
yunicornlab
JavaScript의 특징 - 멀티 패러다임 언어 본문
이번엔 자바스크립트의 멀티 패러다임 언어라는 특징에 대해 알아보자.
먼저, 프로그래밍 패러다임에 대해서 알아보고, 각각의 패러다임의 특징에 대해 알아본 후에
자바스크립트는 왜 멀티 패러다임 언어인 것인지에 대해 알아볼 것이다.
프로그래밍 패러다임(Programming Paradigm)이란?
"패러다임"은, 어떤 한 시대 사람들의 견해나 사고를 규정하는 인식의 쳬계, 이론적 틀이나 개념의 집합체를 말한다.
간단히 말해, 생각 방식을 말하는 것이다.
프로그래밍 패러다임은 프로그래밍의 관점(프로그램을 어떻게 바라볼지), 프로그래밍 언어를 사용하는 방식, 접근 방식과 같은 것을 말한다.
프로그래밍에 대해 알아본 글에서 말했듯이, 결국 프로그래밍이란 문제 해결 과정을 말하는 것이기 때문에
프로그래밍 패러다임도 문제를 해결하기 위한 방법론, 즉 문제 해결 방식이라고 생각하면 된다.
프로그래밍 패러다임의 종류
프로그래밍 패러다임에는 대표적으로 명령형 프로그래밍과 선언형 프로그래밍이 있다.
이 외에도 많이 있지만, 대표적인 패러다임 위주로 살펴보자.
그리고, 명령형 프로그래밍에는 대표적으로 절차적 프로그래밍과 객체 지향 프로그래밍이 있고,
선언형 프로그래밍에는 대표적으로 함수형 프로그래밍과 논리형 프로그래밍이 있다.
1) 명령형 프로그래밍
명령형 프로그래밍은 프로그램이 어떤 작업을 어떻게 수행해야 하는 지 명시적으로 기술한다.
그리고 컴퓨터가 실행할 명령들을 실행 순서대로 구현한다.
1-1) 절차적 프로그래밍 (Procedural Programming)
"절차적"이라는 말 답게, 순차적으로 실행되는 명령어들의 집합으로 구성된다.
C언어는 절차적 프로그래밍 특징을 가지고 있다.
1-2) 객체 지향 프로그래밍 (Object-Oriented Programming, OOP)
이름에서 알 수 있듯이, 데이터와 데이터를 조작하는 방법을 묶어서 객체로 표현하는 방식을 말한다.
상속, 다형성, 캡슐화, 추상화 등의 개념을 사용해서 코드의 재사용성과 확장성을 높인다.
Java, Python, C++, 그리고 JavaScript는 객체 지향 프로그래밍 특징을 가지고 있다.
2) 선언형 프로그래밍
무엇을 수행할지만 기술하고, 어떻게 수행할지는 작성하지 않는다.
문제의 해결 방식은 기술하지 않고, 프로그램의 목적을 서술하는 데 중점을 두는 방식이다.
2-1) 함수형 프로그래밍 (Functional Programming)
순수 함수를 사용해 상태 변경과 부작용을 피하는 방식의 패러다임이다.
불변값을 사용하고 사이드 이펙트가 발생하지 않는다.
2-2) 논리형 프로그래밍 (Logic Programming)
사실과 규칙을 정의하고, 논리적 추론을 통해 문제를 해결하는 패러다임이다.
멀티 패러다임 언어(Multi-Paradigm Languages)란? (또는 다중 패러다임 언어)
멀티 패러다임 언어(Multi-paradigm Language)는 여러 프로그래밍 패러다임을 지원하는 언어를 말한다.
즉, 절차적 프로그래밍이면서 객체 지향 프로그래밍일 수 있다는 것이다.
하나에만 국한되지 않기 때문에 다양한 접근 방식으로 문제를 해결할 수 있어 문제마다 적합한 패러다임을 선택할 수 있는 유연함을 가질 수 있다.
JavaScript는 명령형, 절차적, 객체 지향, 함수형, 반응형 프로그래밍 패러다임을 지원하는 멀티 패러다임 언어다.
Java, Python, C++도 명령형, 절차적, 객체 지향, 함수형을 지원하는 멀티 패러다임 언어다.
객체 지향 프로그래밍의 종류
자바스크립트의 명령형, 절차적, 객체 지향, 함수형 프로그래밍 중 객체 지향 프로그래밍 특징에 대해 알아볼 것이다.
그런데, 객체 지향 프로그래밍도 이 안에서 종류가 나뉜다!😖
대표적으로는 클래스 기반의 객체 지향 프로그래밍과 프로토타입 기반의 객체 지향 프로그래밍이다.
클래스 기반 객체 지향 프로그래밍 (Class-based OOP)
클래스 기반에서는 클래스를 사용해 객체의 구조를 정의한다.
클래스는 일종의 청사진 역할로, 객체는 클래스의 인스턴스로 생성된다.
Java와 C++과 Python은 클래스 기반의 객체 지향 프로그래밍 특징을 가진다.
프로토타입 기반 객체 지향 프로그래밍 (Prototype-based OOP)
프로토타입 기반에서는 클래스를 사용하지 않고, 객체가 다른 객체를 복제해 생성된다.
그리고 프로토타입 체인을 통해 다른 객체의 속성과 메서드를 상속받는다.
JavaScript는 바로 프로토타입 기반의 객체 지향 프로그래밍 언어이다.
JavaScript에도 class가 있는데?? 그럼 클래스 기반 객체 지향 아닌가?
또 의문이 생겼다. 자바스크립트에도 class가 있는데, 프로토타입 기반 객체 지향 설명에 클래스를 사용하지 않는다고 해서 혼란이 왔다.
알아보니, 순서는 이랬다.
자바스크립트는 애초에 프로토타입 기반의 객체 지향 프로그래밍으로 만들어졌다. 이때는 class가 없었다.
class는 2015년, ES6에서 처음 도입되었다.
그렇다면, 도입된 이후에는 클래스 기반으로 동작하는가?? 아니다!
클래스 문법은 도입되었지만, 내부적으로는 여전히 프로토타입 체인을 사용해서 동작한다.
그래서 class 도입은 프로토타입 기반의 상속을 더 쉽게 구현할 수 있게 도와주는 구문적 설탕(Syntactic Sugar)이라고 표현한다.
그리고 일반적으로 클래스 기반 언어에서 class를 사용하는 것이 자바스크립트에서 class 사용하는 것보다 더 엄격한 문법을 가진다.
클래스 기반 객체 지향에서의 class와 JavaScript에서의 class의 차이점은?
그렇다면! 클래스 기반 객체 지향 언어에서 class 문법을 쓰는 것과,
JavaScript에서 class 문법을 사용하는 건 어떤 차이가 있을까?
(참고로 Python은 또 클래스 기반에서도 독특한 특징을 가진 것이 있어서 아래 내용이 모든 클래스 기반 객체 지향 언어에 해당되는 내용이 아닐 수 있다.)
1. 상속
: 클래스 기반에서는 클래스를 정의한 것을 인스턴스화해서 객체를 생성하고 클래스 상속을 통해 상속 계층을 형성하지만,
자바스크립트는 클래스 문법을 사용했어도 내부적으로는 객체를 프로토타입 체인을 통해서 상속받아 생성한다.
2. 동적 확장
: 클래스 기반에서는 클래스의 구조, 즉 속성과 메서드가 정적으로 정의되기 때문에, 한 번 정의되면 해당 클래스를 기반으로 생성된 인스턴스는 동일한 구조를 가진다. 그리고 이 객체의 구조를 런타임에서 변경하는 것은 일반적으로 어렵다.
하지만, 자바스크립트는 객체가 유연한 편이라 런타임에서 속성과 메서드를 동적으로 추가하거나 변경할 수 있다.
3. 메서드 바인딩
: 클래스 기반에서는 메서드가 클래스 정의 내에서 정적으로 바인딩되고,
자바스크립트에서는 메서드가 프로토타입 객체에 바인딩된다.
4. 접근 제어자
: 클래스 기반에서는 보통 접근 제어자인 public, private, protected를 사용할 수 있다.
자바스크립트에서는 원래 접근 제어자가 없었다가, ECMAScript 2022(ES13)에서 # 문자를 사용한 private 필드가 도입되었다.
객체 지향에 대해서 다음에 더 자세히 알아보자!
'Frontend > JavaScript' 카테고리의 다른 글
화살표 함수 사용을 위한 문법 (0) | 2024.12.11 |
---|---|
JavaScript의 핵심! 실행 컨텍스트 이해하기 (0) | 2024.08.07 |
JavaScript의 특징 - 동적 타입 언어 (0) | 2024.07.17 |
JavaScript의 특징 - 싱글 스레드 언어 (0) | 2024.07.15 |
JavaScript의 특징 - 인터프리터 언어 (0) | 2024.07.14 |