객체 지향 프로그래밍은 절차 지향 프로그래밍과는 다르게 데이터와 기능을 한 곳에 묶어서 처리
속성과 메서드가 하나의 “객체” 라는 개념에 포함
→ class
라는 이름으로 부른다
객체.메서드()
와 같이 객체 내에 메서드를 호출하는 방법
let counter1 = {
value: 0,
increase: function() {
this.value++ // 메서드 호출 시, this는 counter1을 가리킴
},
decrease: function() {
this.value--
},
getValue: function() {
return this.value
}
}
counter1.increase()
counter1.increase()
counter1.increase()
counter1.decrease()
counter1.getValue() --> 2
counter1
은 단 하나의 객체만 만들 수 있다.
똑같은 기능을 하는 counter
를 여러 개 만드는 방법 중 하나는 클로저 모듈 패턴을 사용하면 된다.
function makeCounter() {
let value = 0;
return {
increase: function() {
value++;
},
decrease: function() {
value--;
},
getValue: function() {
return value;
}
}
}
let counter1 = makeCounter()
counter1.increase()
counter1.getValue() -> 1
let counter2 = makeCounter()
counter2.decrease()
counter2.decrease()
counter2.getValue() -> -2
객체 지향 프로그래밍
class
instance
ex) 기본적인 자동차 설계도를 바탕으로 각각의 객체가 특정한 자동차 모델로 나오게 되는것
객체는 일반적인 함수를 정의하듯이 만든다.
new
키워드를 써서 만든다.
function Car(color) { }
let avante = new Car('blue');
let mini = new Car('cyan');
let beetles = new Car('red');
ES6: 클래스를 만드는 새로운 문법
class Car {
constructor(brand, name, color) {
// 인스턴스가 만들어질때 실행되는 코드
}
}
생성자 constructor
: 인스턴스가 만들어질때 실행되는 코드 ( return 값X)
new
키워드를 통해 클래스의 인스턴스를 만들어낼 수 있다
let avante = new Car('hyundai', 'avante', 'blue');
let mini = new Car('bmw', 'mini', 'cyan');
let beetles = new Car('volkswagen', 'beetles', 'red');
→ 각각의 인스턴스는 Car
라는 클래스의 고유한 속성과 메서드를 가진다.
new
키워드를 사용하면 즉시 생성자 함수 실행.속성 | 메서드 |
---|---|
brand, name, color, currentFuel, maxSpeed | refuel() , setSpeed() , drive() |
→ 현실 세계를 기반으로 프로그래밍 모델을 만들때 유용
class Car {
constructor(brand, name, color) {
this.brand = brand;
this.name = name;
this.color = color;
}
}
this
: 인스턴스 객체를 의미
this
에 할당한다는 것은 만들어진 인스턴스에 해당 브랜드, 이름, 색상을 부여하겠다는 것클래스 : 메서드의 정의
class Car {
constructor(brand, name, color) { }
refuel() {}
drive() {}
}
→ ES6에서는 생성자 함수와 함께 class 키워드 안쪽에 묶어서 정의
인스턴스에서의 사용
let avante = new Car('hyundai', 'avante', 'blue');
avante.colr; // 'blue'
avante.drive(); // avante가 운전을 시작
let mini = new Car('bmw', 'mini', 'cyan');
mini.brand; // 'bmw'
mini.refuel(); // mini에 연료를 공급
protoype | 모델의 청사진을 만들때 쓰는 원형 객체(original form) |
---|---|
constructor | 인스턴스가 초기화될때 실행하는 생성자 함수 |
this | 함수가 실행될때, 해당 scope 마다 생성되는 고유한 실행 context (execution context) new 키워드로 인스턴스를 생성했을때에는, 해당 인스턴스가 바로 this의 값이 된다 |
→ 오직 JavaScript에서만 유효한 용어
→ ES5 문법
↓↓↓↓ ES6 문법 ↓↓↓↓
class Car {
constructor(brand, name, color) {
this.brand= brand;
this.name = name;
this.color = color;
}
drive() {
console.log(this.name + '가 운전을 시작합니다');
}
}
let avante = new Car('hyundai', 'avante', 'blue');
avante.color; // 'blue'
avante.drive(); // avante가 운전을 시작합니다.
실전 예제-배열
let avante = new Car('hyundai', 'avante', 'blue');
avante.color; // 'blue'
avante.drive(); // avante가 운전을 시작
let arr = ['code', 'states', 'pre'];
arr.length; // 3
arr.push('course'); // 새 element 추가
→ 배열을 정의하는것은 Array의 인스턴스를 만들어내는 것과 동일
절차적언어
private
키워드)의 한계Java나 TypeScript에서는 클래스 내부에서만 쓰이는 속성 및 메서드를 구분시키기 위해 private
이라는 키워드 제공 → 지원하는 브라우저 적음
// TypeScript 문법
class Animal {
private name: string;
constructor(theName: string) {
this.name = theName;
}
}
new Animal("Cat").name; // 사용 불가
// Property 'name' is private and only accessible within class 'Animal'.
JavaScript에서는 은닉화를 돕기 위해 일반적으로 클로저 모듈 패턴 사용
interface
키워드) 기능의 부재속성과 메서드의 이름만 노출시켜서 사용을 단순화한다. ⇒ 인터페이스의 단순화
Java, TypeScript는 언어의 주요 기능으로 interface 구현 (javascript X)
// TypeScript 문법
interface ClockInterface {
currentTime: Date;
setTime(d: Date): void;
}
class Clock implements ClockInterface {
currentTime: Date = new Date();
setTime(d: Date) {
this.currentTime = d;
}
constructor(h: number, m: number) {}
}
인터페이스 이점