Language/Javascript

[Javascript] Class 와 Object

CHOIDR 2021. 10. 14. 15:20

Class 와 Object

Class

  • 연관 있는 데이터들이 fields 와 method 로 종합적으로 묶여있는 것
    • Data Class : fields 로만 이루어진 Class
  • Class 는 데이터가 직접 들어가 있지는 않으며, 들어올 수 있는 데이터를 한 번만 선언한다. 붕어빵을 만드는 틀과 비슷하다고 생각하면 된다

Object

  • Class 에서 실제로 데이터를 넣어 만들어진 것으로 Class 에서 새로운 instance 를 생성하면 Object 가 되는 것이다
  • Class 를 이용해서 여러 개의 Object 생성이 가능하다
  • Class 는 틀만 있는 것이기에 메모리에 올라가 있지 않지만, Object 는 데이터를 넣기 때문에 메모리에 올라가 있다
  • Class 가 붕어빵을 만드는 틀이라면 Object 는 틀로 만든 팥, 크림 붕어빵에 비유할 수 있다
  • constructor : 생성자로 클래스로부터 객체를 생성할 때 호출되어 객체의 초기화를 담당한다

Class, Object Example Code

class person {
    constructor(name, age) {    // constructor - 생성자
        this.name = name    // 전달받은 데이터를 name 과 age 에 할당한다
        this.age = age
    }

    speak() {
        console.log(`${this.name}: Hello!`)
    }
}

const alvin = new person('alvin', 25)
console.log(alvin.name)
console.log(alvin.age)

Getter and Setter

  • Getter : ' this.변수 = 변수 ' 선언 시 ' this.변수 '는 메모리에 있는 변수를 불러오는 것이 아닌 getter 를 호출한다

  • Setter : ' this.변수 = 변수 ' 선언 시 ' = 변수 '는 메모리에 변수를 할당하는 것이 아닌 setter 를 호출한다

    • Setter 선언 시 주의할 점 : 아래와 같이 setter 명과 this.변수명이 같을 경우 this.age 가 set age()를 무한정 호출하는 Error(Call stack) 가 발생할 수 있다
    set age(value) { 
          this.age = value;
    }

    따라서 아래와 같이 ' _ ' 을 추가하여 Error 를 해결할 수 있다

    set age(value) { 
          this._age = value;
    }

Getter and Setter Example Code

  • user Class 에는 firstName, lastName, _age 라는 총 3개의 field 가 있다
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;
    }
}

const user1 = new user('choi', 'alvin', -1)
console.log(user1.age)

public and private

  • public 은 class 내 외부에서 활용할 수 있지만, private 는 class 내부에서만 활용이 가능하고 외부에서는 접근할 수 없다
  • private field 는 해쉬 기호(#)를 붙이면 된다

public and private Example Code

class Experiment {  // ' # ' 해쉬기호를 붙이면 private field 이다. class 내부에서만 값을 활용할 수 있고 외부에서는 사용할 수 없다 
    publicField = 2;
    #privateField = 0;
}
const experiment = new Experiment()
console.log(experiment.publicField)   // 2
console.log(experiment.privateField)  // undefined

Static

  • Object 에 상관 없이 Class 에서 공통적으로 사용할 수 있는 것이라면 static 을 사용하면 된다

static Example Code

class Article {
    static publisher = 'Alvin';
    constructor(articleNum) {
        this.articleNum = articleNum;
    }

    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)  // Alvin
Article.printPublisher()        // Alvin

Inheritance - 상속

  • extends 라는 키워드를 이용해서 class 의 fields 나 method 를 연장해서 사용할 수 있다
  • 상속 받은 클래스에서 동일한 메소드는 재정의해서 사용할 수 있는데, 이것을 바로 오버라이딩이라고 한다
  • ' Super.메소드명 '을 사용하면 상속받은 부모의 메소드(기능)도 호출되고, 기존 메소드를 변경할 수도 있다

Inheritance, Overriding Example Code

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(); // super : 부모 method의 draw 기능을 호출
        console.log('Triangle');
    }
    getArea() {   // overriding : 부모 메소드의 기능을 재정의(변경)하여 사용
        return (this.width * this.height) / 2;
    }
}

const rectangle = new Rectangle(10, 10, 'red')
rectangle.draw()
console.log(rectangle.getArea())
const triangle = new Triangle(10, 10, 'blue')
triangle.draw()
console.log(triangle.getArea())