ES6

5. classes 클래스

으누아빠 2020. 7. 7. 17:21
반응형

Classes

클래스란?

  • 클래스는 서로 연관이 있는 속성 과 메서드가 묶여있는것
  • 간혹 method 가 없는 class 가 있을수 있는데 이런 클래스를 data class라고 함
  • javascript 는 ES6 부터 지원
 class Person {
     name; //속성(field)
     age;  //속성(field)
     speak(); //행동(method)
 }
  • class 는 붕어빵을 만드는 틀 다른 말로 하면
  • 다른말로는 아이언 맨을 만드는 설계도라고 이해하면 쉬움

object 와 class의 구별

  1. class 선언
    class Person {
      name; //속성(field)
      age;  //속성(field)
      speak(); //행동(method)
    }
  • 여기까지가 class를 선언한 상태임
  • 해당 클래스는 메모리에 올라가 있지 않은 상태
  1. object: instance of a class 클래스의 객체화
const ellie = new Person();
  • new 연산자를 통해 person 이라는 class를 객채로 만듬
  • 이 상태가 되어야 클래스가 메모리에 올라

1. 클래스 선언

 class Person {
     //생성자
     constructor(name, age) {
         //속성
         this.name = name;
         this.age = age;
     }

     //메서드
     speak() {
         console.log(`${this.name}: hello!`);
     }
 }

const ellie = new Person('ellie', 20);

console.log(ellie.name);
console.log(ellie.age);

// 결과값
// ellie
// 20

ellie.speak(); //결과값 ellie: hello!

2. Getter and Setter

  • 사용자로부터의 입력된 데이터의 유효성을 확보하기 위해 만들어진것

예제

class User {
    constructor(firstName, lastName, age) {
        //속성
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }
}

const user1 = new User('Steve', 'job', -1);
console.log(user1.age); //결과값 -1

//실제로는 나이가 -1 이 나올수 없음

최적화 1단계

class User {
    constructor(firstName, lastName, age) {
        //속성
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age; // setter 흐름 1 :age는 메모리에서 값을 가져오는것 이닌 아래의 set age(value)의 값을 호출
    }

    //age라는 getter를 정의한 순간 메모리에 있는 age를 가져오는것이 아닌
    // 상단 this.age = age; 의 this.age를 가져옴
    get age() {
        return this.age;
    }

    // setter 흐름 2 : set age(value)의 값을 호출
    set age(value) {
        this.age = value; // setter 흐름 3 :  setter 흐름 1 처럼 set age(value)의 값을 호출이 됨
        //결국 무한 반복이 일어남
    }
}

const user1 = new User('Steve', 'job', -1);
console.log(user1.age);
//결과값 RangeError: Maximum call stack size exceeded
//그래서 getter와 setter의 변수명을 변경시켜줘야함

최적화 2단계

class User {
    constructor(firstName, lastName, age) {
        //속성
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }

    get age() {
        return this._age;
    }

    set age(value) {
        // if(value < 0) {
        //     throw Error('age can not be negative');
        // }
        this. _age = value < 0 ? 0 : value;
    }
}

const user1 = new User('Steve', 'job', -1);
console.log(user1.age);

// 결과값 0

3. public, private

class Experiment {
    publicField = 2; //외부에서 접근이 가능
    #privateField = 0; //외부에서 접근이 불가능, class 내부에서만 접근 가능
}

const experiment = new Experiment();
console.log(experiment.publicField); //결과값 2
console.log(experiment.privateField); //결과값 undefined

4. 상속

  • a way for one class to extend another class. 한 클래스가 다른 클래스를 확장하는 방법.
  • extends를 이용
class Shape {
    constructor(width, height, color) {
        this.width = width;
        this.height = height;
        this.color = color;
    }

    draw(){
        console.log(`drawing ${this.color} color of`);
    }

    getArea(){
        return this.width * this.height;
    }
}

class Rectangle extends Shape {}

class Triangle extends Shape {
    draw(){
        super.draw(); // 상속하는 shape.draw() 가 실행
        console.log('**');
    }

    // 상속받은 Shape.getArea()메소드를 완전히 바꿈 overriding
    getArea(){
        return (this.width * this.height)/2;
    }
}

const rectangle = new Rectangle(20, 20, 'blue');
rectangle.draw(); // 결과값 drawing blue color of

const triangle = new Triangle(20, 20, 'red');
triangle.draw();
// 결과값
//drawing red color of
//**

'ES6' 카테고리의 다른 글

7. New String & Number Methods  (0) 2020.07.08
6. Template Literals  (0) 2020.07.08
4. Arrow Function  (0) 2020.07.06
3. let, const  (0) 2020.07.03
2. Bable 을 이용한 ES6 변환  (0) 2020.07.03