절차 지향 (Precedural Programming) <--> 객체 지향 (Object Oriented Programming)
class
에 포함된다.object
(object literal이라고 부른다) 와는 다르다. (template literal 과 혼동하지 말것)** literal - 문자 그대로의 (literally, ...)
1) 캡슐화 (Encapsulate)
2) 추상화 (Abstraction)
3) 상속 (Inheritance)
4) 다형성 (Polymorphism)
자바스크립트는 엄밀히 말하면 객체지향 언어는 아니다. prototype 지향 언어다. 하지만 객체 지향 방식으로 사용할 수 있다.
Class (blueprint) -> Class Instances (objects)
// ES5
function Person (age){
this.age = age;
} // 생성자 함수는 return 값이 없음.
Person.prototype.speak = function() {}
let steve = new Person(32);
// ES6 <- 주로 사용
class Person {
constructor (age) { // 생성자 함수 (인스턴스 생성 시 실행됨)
this.age = age; // attribute(속성)
}
speak() {} // method
}
let annie = new Person(13);
this
- 함수가 실행될 때, 해당 scope 마다 생성되는 고유한 실행 context (excution context). new 키워드로 인스턴스를 생성했을 때에는, 해당 인스턴스가 바로 this 의 값이 됨.// 배열은 Array 객체의 instance 이다.
let arr = [1, 2, 3];
let arr = new Array(1, 2, 3);
Array.prototype.push();
Person
--- .prototype ---> Person.prototype
--- new ---> steve
Person
<--- .constructor --- Person.prototype
<--- .__proto__ --- steve
class Person {
constructor (sex) {
this.sex = sex;
}
speak() {}
}
let steve = new Person('male');
Person === Person.prototype.constructor; // true
steve.__proto__ === Person.prototype; // true
steve.speak === Person.prototype.speak; // true
prototype
객체를 만든다. prototype
객체에 정의되어 있다.class
정의가 사실상 함수 정의라는 것이다. class
정의는 constructor
함수 그자체다.class Person {
constructor (age) {
this.age = age;
}
speak() {return "I'm a person."}
}
class Student extends Person { // extends 로 상속한다.
constructor (age, school) {
super(age); // super() 함수는 바로 위 부모의 constructor 함수 호출이다.
this.school = school;
}
speak() {
super.speak(); // 부모의 speak() 함수를 호출한다.
return "I'm a student.";
}
}
private
키워드가 없으므로 클로저 모듈 패턴을 사용하거나, typescript를 사용하거나, 개발시 시각적으로만 사용하거나, ES2019의 public, private field 개념을 사용한다 (babel를 이용하여 호환성 문제 해결).
typescript 에는 interface 라는 개념이 있다. 인터페이스는 일종의 규약이 되어 클래스 작성 시 이에 맞게 작성할 수 있도록 돕는다.
super
키워드를 사용한다.