์ƒˆ์†Œ์‹

FrontEnd/TypeScript

[TypeScript] class type

  • -

๐Ÿฃ ๋“ค์–ด๊ฐ€๊ธฐ ์ „์—!


์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” class ํƒ€์ž…์— ๋Œ€ํ•ด ๋‹ค๋ค„๋ณด๋„๋ก ํ•˜๊ฒ ๋‹น!_! ๋‹น์—ฐํ•œ ๋ง์ด์ง€๋งŒ class๋„ ํƒ€์ž…์ด ์กด์žฌํ•œ๋‹ค. ํ˜น์—ฌ class์— ๋Œ€ํ•ด์„œ ๊ฐœ๋…ํžˆ ์ž˜ ์ƒ๊ฐ ์•ˆ๋‚œ๋‹ค๋ฉด object ๊ฐ์ฒด๋ฅผ ๋ณต์ œํ•˜๋Š” ์–ด๋– ํ•œ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. ๊ทธ๋Ÿผ class type๋„ ๊ผฌ์šฐ๊ผฌ์šฐ!

 

์†ํฅ๋ฏผ ์•„๋ฒ„์ง€ ์†์›…์ • ์”จ('MBC์Šคํฌ์ธ ํƒํ—˜๋Œ€' ์œ ํŠœ๋ธŒ ํ™”๋ฉด ์บก์ณ)

 

๐Ÿฃ class type


1. class field ํด๋ž˜์Šค ํ•„๋“œ๊ฐ’ 

class์— object๋“ค์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋“ค์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”๋ฐ, ์•„๋ž˜์ฒ˜๋Ÿผ ํƒ€์ž…์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Œ.

class์˜ ํ•„๋“œ ํƒ€์ž…์„ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ๊ณ , ์ง€์ •ํ•˜์ง€ ์•Š์•„๋„ ์ž๋™์œผ๋กœ ํƒ€์ž…์ด ์ง€์ •๋จ.

์ผ๋ฐ˜ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ํƒ€์ž… ์ง€์ •ํ•ด์ฃผ๋ฉด ๋จ

class Person2{
    data = 0; // class ํ•„๋“œ๊ฐ’(constructor์™€ ๋˜‘๊ฐ™์€ ์—ญํ• ) / ์ž์‹๋“คํ•œํ…Œ์„œ ์ถœ๋ ฅ๊ฐ€๋Šฅ (์‚ฌ๋žŒ1.data ์ถœ๋ ฅ ๊ฐ€๋Šฅ)
    data1: number = 0; // class ํ•„๋“œ ํƒ€์ž…์ง€์ • ๊ฐ€๋Šฅ(์œ„์—์ฒ˜๋Ÿผ ์•ˆํ•ด๋„ number๋กœ ์ž๋™ ํƒ€์ž…์ง€์ •๋˜๊ธฐ๋„ ํ•จ)
}

let ์‚ฌ๋žŒ1 = new Person2();
console.log(์‚ฌ๋žŒ1.data)

 

2. class constructor type

class๋Š” object๋ฅผ ๋ณต์ œํ•˜๋Š” ์–ด๋– ํ•œ ๊ฒƒ์ด๋ผ๊ณ  ํ–ˆ๋Š”๋ฐ, ES6๋ถ€ํ„ฐ๋Š” constructor ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋จ. 

๋‹ค์Œ ์ฝ”๋“œ์—์„œ type error๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๋ฐ, ์ด๋Š” this๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ด์ „์— field ๊ฐ’์„ ๋ฏธ๋ฆฌ ์„ค์ •ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ.

class Person3{
    constructor() {
        // this.name = "ham"; //๊ทธ๋ƒฅ this.nameํ•˜๋ฉด name์˜ property๊ฐ’ ์—†๋‹ค๊ณ  ๋‚˜์˜ด
    }
}

 

field ๊ฐ’ ์ง€์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด 1๋ฒˆ์—์„œ ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณ€์ˆ˜ ์„ค์ •ํ•˜๋“ฏ ๋ฏธ๋ฆฌ ์„ค์ •ํ•ด๋‘๋ฉด ๋จ.

์ด๋ ‡๊ฒŒ constructor ์•ˆ์—์„œ ์‚ฌ์šฉํ•˜๋Š” this ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด field ๊ฐ’์— ๋ฏธ๋ฆฌ ์ง€์ •์„ ํ•ด๋†”์•ผ ํ•จ!_! 

