> For the complete documentation index, see [llms.txt](https://yong2401.gitbook.io/til-by-ellie/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://yong2401.gitbook.io/til-by-ellie/javascript-12/what_is_oop.md).

# 객체와 객체 지향 프로그래밍(OOP)

* **객체(Object)는** 연관성이 있는 *데이터*와 *함수*(객체 안에 있을 때는 보통 *프로퍼티*와 *메소드*라고 부릅니다)의 집합입니다.
* **객체 지향 프로그래밍 (Object-oriented programming)**

  컴퓨터 프로그래밍 패러다임 중 하나로, 프로그래밍에서 필요한 데이터를 '추상화'시켜 *데이터*와 *함수*를 가진 **객체**를 만들고, 그 **객체**들 간의 상호작용을 통해 로직을 구성하는 프로그래밍 방법입니다.

  ```jsx
  // 객체 리터럴(object literal)
  var person = {
    //* 프로퍼티(속성)(properties, attributes)
    name: ["Bob", "Smith"],
    age: 32,
    gender: "male",
    //* 메소드(methods)
    greeting: function () {
      alert("Hi! I'm " + this.name[0] + ".");
    },
  };

  person.name; // ["Bob", "Smith"]
  person.name[0]; // "Bob"
  person.age; // 32
  person.gender; // 'male'
  person.greeting(); // alert 창: Hi! I'm Bob.
  ```

  **OOP (객체 지향적 프로그래밍)** 는 데이터가 객체 내에 '캡슐화'되고 구성 요소 부분이 아닌 객체 자체가 운용되는 프로그래밍 방식이다. **자바스크립트**는 클래스 기반이 아닌 **프로토타입(prototype)**&#xC5D0; 기초한 **객체 기반 언어**다. \[MDN]
* 객체 지향 프로그래밍은 코드 **재사용성이 높습니다.(상속)** 또한 객체 단위로 코드가 나눠져 작성되기 때문에 **디버깅이 쉽고 유지 보수에 용이**해서 **대규모 소프트웨어 개발**에 많이 사용됩니다.
* 반면에 처리속도가 상대적으로 느리고, 객체의 증가에 따라 용량이 증가할 수 있으며, 초기 설계 시 많은 시간과 노력이 필요하다는 단점이 있습니다.
