/**
* 📌 절차적 언어란?
* 순차적인 명령의 조합
* 초기의 프로그래밍 언어는 일반적으로 절차적 언어라고 부름(C, 포트란 등)
*
* 📌 객체 지향 언어란?
* "클래스"라고 부르는 데이터 모델의 청사진을 사용해 코드 작성 -> ✨ 데이터와 기능이 별개로 취급되지 않고, 한 번에 묶어서 처리할 수 있게 되었다!!
* 현대의 언어들은 대부분 객체 지향의 특징을 갖고 있음(java, C++, C# 등)
* JavaScript: 객체지향언어는 아니지만 객제 지향으로 작성 가능!
*
* 📌 OOP란?
* OOP는 프로그램 설계 철학이다.
* OOP의 모든 것은 "객체"로 그룹화된다.
* OOP의 4가지 주요 개념을 통해 재사용성을 얻을 수 있다.
*
* 📌 클래스와 인스턴스란?
* 클래스는 일종의 원형(original form)으로, 객체를 생성하기 위한 청사진이다.
* 인스턴스는 클래스의 사례이다.
* 클래스는 객체를 만들기 위한 생성자(constructor) 함수를 포함한다.
* 생성자 - 세부 사항(속성)을 넣어주는 역할
*
* ✨ OOP 의 4가지 기본개념 ✨
* 1. Encapsulation (캡슐화) - 데이터와 기능을 하나의 단위로 묶는 것 // 안을 보호하기 위해 캡슐로 싸는 것
* 은닉(hiding): 구현은 숨기고, 동작은 노출시킴
* 느슨한 결합에유리: 언제든 구현을 수정할 수 있음
* 🔎 느슨한 결합은 코드 실행 순서에 따라 절차적으로 코드를 작성하는 것이 아니라, 코드가 상징하는 실제 모습과 닮게 코드를 모아 결합하는 것을 의미합니다.
*
* 2. Inheritance (상속) - 상속은 부모 클래스의 특징을 자식 클래스가 물려받는 것입니다. // 부모님에게 재산을 상속받다
* "기본 클래스(base class)의 특징을 파생 클래스(derived class)가 상속받는다"
*
* 3. Abstraction (추상화) - 추상화는 내부 구현은 아주 복잡한데, 실제로 노출되는 부분은 단순하게 만든다는 개념입니다. //
* Simpler Interface: 추상화를 통해 인터페이스가 단순해진다.
* 🔎 추상화의 개념 - https://bigtop.tistory.com/22
*
* 4. Polymorphism (다형성) - "다양한 형태"를 가질 수 있다는 말
*
* ✅ 정리
* 캡슐화는 코드가 복잡하지 않게 만들고, 재사용성을 높입니다.
* 추상화는 마찬가지로 코드가 복잡하지 않게 만들고, 단순화된 사용으로 변화에 대한 영향을 최소화합니다.
* 상속 역시 불필요한 코드를 줄여 재사용성을 높입니다.
* 다형성으로 인해 동일한 메서드에 대해 if/else if와 같은 조건문 대신 객체의 특성에 맞게 달리 작성하는 것이 가능해집니다.
*
* 📌 객체지향 차이점
* 대표적인 객체지향 언어 (Java,TypeScript) 와 JavaScript의 차이점
* 1. 은닉화(private 키워드)의 한계 - JavaScript에서는 은닉화를 돕기 위해서 일반적으로 클로저 모듈 패턴을 사용합니다. 클래스/인스턴스 형태로 만들 때에는 ES2019부터 #이라는 키워드가 도입되었습니다.
* 2. 추상화(interface 키워드) 기능의 부재
*/