Javascript Class & Prototype


들어가며

  • javascript es6 발표 후 class 와 Prototype 개념이 도입 되면서 java와 유사하게 변화되었습니다.
  • 이 말인 즉슨 oop 객체지향 적 코딩을 하도록 유도 되고 있습니다.
  • 해당 포스트는 mozilla 레퍼런스를 보고 작성 되었습니다. Link mozilla-class

class 선언

  • class 안에 소스는 모두 strict mode 입니다.
  • 선언 예시
class Rectangle {
    constructor(height, width) { // 생성자
        this.height = height;
        this.width = width;
    }
}

Hoisting

  • Link Hoisting
  • class를 선언하고 사용함에 있어 javascript hoisting 이 일어납니다.
  • 그러므로 아래 예시는 오류가 발생합니다.
const rect = new Rectangle(); // referenceError

class Rectangle {}

표현식

  • class 표현은 name 을 줄 수도 안 줄 수도 있습니다.
  • 이름을 가진 class는 body에 대해 local scope에 한해 유효합니다.
// unnamed
let Rectangle = class {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
};
console.log(Rectangle.name);
//output : "Rectangle"


// named
let Rectangle = class Rectangle2 {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
};
console.log(Rectangle.name);
//output: "Rectangle2"

생성자

  • class block {} 안에 하나에 constructor 메소드만 존재 가능합니다.
class Rectangle {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
  // Getter
  get area() {
    return this.calcArea();
  }
  // Method
  calcArea() {
    return this.height * this.width;
  }
}

const square = new Rectangle(10, 10);

console.log(square.area); // 100

static method

  • 클래스에 정적 메소드를 정의하면 클래스의 인스턴스화 없이 호출 됩니다.
  • 클래스의 인스턴스에서는 호출할 수 없습니다.
  • 아래 소스에 주석으로 설명을 달아 놓았습니다.
  • 주로 유틸리티 함수를 생성하는데 사용합니다.
  • 아래 소스 중 Math.hypot 같은 함수가 static method
    • javascript 내장함수로 Math 클래스에 hypot 함수가 있습니다.
    • hypot 인수에 제곱 합계에 제곱근을 반환 합니다.
    • 아래 distance 함수는 a 인자와 b 인자에 거리를 반환하는 함수 입니다.
class Point {
    constructor(x, y) { // 생성자 x , y 값을 지정 합니다.
        this.x = x;
        this.y = y;
    }

    static distance(a, b) {   // 정적 메소드 ( static method )
        console.log(a); 
        console.log(b);
        const dx = a.x - b.x;  // 여기서 들어오는 (a,b) 에 a, b는 object 
        const dy = a.y - b.y;

        return Math.hypot(dx, dy);
    }
}

const p1 = new Point(5, 5);  // Point 클래스를 인스턴스화 값 : Point {x: 5, y: 5}
p1.x = 10;  // 이런 식으로 값을 바꾸기 가능
p1.y = 10;  
const p2 = new Point(10, 10);
p1.distance;  //undefined  -> static method 는 인스턴스에서 호출 할 수 없음.
p2.distance;  //undefined

typeof p1.distance; // undefined
typeof Point.distance; // function   이와 같이 사용 가능 하다.

console.log(Point.distance(p1, p2)); // 7.0710678118654755
  • 클래스 안에 distance 함수가 static 이 아니라면
class Point {
    constructor(x, y) { // 생성자 x , y 값을 지정 합니다.
        this.x = x;
        this.y = y;
    }

    distance(a, b) {  
        const dx = a.x - b.x;  // 여기서 들어오는 (a,b) 에 a, b는 object 
        const dy = a.y - b.y;

        return Math.hypot(dx, dy);
    }
}

const p1 = new Point(5,5);
const p2 = new Point(10,10);

console.log(p1.distance(p1,p2)); // distance 함수가 static 이 아니라면 이렇게 사용합니다.
console.log(p2.distance(p1,p2)); // 같은 동작 입니다.