λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
🌌 | WEB DEV/Vanilla JS

JS_κΈ°λ³Έ 문법 (25)_ 클래슀

by KASSID 2023. 4. 2.

λͺ©μ°¨

    728x90

    2023.03.31 - [🌌 | WEB DEV/Vanilla JS] - JS_κΈ°λ³Έ 문법 (24)_ μƒμ„±μž ν•¨μˆ˜

     

    μ €λ²ˆμ— λ‹€λ£¨μ—ˆλ˜ μƒμ„±μž ν•¨μˆ˜μ— μ΄μ–΄μ„œ μ΄λ²ˆμ—λŠ” ν΄λž˜μŠ€μ— λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μž!

     

    1. 클래슀

    // 클래슀
    class Player {
      constructor(name, job){
        this.name = name;
        this.job = job
      }
      info () {
        return `μ†Œν™˜μ‚¬λͺ… : ${this.name} | 직업ꡰ : ${this.job}`;
      }
    }

     

    const player1 = new Player('Kassid', '전사');
    const player2 = new Player('Nyang', 'λ§ˆλ²•μ‚¬');
    
    console.log(player1, player1.info());
    console.log(player1, player2.info());
    
    >>> Player {name: 'Kassid', job: '전사'} 'μ†Œν™˜μ‚¬λͺ… : Kassid | 직업ꡰ : 전사'
    >>> Player {name: 'Kassid', job: '전사'} 'μ†Œν™˜μ‚¬λͺ… : Nyang | 직업ꡰ : λ§ˆλ²•μ‚¬'

    이처럼 μƒμ„±μž ν•¨μˆ˜λ‘œ 객체λ₯Ό μƒμ„±ν–ˆλ˜ 것과 λ™μΌν•˜κ²Œ 객체가 λ§Œλ“€μ–΄μ§€κ³  κ·Έ κΈ°λŠ₯이 잘 μž‘λ™ν•˜λŠ” 것을 μ•Œ 수 μžˆλ‹€.

     

     

    ν•˜μ§€λ§Œ μƒμ„±μž ν•¨μˆ˜μ™€ ν”„λ‘œν† νƒ€μž… 기반으둜 λ§Œλ“œλŠ” 객체와

    클래슀둜 μƒμ„±ν•˜λŠ” κ°μ²΄λŠ” 차이가 μ‘΄μž¬ν•œλ‹€!

     

    μƒμ„±μžν•¨μˆ˜μ™€ 클래슀의 차이

    차이 1) ν˜Έμ΄μŠ€νŒ… μ‹œ

    ν•¨μˆ˜ μ„ μ–Έ λ°©μ‹μ˜ μƒμ„±μž ν•¨μˆ˜λŠ” ν˜Έμ΄μŠ€νŒ…μ΄ μ΄λ£¨μ–΄μ§ˆ λ•Œ μ΄ˆκΈ°ν™”κ°€ ν•¨κ»˜ μ§„ν–‰λ˜μ–΄

    μ˜λ„λŒ€λ‘œ 'ν˜Έμ΄μŠ€νŒ…'(μ„ μ–ΈλΆ€κ°€ μ•„λž˜μ— μžˆμ–΄λ„ 정상 호좜λ˜λŠ” 것을 의미)이 λ°œμƒν•˜μ§€λ§Œ

     

    ν΄λž˜μŠ€λŠ” uninitialized둜 μ΄ˆκΈ°ν™”κ°€ λ˜κΈ°λ•Œλ¬Έμ— ReferenceErrorλ₯Ό λ°˜ν™˜ν•œλ‹€.

    cosnt p1 = new Player('Kassid', '전사');
    
    class Player{
      constructor(name, job) {
        this.name = name;
        this.job = job;
      }
      info () {
        return `μ†Œν™˜μ‚¬λͺ… : ${this.name} | 직업ꡰ : ${this.job}`;
      }
    }
    
    >>> Uncaught ReferenceError: Player is not defined

     

    μžμ„Έν•œ λ‚΄μš©β–Ό

    2023.03.31 - [🌌 | WEB DEV/Vanilla JS] - JS_기술 (3)_ Hoisting(ν˜Έμ΄μŠ€νŒ…) 뿌수기

     

     

    차이 2) new μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ•˜μ„ λ•Œ

    ν΄λž˜μŠ€λŠ” new μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 경우 TypeErrorλ₯Ό λ°˜ν™˜ν•œλ‹€.

    const p2 = Player('Tom', 'ꢁ수');
    
    >>> Uncaught TypeError: Class constructor Player cannot be invoked without 'new'

    반면 μƒμ„±μž ν•¨μˆ˜λŠ” undefinedλ₯Ό λ°˜ν™˜ν•œλ‹€.

    (μ΄λŠ” ES6이후 λ§Œλ“€μ–΄μ§„ 문법듀은 '엄격λͺ¨λ“œ'λΌλŠ” 것이 μ μš©λ˜μ–΄ 있기 λ•Œλ¬Έμ΄λΌκ³  ν•œλ‹€!)

     

     

    차이 3) λ©”μ„œλ“œ μ •μ˜ μœ„μΉ˜

    μƒμ„±μž ν•¨μˆ˜μ™€ 클래슀의 λ©”μ„œλ“œλŠ” 각각 μ •μ˜λœ μœ„μΉ˜κ°€ λ‹€λ₯΄λ‹€.

    function Person1 (){
      this.say(){
        return 'μ•ˆλ…•ν•˜μ„Έμš”';
      }
    }
    
    const p1 = new Person1();
    console.log(p1);
    
    class Person2{
      say(){
        return 'μ•ˆλ…•ν•˜μ„Έμš”';
      }
    }
    
    const p2 = new Person2();
    console.log(p2);

    μœ„ μ½”λ“œμ˜ κ²°κ³ΌλŠ” μ•„λž˜μ™€ κ°™λ‹€.

    μƒμ„±μž ν•¨μˆ˜
    클래슀

    μƒμ„±μž ν•¨μˆ˜μ—μ„œμ˜ λ©”μ„œλ“œλŠ” 객체 κ·Έ μžμ²΄μ— μ €μž₯ν•˜μ§€λ§Œ

    ν΄λž˜μŠ€λŠ” ν”„λ‘œν† νƒ€μž… 내뢀에 μ €μž₯ν•œλ‹€.

     

    이 λ‘˜μ˜ μ°¨μ΄λŠ”

    객체 μžμ²΄μ— μ €μž₯λ˜μ–΄ 있으면 κ·Έ λ‚΄λΆ€μ—μ„œ κΈ°λŠ₯을 ν•˜λŠ” 것이라면

    ν”„λ‘œν† νƒ€μž…μ— μžˆλŠ” 경우 클래슀 κ·Έ μžμ²΄μ—μ„œ κ°€μ Έλ‹€κ°€ κΈ°λŠ₯을 ν•˜λŠ” 차이이닀.

     

     


    2. constructor

    μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 λ•Œ 인자λ₯Ό λ°›μ•„μ„œ ν”„λ‘œνΌν‹°λ₯Ό μ΄ˆκΈ°ν™”ν•˜λŠ” 역할을 ν•˜λŠ” λ©”μ„œλ“œμ΄λ‹€.

     

    ν΄λž˜μŠ€λ§ˆλ‹€ 단 ν•˜λ‚˜μ”© μ‘΄μž¬ν•˜λ©° κΈ°λ³Έκ°’ 섀정이 κ°€λŠ₯ν•˜λ‹€.

    class Player{
      //constructor λ©”μ„œλ“œ name, job을 인자둜 λ°›λŠ”λ‹€.
      constructor(name, job) {
        this.name = name;
        this.job = job;
      }
      info () {
        return `μ†Œν™˜μ‚¬λͺ… : ${this.name} | 직업ꡰ : ${this.job}`;
      }
    }

     

    λ˜ν•œ constructor λ©”μ„œλ“œλŠ” ν•„μˆ˜μ μΈ 것이 μ•„λ‹ˆλ‹€.

    λ”°λΌμ„œ ꡳ이 μΈμŠ€ν„΄μŠ€μ˜ μ΄ˆκΈ°ν™”κ°€ ν•„μš”μΉ˜ μ•ŠλŠ” 경우 μ‚¬μš©ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.

    class Hey{} // constructor없이 빈 클래슀
    
    console.log(new Hey());

     

     


     

    3. ν•„λ“œ Field

    1) 일반 ν•„λ“œ Public Field

    클래슀 λ‚΄λΆ€μ˜ ν”„λ‘œνΌν‹°μ— λŒ€ν•΄μ„œ 이미 값이 μ •ν•΄μ Έ μžˆλŠ” 경우

    constructor λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  ν•„λ“œκ°’μ„ μ§€μ •ν•˜λŠ” 방법을 μ‚¬μš©ν•  수 μžˆλ‹€.

     

    μ˜ˆμ‹œ)

    // ν•„λ“œκ°’μ„ μ§€μ •ν•˜λ―€λ‘œ constructor 없어도 됨
    class Hammer {
      durability = 20;
      power = 5;
      attack (obj){
        obj.durability -= this.power;
        this.durability -= obj.power;
      }
    }
    class Sword {
      durability = 15;
      power = 8;
      attack (obj){
        obj.durability -= this.power;
        this.durability -= obj.power;
      }
    }
    
    const hammer1 = new Hammer();
    const sword1 = new Sword();
    
    console.log(hammer1);
    console.log(sword1);
    
    >>> Hammer {durability: 20, power: 5}
    >>> Sword {durability: 15, power: 8}

    이처럼 constructorλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  객체λ₯Ό 생성할 수 μžˆλ‹€. 

     

    두 객체의 μƒν˜Έμž‘μš©λ„ μ‚΄νŽ΄λ³΄μž.

    hammer1.attack(sword1);
    
    console.log(hammer1);
    console.log(sword1);
    
    >>> Hammer {durability: 12, power: 5}
    >>> Sword {durability: 10, power: 8}

     


    λ˜λ‹€λ₯Έ μ˜ˆμ‹œλ₯Ό μ‚΄νŽ΄λ³΄μž!

    ν•„λ“œκ°’μ„ μ§€μ •ν•˜λŠ” 것은 constructor의 μΈμˆ˜μ— 기본값을 μ§€μ •ν•˜λŠ” 역할을 μˆ˜ν–‰ν•  수 μžˆλ‹€.

    class KassidCafe{
      num = 0;
      menu = {아메리카노: 2500, 바닐라라떼: 4000};
      constructor(name, num){
        this.name = name;
        if (num) this.num = num;
      }
      info(){
        return `| Kassid Cafe ${this.num}호 ${this.name}점 |`;
      }
      order(drink){
        return `${drink}λŠ” ${this.menu[drink]}원 μž…λ‹ˆλ‹€.`;
      }
    }

     

    λ˜ν•œ κ°μ²΄λ§ˆλ‹€ 항상 같은 값을 가지고 μžˆλŠ” ν”„λ‘œνΌν‹°λ„ ν•„λ“œκ°’μœΌλ‘œ 지정할 수 μžˆλ‹€.

    생성 ν›„ κ²°κ³Όλ₯Ό μ‚΄νŽ΄λ³΄μž.

    const cafe1 = new KassidCafe('ν…ŒμŠ€νŠΈ');
    
    console.log(cafe1);

     

    기본값이 μ μš©λ˜μ–΄ 잘 λ°˜ν™˜λœ 것을 μ•Œ 수 μžˆλ‹€.

    console.log(cafe1.info());
    
    >>> | Kassid Cafe 0호 ν…ŒμŠ€νŠΈμ  |
    console.log(cafe1.order('바닐라라떼'));
    
    >>> λ°”λ‹λΌλΌλ–ΌλŠ” 4000원 μž…λ‹ˆλ‹€.

     

    ν•„λ“œκ°’μ€ κ°μ²΄λ§ˆλ‹€ 독립적이닀.

     

    λ”°λΌμ„œ 객체의 내뢀에 μ ‘κ·Όν•˜μ—¬ ν”„λ‘œνΌν‹°λ₯Ό μˆ˜μ •ν•  경우 클래슀 μžμ²΄μ™€λŠ” λ¬΄κ΄€ν•˜λ―€λ‘œ

    ν•΄λ‹Ή 개체만 λ³€ν™”κ°€ 생긴닀. 

    cafe1.menu['바닐라라떼'] = 5000;
    console.log(cafe1.order('바닐라라떼'));
    
    >>> λ°”λ‹λΌλΌλ–ΌλŠ” 5000원 μž…λ‹ˆλ‹€.
    
    // μƒˆλ‘œμš΄ 객체 생성
    const cafe2 = new KassidCafe('λŒ€μ „', 2);
    console.log(cafe2.order('바닐라라떼'));
    
    >>> λ°”λ‹λΌλΌλ–ΌλŠ” 4000원 μž…λ‹ˆλ‹€. // 클래슀 μ„ μ–Έ μ‹œμ˜ κ°’ κ·ΈλŒ€λ‘œ

    2) 정적 ν•„λ“œ

    μƒμ„±μž ν•¨μˆ˜μ—μ„œλŠ” 객체듀이 μ•„λ‹Œ κ·Έ ν•¨μˆ˜ μžμ²΄μ— μ‚¬μš©ν•  수 μžˆλŠ” κΈ°λŠ₯을 μΆ”κ°€ν•  수 μžˆμ—ˆλ‹€.

    (μƒμ„±μžν•¨μˆ˜.ν”„λ‘œνΌν‹° 둜 μΆ”κ°€ν•œ λ³€μˆ˜, ν•¨μˆ˜λŠ” κ°μ²΄μ—μ„œ μ ‘κ·Όν•  수 μ—†μ—ˆλ‹€.)

     

    ν΄λž˜μŠ€μ—μ„œλ„ 정적 ν•„λ“œλ₯Ό 톡해 λ™μΌν•˜κ²Œ κ΅¬ν˜„ν•  수 μžˆλ‹€.

    λ‹€λ₯Έ μ–Έμ–΄μ—μ„œ λ³Ό 수 μžˆλŠ” ν‚€μ›Œλ“œμΈ static을 μ΄μš©ν•œλ‹€.

    class KassidCafe{
    
      //정적 λ³€μˆ˜, λ©”μ„œλ“œ
      static owner = 'Kassid';
      static cafeInfo () {
        return `${this.owner}의 KassidCafeμž…λ‹ˆλ‹€!`
      }
    
      num = 0;
      menu = {아메리카노: 2500, 바닐라라떼: 4000};
      constructor(name, num){
        this.name = name;
        if (num) this.num = num;
      }
      info(){
        return `| Kassid Cafe ${this.num}호 ${this.name}점 |`;
      }
      order(drink){
        return `${drink}λŠ” ${this.menu[drink]}원 μž…λ‹ˆλ‹€.`;
      }
    }

     

    이λ₯Ό κ°„λ‹¨ν•œ 그림으둜 μ‚΄νŽ΄λ³΄λ©΄ μ•„λž˜μ™€ κ°™λ‹€.

    클래슀 객체1 객체2 ...
    owner
    cafeInfo
    num
    menu
    name
    num
    menu
    name

    (λ©”μ„œλ“œμ˜ λ³Έμ²΄λŠ” 클래슀의 ν”„λ‘œν† νƒ€μž… ν•œ 곡간에 μ‘΄μž¬ν•¨. κ°μ²΄λ§ˆλ‹€X)

     

     

    정적 ν•„λ“œμ—μ„œ μ£Όμ˜ν•  점은

    this.~ ν‚€μ›Œλ“œ μ‚¬μš©μ‹œμ— 같은 정적 λ³€μˆ˜λ§Œμ„ μ‚¬μš©ν•  수 μžˆλ‹€λŠ” 것이닀!

     

     


    4. 클래슀 ν‘œν˜„μ‹

    클래슀 λ˜ν•œ λ‚΄λΆ€μ μœΌλ‘œ ν•¨μˆ˜λ‘œ μΈμ‹ν•œλ‹€.

    class Foo {}
    
    console.log(typeof Foo);
    
    >>> function

     

    λ”°λΌμ„œ ν•¨μˆ˜μ²˜λŸΌ 클래슀 ν‘œν˜„μ‹ λ˜ν•œ μ‘΄μž¬ν•œλ‹€.

    // λ³€μˆ˜μ— 클래슀λͺ…을 담을 수 μžˆλ‹€!
    const bar = Foo;
    const bee = new bar();
    
    console.log(bee);
    
    >>> Foo {} // μΈμŠ€ν„΄μŠ€ 객체 생성

     

     

     

     

     

     

     

     

    λŒ“κΈ€