클래스와 인스턴스를 설명하기 전에 OOP가 무엇인지 알고 들어가자.
OOP
- 객체 지향 프로그래밍 (Object-oriented programming)
- 컴퓨터 프로그래밍의 패러다임 중 하나
- 컴퓨터 프로그램을 명령어의 목록으로 보는 시각이 아닌 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 따라서 OOP의 모든 것은 객체로 그룹화 됨.
OOP Basic Concepts
Encapsulation(캡슐화)
![](https://velog.velcdn.com/images/jyeol0210/post/964bc082-ce7e-41cb-b583-386cd887304a/image.png)
- 데이터(속성)와 기능(메서드)을 하나의 단위(하나의 객체)로 묶는 것
- 은닉화: 구현은 숨기고, 동작은 노출시킴 즉, 내부 데이터나 내부 구현이 외부로 노출되지 않도록 만드는 것.
- 느슨한 결합(Loose Coupling)에 유리
- 언제든 구현을 수정할 수 있음
- 코드 실행 순서에 따라 절차적으로 코드를 작성하는 것이 아니라, 코드가 상징하는 실제 모습과 닮게 코드를 모아 결합하는 것을 의미한다.
- 캡술화는 코드가 복잡하지 않게 만들고, 재사용성을 높인다.
Inheritance(상속)
![](https://velog.velcdn.com/images/jyeol0210/post/127ea63f-7fde-4167-a801-497083da9f0d/image.png)
- 부모 클래스의 특징을 자식 클래스가 물려받는 것을 말함.
- 부모 / 자식이라는 키워드 보다 전문성 있는 키워드를 사용하자.
- "기본 클래스(base class)의 특징을 파생 클래스(derived class)가 상속받는다" 라고 표현하는 것이 적합하다.
<기본 클래스>
class Car {
constructor(brand, name, color) {
/.../
}
}
<파생 클래스>
class SuperCar {
constructor(brand, name, color, engine, speed) {
/.../
}
}
앞서 구현했던 Car 클래스의 속성과 메서드를 다시 구현하는 것은 비효율적이다.
따라서 상속을 이용하여 기본 클래스의 속성/메서드를 받고 파생 클래스의 속성/메서드를 추가하는 것이 효율적이다.
Abstraction(추상화)
![](https://velog.velcdn.com/images/jyeol0210/post/0f6f8782-5de8-46b8-9ab5-08366d780d66/image.jpeg)
- 내부 구현은 아주 복잡한데, 실제로 노출되는 부분은 단순하게 만든다는 개념
- 추상화와 캡슐화는 다른 것!
- 캡슐화가 코드나 데이터의 은닉에 포커스가 있다면,
추상화는 클래스 사용자가 필요하지 않는 메서드 등을 노출시키지 않고, 단순한 이름으로 정의한다는 것에 포커스.
![](https://velog.velcdn.com/images/jyeol0210/post/ff682bd8-96f3-4c28-9ce9-22d7443b4b38/image.png)
- Poly는 많은, morph는 형태라는 뜻을 가진다. 따라서 다양한 형태를 가질 수 있다는 의미이다.
- 객체 역시 똑같은 메서드라 하여도, 다른 방식으로 구현될 수 있다.
- 만약 다형성을 제공하지 않는다면, 기본 클래스에 종류별로 분기를 시켜 하나하나 다르게 만들어야 할 것이다.
OOP 정리
- 캡슐화는 코드가 복잡하지 않게 만들고, 재사용성을 높인다.
- 추상화는 마찬가지로 코드가 복잡하지 않게 만들고, 단순화된 사용으로 변화에 대한 영향을 최소화한다.
- 상속 역시 불필요한 코드를 줄여 재사용성을 높인다.
- 다형성으로 인해 동일한 메서드에 대해 if/else if와 같은 조건문 대신 객체의 특성에 맞게 달리 작성하는 것이 가능해진다.
클래스
- 일종의 원형(original form)으로, 객체를 생성하기 위한 아이디어나 청사진 객체를 만들기 위한 생성사(constructor) 함수를 포함한다.
- 속성과 메서드를 가진다.
자동차를 예로 들 때,
- 속성 : 브랜드, 차 이름, 색상, 현재 연료 상태, 최고 속력
- 메서드 : 연료 주입, 속력 설정, 운전 등 객체에 딸린 함수를 말한다.
인스턴스
- 클래스의 사례(instance object)
- 클래스를 바탕으로 만들어진 객체라고 볼 수 있다.
- 자동차를 예로 들면 컬러나 바퀴에 대한 생김새 등이 다를 수 있다.
new 키워드
class Tea {
/.../
}
let coffee = new Tea('coffee')
<new 키워드 생략의 경우>
'TypeError가 뜬다'
ES5 클래스 작성 vs ES6 클래스 작성 문법
<ES5>
function Car(brand, name, color) {
this.brand = brand;
this.name = name;
this.color = color;
Car.prototype.refuel = function() {
}
Car,prototype.drive = function() {
}
<ES6>
class Car {
constructor(brand, name, color) {
this.brand = brand;
this.name = name;
this.color = color;
refuel() {
}
drive() {
}
}
}
추가적인 개념
prototype - 모델의 청사진을 만들 때 쓰는 원형 객체
constructor - 인스턴스가 초기화 될 때 실행하는 생성자 함수
- 함수가 실행될 때, 해당 scope마다 생성되는 고유한 실행 context.
- new 키워드로 인스턴스를 생성했을 때에는, 해당 인스턴스가 바로 this의 값이 됨.