class Person4{
    name: string; //ํ•„๋“œ๊ฐ’์— ๋ฏธ๋ฆฌ ์ง€์ •ํ•ด๋†”์•ผ ๋ฐ‘์—์„œ this.name ์‚ฌ์šฉ๊ฐ€๋Šฅ
    constructor() {
        this.name = "ham" // constructor ์œ„์—์„œ ๋ฏธ๋ฆฌ name ํ•„๋“œ๊ฐ’ ์ •ํ–ˆ๊ธฐ์—, this.name ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    }
}

์ด์ œ this.name ์‚ฌ์šฉ ๊ฐ€๋„!!!

 

 

ํŒŒ๋ผ๋ฏธํ„ฐ๋Š”?

์ฐธ๊ณ ๋กœ ์ด์ œ constructor ํŒŒ๋ผ๋ฏธํ„ฐ๋„ ํƒ€์ž… ์ง€์ •์ด ๊ฐ€๋Šฅํ•œ๋ฐ, ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ง€์ •ํ•  ๋•Œ ์›๋ž˜์ฒ˜๋Ÿผ ํ•˜๋ฉด ๋จ. return ํƒ€์ž…์„ ์ง€์ •ํ•  ํ•„์š”๋Š” ์—†์Œ. ์•„๋‹ˆ ์•ˆ๋จ. ์™œ๋ƒํ•˜๋ฉด constructor์— ๋ณต์ œ๋˜๋Š” ๊ฒƒ์ด ํ•ญ์ƒ object ์ด๊ธฐ ๋•Œ๋ฌธ.

// constructor ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž…์ง€์ • ๊ฐ€๋Šฅ
class Person5{
    name: string;
    constructor(a : string) { //ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž…์ง€์ • / return ํƒ€์ž…๋„ ์ง€์ •? => ๋ณต์ œ๋˜๋Š”๊ฒŒ ํ•ญ์ƒ object์ด๊ธฐ์— return ํƒ€์ž… ์ง€์ •ํ•  ์ด์œ ๋Š” ์—†์Œ
        this.name = a;
    }
}

let ์‚ฌ๋žŒ2 = new Person5("ham");
let ์‚ฌ๋žŒ3 = new Person5("hailey");
console.log(์‚ฌ๋žŒ2.name);
console.log(์‚ฌ๋žŒ3.name);

// ๋‹น์—ฐํžˆ ํ•จ์ˆ˜ ๊ด€๋ จ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ชจ๋‘ ๊ฐ€๋Šฅ
// rest parameter, default parameter ๋“ฑ ๊ฐ€๋Šฅ

 

3.  prototype ํ•จ์ˆ˜ ์–ด๋””์—? methods type

class์—๋Š” prototype์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Œ. prototype์€ class ๋‚ด๋ถ€์— ํ•จ์ˆ˜๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋Š”๊ฑด๋ฐ, ํ•จ์ˆ˜๋ช… () {} ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ.

์•„๋ž˜ ์ฝ”๋“œ๋กœ ์‚ดํŽด๋ณด๋ฉด, person6๋ผ๋Š” class์— ํ•จ์ˆ˜(){}๋ผ๋Š” prototype์„ ์ถ”๊ฐ€ํ–ˆ์Œ. ์‚ฌ๋žŒ4๋ผ๋Š” ๋ณ€์ˆ˜๊ฐ€ person6 class๋ฅผ ๋งŒ๋“ค๊ณ , ๊ทธ ์‚ฌ๋žŒ4(person6์˜ ์ž์‹ ๊ฐœ๋…)์€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•จ(๋ฉ”์†Œ๋“œ๋ฅผ ์ƒ์†๋ฐ›์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— person6์˜ ํ”„๋กœํ† ํƒ€์ž…์— ์ •์˜๋œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•œ ๊ฒƒ)

์ฐธ๊ณ ๋กœ ํ”„๋กœํ†  ํƒ€์ž…์˜ ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜์˜ ํƒ€์ž… ์ง€์ •๊ณผ ๊ฐ™์ด ํŒŒ๋ผ๋ฏธํ„ฐ์™€ return ํƒ€์ž… ์ง€์ •์ด ๊ฐ€๋Šฅํ•จ.

class Person6{
    name: string;
    constructor(a:string) {
        this.name = a;
    }

