컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다.
객체?물리적으로 존재하거나(자동차, 책, 사람), 추상적인 것(회사, 날짜) 중에서 자신의 속성과 동작을 가지는 모든 것을 말한다.

강한 응집력과 약한 결합력OOP의 경우 하나의 문제를 해결하기위해 여러 데이터를 모아둔 클래스를 활용하는 것을 지향하고(강한 응집력), 클래스 간을 독립적으로 디자인 한다.(약한 결합력)
1. 연관성있는 코드들 끼리 `function`, `method`와 같은 함수에 담는다.
2. 함수가 많아지면 새로운 객체를 생성하여 연관성 있는 함수끼리 한 객체에 담는다.
3. 객체를 호출하여 사용시 해당 객체에 들어있는 함수를 각각 분리하여 사용한다.

✨ **클래스** = **개**(dog)
&
**객체** = 우리집 강아지 **하루**, 옆집 강아지 **도도**
같다고 생각 할 수 있지만 정확히 하자면 다른개념이다.객체: 소프트웨어 세계에 구현할 대상 (설계도)인스턴스: 소프트웨어 세계에 구현된 실체 (설계도를 바탕으로 구현한 구현체)➡️ 클래스타입의 객체➡️ 클래스안에 객체를 생성해주는 것

✔️ 몬스터가 가지고 있는 특성(속성, 행위) 들을 나열해 보자
moster 가 가지고 있는 속성
=> 체력(healthPoint), 레벨(level), 서식지(habitat)
moster 가 가지고 있는 행위
=> 레벨을 1단계 올릴 수 있는 메소드(levelUp)
JavaScript 코드 예제

클래스 다이어그램




❗️Javascript에서는 키워드를 제공하지 않는다.
때문에 외부에서 접근이 제한된 데이터에 접근하려고 할 때
외부에서 접근할 수 있는 메서드를 제공하여 객체의 데이터에 접근하는 방식을 구현하여 사용한다.
➡️ 접근제한자(access modifier)라는 문법 지원
- public : 클래스 외부에서 제한 없이 접근 가능 (모든 접근 허용)
- private : 자기 클래스 내부의 메서드만 접근 가능
- protected : 자기 클래스, 상속한 하위 클래스에서만 접근 가능
➡️ JS.ver
- public
- private -> #private(클로저)
- protected -> _protected

알약을 먹을 때 약의 성분이 인체에 미치는 영향이 중요하지, 맛이나 식감은 중요하지않기 때문에 캡슐안으로 숨기는 것과 같다
정보 은닉(data hiding)


let fruitName = name; 로직을 통해 class안에 선언은 되어있으나 정보 은닉화 시켜줌
//전체로직으로 다시 이해하기
var Dog = function(name){
// private
var name = name;
// public
return {
getName : function(){
return name;
},
setName : function(newName){
name = newName;
} } };
var haru = new Dog('Haru');
console.log(haru.name); // undefined
console.log(haru.getName()); // haru
haru.setName('haruru');
console.log(haru.getName()); // haruru
부모class

자식class

오버라이딩(Overriding)

오버로딩(Overloading)