Javascript Class => 문법적 설탕 (???)
JS : 멀티 패러다임 언어
장점
단점
객체지향 개념이 생겨나게 되고 그 방식으로 프로그램을 구현할 수 있는 프로그래밍 언어들이 등장
=> 유지보수성
Class란 현실세계의 객체를 프로그래밍적으로 구현하기 위해 설계(modeling)하는 수단
객체를 프로그램 상에 구현한 instance를 만드는 도구
ADT(Abstract Data Type) :
Javascript -> prototype 기반의 객체지향, 객체기반 언어
=> class가 필요 없지만 ES6에서 class를 도입
const Person = '안녕하세요';
{
console.log(Person);
class Person {}
}
class Person {
// constructor, 생성자
constructor(name) {
// instance의 초기화
// instance의 property를 설정
this.name = name;
// 생성자가 실행되면 만들어질 instance의 property에 name을 추가하여 값을 넣어준다.
}
// prototype method : prototype 객체가 가지고 있는 method
// instance에 상속되는 method
protoMtd() {
console.log('prototype method');
}
// static method
static staticMtd() {
console.log('static method');
}
}
const me = new Person('홍길동');
console.log(me);
class Person {
}
class는 일급객체이기 때문에 변수에 assign할 수 있다.
// 익명 class 표현식
const Person = class {};
// 기명 class 표현식
const Person2 = class MyClass {};
class는 0개 이상의 method 구성 (ES6 축약표현으로 만들어진 method -> non-constructor)
class Person {
// constructor, 생성자
constructor(name) {
// instance의 초기화
// instance의 property를 설정
this.name = name;
// 생성자가 실행되면 만들어질 instance의 property에 name을 추가하여 값을 넣어준다.
}
// prototype method : prototype 객체가 가지고 있는 method
// instance에 상속되는 method
protoMtd() {
console.log('prototype method');
}
// static method
static staticMtd() {
console.log('static method');
}
}
class 역시 hoisting이 발생
new keyword로 instance를 생성 -> class 이름이 아니라 식별자로 사용
instance가 실제 만들어지는 함수는 constructor
class Person {
constructor(name) {
this.name = name;
}
}
const me = new Person('홍길동');
console.dir(me);
console.dir(Person);
- 클래스는 함수이자 생성자 함수이다.
- 2개 이상 존재할 수 없음
- 생략 가능 (엔진에 의해 자동으로 생성 : 인자가 없고 기능이 없는 constructor)
- return 구문 사용 x (묵시적으로 this를 return)
// 객체 literal을 이용해 객체 생성
class Person {
constructor(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
get fullName() { // 접근자 property (get 키워드, 축약형, return 필요)
return `${this.lastName}${this.firstName}`
}
set fullName(name) {
// 유효성 검사
[this.lastName, this.firstName] = name.split(' ');
}
};
const me = new Person('길동', '홍');
console.log(me.fullName); // 홍길동
me.fullName = '김 연아';
console.log(me.fullName); // 김연아
부모 클래스 : super class
자식 클래스 : sub class
prototype 기반 상속과는 다름
class 상속은 extends를 이용
-> 하위 class에 [[Prototype]]에 이어진게 상위 class
instance를 만들면 가장 상위 super 클래스의 constructor가 호출되어야 한다. 그러나 constructor는 명시적으로 호출할 수 없기 때문에 super() 라는 함수를 호출하면 된다.
// super class
class Animal {
constructor(age, weight) {
this.age = age;
this.weight = weight;
}
eat() {
return 'eat';
}
move() {
return 'move';
}
}
class Bird extends Animal {
constructor(age, weight, kk) {
this.kk = kk;
super(age, weight); // 에러가 발생할 것임
}
}
const bird = new Bird();
class Animal {
constructor(age, weight) {
this.age = age;
this.weight = weight;
}
eat() {
return 'eat';
}
move() {
return 'move';
}
}
class Bird extends Animal {
constructor(age, weight, kk) {
// 상위 클래스의 cocnstructor 호출
super(age, weight);
this.kk = kk;
}
fly() {
return 'fly';
}
}
const bird = new Bird(10, 30, 100);
console.log(bird);
console.log(bird instanceof Bird); // true
console.log(bird instanceof Animal); // true
생성자 함수 간 상속은 불가능
class와 생성자 함수는 상속 관계를 가질 수 있음
=> class는 생성자 함수로부터 상속을 받을 수 있음
```
function Base(name) {
this.name = name;
}
class Derived extends Base {
}
```
동적 상속 허용
extends 키워드 뒤에 값으로 평가될 수 있는 식이 올 수 있음
function Base1(name) {
this.name = name;
}
class Base2 {
}
let tmp = true;
class Derived extends (tmp ? Base1 : Base2) {
}
const arr = [1, 2, 3] // array literal
const arr = new Array();
Object(객체) | 배열(Array) |
---|---|
property key | index |
property value | 요소(element) |
순서가 없음 | 순서가 있음 |
length X | length O |
=> 일반적인 배열의 특징과는 반대이다.
: 데이터와 데이터 사이에 빈 공간이 있어 삽입, 삭제 처리의 속도가 매우 빠르다. (Sparse Arrray, 회소 배열)
그러나 데이터에 접근하는 속도는 느리다.