ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Javascript] Class 와 Object
    Language/Javascript 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())

    'Language > Javascript' 카테고리의 다른 글

    [Javascript] - Promise All  (0) 2022.01.28
    [Javscript] map 과 forEach 의 차이점  (0) 2022.01.19
    [Javascript] Function  (0) 2021.09.28
    [Javscript] Operator  (0) 2021.09.28
    Javascript - Module(export, import)  (0) 2021.09.26
Designed by Tistory.