    ํ•จ์ˆ˜(a: string) { // ํ”„๋กœํ† ํƒ€์ž… ํ•จ์ˆ˜ ์ถ”๊ฐ€ ์ด๊ณณ์— / ํ”„๋กœํ† ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž… ์ง€์ • ๊ฐ€๋Šฅ / ๋ชจ๋“  ์ž์‹๋“ค์€ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
        // ํ•จ์ˆ˜๋ž‘ ๋˜‘๊ฐ™์ด ํŒŒ๋ผ๋ฏธํ„ฐ & retrun ํƒ€์ž… ์ง€์ • ๊ฐ€๋Šฅ
        console.log("์•ˆ๋…•~! " + a);
        return "a"
    }
}

// Person6.prototype.ํ•จ์ˆ˜๋‹ค = function(){} //์—ฌ๊ธฐ์— ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์œ„์— constructor ๋ฐ‘์—๋‹ค๊ฐ€ ์ถ”๊ฐ€ํ•˜๋ฉด ๋จ

let ์‚ฌ๋žŒ4 = new Person6("toto");
์‚ฌ๋žŒ4.ํ•จ์ˆ˜("๋ฐ˜๊ฐ€์›Œ ํ† ํ† "); // ์‚ฌ๋žŒ4์—์„œ Person6์˜ ํ”„๋กœํ† ํƒ€์ž… ์ถœ๋ ฅ ๊ฐ€๋Šฅ

 

 

4. Quiz 1

[Car ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ]
1. { model : '์†Œ๋‚˜ํƒ€', price : 3000 } ์ด๋ ‡๊ฒŒ ์ƒ๊ธด object๋ฅผ ๋ณต์‚ฌํ•ด์ฃผ๋Š” class๋ฅผ ๋งŒ๋“ค์–ด๋ณด์‹ญ์‹œ์˜ค.
2. ๊ทธ๋ฆฌ๊ณ  ๋ณต์‚ฌ๋œ object ์ž๋ฃŒ๋“ค์€ .tax() ๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ๋ฐ ํ˜„์žฌ object์— ์ €์žฅ๋œ price์˜ 10๋ถ„์˜1์„ ์ถœ๋ ฅ. 
3. model๊ณผ price ์†์„ฑ์˜ ํƒ€์ž…์ง€์ •. tax() ํ•จ์ˆ˜์˜ return ํƒ€์ž…. 

(๋™์ž‘ ์˜ˆ์‹œ)
```
let car1 = new Car('์†Œ๋‚˜ํƒ€', 3000)
console.log(car1) //์ฝ˜์†”์ฐฝ ์ถœ๋ ฅ๊ฒฐ๊ณผ๋Š” { model : '์†Œ๋‚˜ํƒ€', price : 3000 }
console.log(car1.tax()) //์ฝ˜์†”์ฐฝ ์ถœ๋ ฅ๊ฒฐ๊ณผ๋Š” 300
```

 

์•„๋ž˜๋Š” ํ’€์ด

class Car{
    model: string;
    price: number;
    constructor(model:string, price:number) {
        this.model = model;
        this.price = price;
    }

    tax1():number {
        return this.price * 0.1
    }

