Class vs Object vs Instance 정리

2020. 10. 10. 13:14·프론트엔드/Javascript

Class vs Object vs Instance

 


GOAL

 - Class, Object, Instance의 개념을 설명할 수 있다.
 - Class, Object, Instance의 차이를 설명할 수 있다.

 

Class란?

  • 개념: 객체를 만들기 위한 전체적인 틀이자 객체들을 정의해 놓은 것이다.
  • 비유: 붕어빵 틀

Object란?

  • 개념: 객체는 클래스 내부를 구성하는 요소다. 
  • 비유: 붕어빵틀로 만들어진 붕어빵

Instance란?

  • 개념: 객체를 실체화 한것.  

    실체화? 대체 무슨말이지? 
     
    우선 객체와 인스턴스를 다시 정석대로 정의해보면
    객체란 소프트웨어 세계에 구현할 대상
    인스터스란 소프트웨어 세계에 구현된 구체적인 실체

    두 정의를 쉽게 풀어보면, 
    Coffee라는 클래스 있다.
    커피의 종류에는 아메리카노, 카페라떼 , 카페모카 등이 있다.
    다양한 커피의 종류를 객체, 즉 소프트웨어 세계에 구현할 대상이된다.

    이러한 커피 객체들이 Coffee라는 클래스에 객체로 실제 할당이 되면 (메모리에 실제로 할당이 될때)
    할당이 된 객체들을 인스턴스라고 부른다. 이 때 우리는
    "아메리카노는 Coffee 클래스의 인스턴스다."
    "카페라떼는 Coffee클래스의 인스턴스다." 라고 부를 수 있다. 

Class 선언

// 1. Class declarations (클래스는 관련있는 변수나 함수를 모아둔다.)
class Person {
  // constructor
  constructor(name, age) {
    // fields (속성)
    this.name = name;
    this.age = age;
  }

  // methods (행동)
  speak() {
    console.log(`${this.name}: hello!`);
  }
}

const pyo = new Person('pyo', 20);
console.log(pyo.name);
console.log(pyo.age);
pyo.speak();

 

// 2. Getter and setters
class User {
  constructor(firstName, lastName, age) {
    this.firstName = firstName;
    this.lastName = lastName;
    this.age = age; 
    // 메모리에 접근하기전에 this.age는 아래 get을 호출, age;는 set을 호출
  }
 
  // getter와 setter는 사용자로부터 입력받는 값을 원하는대로 통제할 수 있게 해준다.
  get age() {
    return this._age;
  }
  
  set age(value) {
    this._age = value < 0 ? 0 : value;
    }
  }
  

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


  // 3. Fields (public, private)

  class Experiment {
    publicField = 2;
    #privateField = 0; //private은 클래스 내부에서만 접근가능
  }
  const experiment = new Experiment();
  console.log(experiment.publicField);
  console.log(experiment.privateField); // undefined private변수는 접근 불가.

  // 4. Static properties and methods
  // static은 언제 쓰면 좋을까? -> object 상관없이 즉 들어오는 데이터 상관없이
  //  공통적으로 class에서 쓸 수 있을 때 static메소드를 사용하는 게 메모리의 효율을 높여줌
  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(Article.publisher);
  Article.printPublisher();

// 5. Inheritance
// a way for one class to extend another class.
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 width * this.height;
  }

  toString() {
    return `Triangle: color: $(this.color)`;
  }
}

class Rectangle extends Shape {}
class Triangle extends Shape {
  // 필요한 부분을 새로 정의해주는 것 -> overriding
  draw() {
    super.draw(); // Shape의 console부분 불러오기
    console.log('🔺');
  }
  getArea() {
    return width * this.height /2; // 삼각형은 /2를 해줘야 넓이가 나오니까 재정의
  }
}

const rectangle = new Rectangle(20, 20, 'blue');
rectangle.draw();
console.log(rectangle.getArea());

const triangle = new Triangle(20, 20, 'red');
triangle.draw();
console.log(triangle.getArea());

// 6. Class checking: instanceOf 
console.log(rectangle instanceof Rectangle); // t rectangle은 Rectangle의 인스턴스인가?
console.log(triangle instanceof Rectangle); // f
console.log(triangle instanceof Triangle); // t
console.log(triangle instanceof Shape); // t
console.log(triangle instanceof Object); // t 자바스크립트의 모든 객체는 Object객체에 상속되어있다. 

'프론트엔드 > Javascript' 카테고리의 다른 글

비동기 처리하는 3가지 방법  (0) 2020.10.19
싱글스레드 자바스크립트  (0) 2020.10.16
자바스크립트 this  (0) 2020.09.26
자바스크립트 클로저  (0) 2020.09.10
자바스크립트 호이스팅  (0) 2020.09.10
'프론트엔드/Javascript' 카테고리의 다른 글
  • 비동기 처리하는 3가지 방법
  • 싱글스레드 자바스크립트
  • 자바스크립트 this
  • 자바스크립트 클로저
꿀표
꿀표
양봉업자
  • 꿀표
    꿀로그
    꿀표
  • 전체
    오늘
    어제
    • 분류 전체보기 (82)
      • 인디해커 (0)
      • AI (0)
      • 프론트엔드 (34)
        • Javascript (17)
        • React (9)
        • Git (2)
        • Web Env (4)
        • Typescript (1)
        • 웹접근성 (1)
        • 상태관리 (0)
      • CS (8)
        • Network (3)
        • 알고리즘 (5)
      • 글쓰기 (3)
        • 생각 (2)
        • 서적 (1)
      • JAVA (37)
        • JAVA 기초 (22)
        • JSP (15)
  • 블로그 메뉴

    • 방명록
  • 인기 글

  • 태그

    구명보트
    js
    그리디
    javascript
    react
    알고리즘
    greedy
    network
    cross browsing
    프로그래머스
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
꿀표
Class vs Object vs Instance 정리
상단으로

티스토리툴바