본문 바로가기
Web 개발/JS

Javascript - class(1)

by hooni40 2021. 6. 19.
728x90
반응형

안녕하세요, class에 대해 정리해보겠습니다.

 

class에 관한 내용은 많고 깊어서 이번 시간에는 실제 사용하는 데 있어 유용한 기능만 정리하고 좀 더 자세한 내용은 추후 업데이트하도록 하겠습니다. 지난번에 정리한 Object에서는 하나의 객체(인스턴스)를 만드는 것에 대해 정리하였습니다. class는 이러한 객체를 만드는 틀로 여러 객체를 손쉽게 만들 수 있게 합니다. 

 

1. Class declarations : Class를 정의할때는 constructor 메서드(생성자)를 이용해 property를 지정해줘야 합니다. 없다면 본문이 비워진 채로 함수가 생성됩니다. 또한 메서드를 추가해 줄 수 있습니다. 아래 코드를 보며 설명드리겠습니다.

class Person {
    // constructor
    constructor(name, age) {
        // fields 생성할 객체들의 property 지정
        this.name = name;
        this.age = age;
    }

    // methods : 메소드 추가 가능
    speak() {
        console.log(`${this.name}: hello!`);
    }
}

const hoon = new Person('hoon', 20); // hoon이라는 객체를 생성
console.log(hoon.name); // hoon 출력
console.log(hoon.age); // 20 출력
hoon.speak(); // speak 메서드 사용 가능

2. Getter(획득자) and Setter(설정자) : Getter는 프로퍼티를 읽으려고 할때 실행[obj.prop] / Setter프로퍼티에 값을 할당하려할때 실행 [obj.prop = value] 합니다. 따라서 set 함수는 parameter를 받아야 합니다.

class User {
    // property 설정
    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');
        // }
        // age 입력 값이 0보다 작으면 0을 set하게 한다!
        this._age = value < 0 ? 0 : value;
    }
}

const user1 = new User('Steve', 'Job', -1);
console.log(user1.age); // age가 -1로 0보다 작으므로 age가 0이 된다.

한 가지 예를 더 살펴보겠습니다.

class A {
    _name = 'no name';

    get name() {
        return this._name + '@@@';
    }

    set name(value) {
        this._name = value + '!!!';
    }
}

const a = new A(); 
console.log(a); // {_name: "no name"} 출력
a.name = 'Mark'; // Mark가 value 자리로 들어가면서 !!!가 붙는다(set 된다) 
console.log(a); // {_name: "Mark!!!"} 출력
console.log(a.name); // getter의 결과로 Mark!!!뒤에 @@@가 붙어 Mark!!!@@@ 출력 
console.log(a._name); // _name을 얻은 결과로 Mark!!!만 출력이 된다. 

여기서 주의할 점으로는 get은 읽는 기능만 하므로 get함수를 사용한다고 객체의 property가 바뀌는 것이 아닙니다!

class B {
    _name = 'no name';

    get name() {
        return this._name + '@@@';
    }
}

const b = new B();
console.log(b); // {_name: "no name"} 출력
b.name = 'Hoon'; // setter가 없으면 Error 발생!!
console.log(b.name) // getter에 의해 no name@@@이 출력됨
console.log(b); // {_name: "no name"} 출력

3. Fields (Private, Public) : class 내부에서만 값이 보이고 접근 변경 가능하게 하며 외부에서는 읽지도 변경하지도 못하게 할 수 있습니다. (#을 붙여 private로 만들 수 있습니다)

class Experiment {
    publicField = 2;
    #privateField = 0;
}

const experiment = new Experiment();
console.log(experiment.publicField); // 2가 출력
console.log(experiment.privateField); // private라서 undefined

4. Static properties and methods : 오브젝트(메모리)에 상관없이 공통적인 클래스에서 쓸 수 있는 것

class Article {
    static publisher = 'Dream Coding';
    constructor(articleNumber) {
        this.articleNumber = articleNumber;
    }

    static printPublisher() {
        console.log(Article.publisher);
    }
}

const article1 = new Article(1);
const article2 = new Article(2);
console.log(article1.publisher); //undefined 출력
console.log(Article.publisher); // Dream Coding 출력
Article.printPublisher(); //Dream Coding 출력

5. Inheritance : 클래스의 속성 및 매서드들을 상속매서드를 바꿔서 적용(다향성)할 수 있습니다.

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 {}

// 삼각형의 경우 2로 나누어 줘야한다 -> 기존 draw매서드를 변형!(다향성)
// overideing (함수를 바꿀수 있다) : 다향성
class Triangle extends Shape {
    draw() {
        super.draw(); // 자식 클래스에서 this를 사용하기 전에는 무조건 super를 사용해줘야한다 (부모의 constructor를 호출)
        console.log("추가로 더 넣을 수 있다 ")
    }
    getArea() {
        return (this.width * this.height) / 2;
    }
}

const rectangle = new Rectangle(20,20,'blue');
rectangle.draw(); // drawing blue color of 출력
console.log(rectangle.getArea()); // 400출력
const triangle = new Triangle(20,20,'blue');
triangle.draw(); // drawing blue color of 출력 후 "추가로 더 넣을 수 있다 "가 추가 출력
console.log(triangle.getArea()); // 200출력 (다향성)

6. Class checking : instanceOf를 이용해 클래스의 상속 여부를 확인할 수 있습니다.

console.log(rectangle instanceof Rectangle); // True
console.log(triangle instanceof Rectangle); // False ( Triangle을 상속받음)
console.log(triangle instanceof Triangle); // True
console.log(triangle instanceof Shape); //True (Triangle이 Shape을 상속받은 것임)
console.log(triangle instanceof Object); //True (Shape이 Object을 상속받은 것임 // 모든 클래스는 Object의 하위 클래스입니다)
728x90
반응형

'Web 개발 > JS' 카테고리의 다른 글

Javascript - array(Quiz)  (0) 2021.06.22
Javascript - array  (0) 2021.06.21
Javascript - object  (0) 2021.06.17
Javascript - function  (0) 2021.06.16
Javascript - operator  (0) 2021.06.15

댓글