    tax2(price: number):number {
        const tax = price * 0.1 
        return tax;
    }
}

let car1 = new Car('์†Œ๋‚˜ํƒ€', 3000) // car1์€ Car ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค
console.log(car1); // Car {model: '์†Œ๋‚˜ํƒ€', price: 3000}
console.log(car1.tax1()); //tax ์ž๋™
console.log(car1.tax2(3000)); //tax๋ฅผ ์ง์ ‘ ์ˆซ์ž์ž…๋ ฅํ•ด์„œ ํ•  ๋•Œ

 

 

5. Quiz 2

[class์ธ๋ฐ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” class Word๋ฅผ ๋งŒ๋“ค๊ธฐ]
1. object ๋งŒ๋“ค ๋•Œ new Word() ์†Œ๊ด„ํ˜ธ ์•ˆ์— ์ˆซ์ž ํ˜น์€ ๋ฌธ์ž๋ฅผ ์ž…๋ ฅํ•˜๋ฉด 
2. ์ˆซ์ž๋Š” ์ „๋ถ€ object ์•ˆ์˜  num ์†์„ฑ ์•ˆ์— array ํ˜•ํƒœ๋กœ ์ €์žฅ๋˜๊ณ  
3. ๋ฌธ์ž๋Š” ์ „๋ถ€ object ์•ˆ์˜ str ์†์„ฑ ์•ˆ์— array ํ˜•ํƒœ๋กœ ์ €์žฅ๋˜๋Š” class๋ฅผ ๋งŒ๋“ค๊ธฐ
4. class ๋งŒ๋“ค ๋•Œ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ์ˆซ์ž์™€ ๋ฌธ์ž ๊ฐฏ์ˆ˜๋Š” ์ผ๋‹จ ์ œํ•œ์€ ์—†๊ณ , ํƒ€์ž… ์ง€์ •


(๋™์ž‘ ์˜ˆ์‹œ)
```
let obj = new Word('kim', 3, 5, 'park');
console.log(obj.num) //[3,5]
console.log(obj.str) //['kim', 'park']
```

 

์•„๋ž˜๋Š” ํ’€์ด

class Word{
    num: number[];
    str: string[];
    constructor(...a: (number | string)[]) {
        this.str = [];
        this.num = [];

        a.forEach((i) => {
            if (typeof i === 'string') {
                this.str.push(i);
            } else if (typeof i === 'number') {
                this.num.push(i);
            }
        })
    }
}

let obj = new Word('ham', 3, 5, 'hailey');
console.log(obj.str);
console.log(obj.num);

 

์•„๋ž˜์ฒ˜๋Ÿผ๋„ ๊ฐ€๋Šฅ

//์ด๋ ‡๊ฒŒ๋„ ๊ฐ€๋Šฅ
class Word{
    num: number[];
    str: string[];
    constructor(...a: (number | string)[]) {
        let ๊ธ€์ž : string[] = [];
        let ์ˆซ์ž : number[] = [];

        a.forEach((i) => {
            if (typeof i === 'string') {
                ๊ธ€์ž.push(i)
            } else{
                ์ˆซ์ž.push(i)
            }
        })
        this.str = ๊ธ€์ž;
        this.num = ์ˆซ์ž;
    }
}

 

6. ์ฐธ๊ณ  : Rest Parameter

ํŒŒ๋ผ๋ฏธํ„ฐ ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ๋ฐ›๊ณ  ์‹ถ์„ ๋•Œ, rest parameter๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋จ. ๊ฐ์ฒด ๊ฐ’์œผ๋กœ ๋“ค์–ด์˜ด.

class Word1{
    constructor(...a) { // ๊ทธ๋ƒฅ a๋กœ ๋ฐ›์œผ๋ฉด ํŒŒ๋ผ๋ฏธํ„ฐ ํ•œ๊ฐœ๋งŒ ๋ฐ›์Œ('ham')
        //Rest ํŒŒ๋ผ๋ฏธํ„ฐ(Rest Parameter, ๋‚˜๋จธ์ง€ ๋งค๊ฐœ๋ณ€์ˆ˜) : ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„ ์•ž์— ์„ธ๊ฐœ์˜ ...์„ ๋ถ™์—ฌ์„œ ์ •์˜ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜. Rest ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ํ•จ์ˆ˜์— ์ „๋‹ฌ๋œ ์ธ์ˆ˜๋“ค์˜ ๋ชฉ๋ก์„ ๋ฐฐ์—ด๋กœ ์ „๋‹ฌ ๋ฐ›์Œ
        //(4) ['ham', 3, 5, 'hailey'] ์ด๋ ‡๊ฒŒ ๋จ
        console.log(a)
    }
}

let obj1 = new Word1('ham', 3, 5, 'hailey');

 

 


์ด๋ ‡๊ฒŒ ๋ณด๋‹ˆ class type๋„ ๋ณ„ ๊ฒƒ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Œ.
์ค‘์š”ํ•œ๊ฑด ์—ญ์‹œ ์ˆœ์ •...๋Œ๊ณ  ๋Œ์•„ ๊ฒฐ๊ตญ JS๊ฐ€ ์ค‘์š”ํ•ด!
Contents

ํฌ์ŠคํŒ… ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.