[TypeScript] 4. Classes & Interfaces

wonnie1224ยท2022๋…„ 8์›” 15์ผ
0

TypeScript

๋ชฉ๋ก ๋ณด๊ธฐ
4/4

๐Ÿ“Œ 4.0 Classes

  • js์—์„  constructor ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ ์•ˆ์— this.firstName = firstName์ด๋Ÿฐ ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด์คฌ์Œ
  • ts์—์„  ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์จ์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ts๊ฐ€ ์•Œ์•„์„œ constructor ํ•จ์ˆ˜ ๋งŒ๋“ค์–ด ์คŒ

(์•„๋ž˜ ํ™”๋ฉด ์ฐธ๊ณ )

  • ๊ธฐ๋ณธ์ ์ธ class ์ƒ์„ฑ
class Player { 
    constructor(
        private firstName: string,
        private lastName: string,
        public nickname: string
    ) {}
}
// js์—” private, public์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Œ
const nico = new Player("nico", "las", "๋‹ˆ๊ผฌ")

// nico.firstName // private์ด๋ผ์„œ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜
  • ์ถ”์ƒ ํด๋ž˜์Šค (abstract class) : ๋‹ค๋ฅธ ํด๋ž˜์Šค๊ฐ€ ์ƒ์†๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค (= ๋ถ€๋ชจ ํด๋ž˜์Šค)
    -- but ์ด ํด๋ž˜์Šค๋Š” ์ง์ ‘ ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ๋ถˆ๊ฐ€๋Šฅ
  • ์ถ”์ƒ ํด๋ž˜์Šค ์•ˆ์— ์ถ”์ƒ๋ฉ”์†Œ๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ
    -- ์ถ”์ƒ ๋ฉ”์†Œ๋“œ : ์ถ”์ƒ ํด๋ž˜์Šค ์•ˆ์—์„œ ๊ตฌํ˜„ํ•˜์ง€ ๋ง๊ณ , ๋ฉ”์†Œ๋“œ์˜ call signature๋งŒ ์ ์–ด๋‘ฌ์•ผ ํ•จ
    -- ํ•ด๋‹น ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š” ๋ชจ๋“  ๊ฒƒ๋“ค์ด ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋ฅผ ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„ํ•ด์•ผ ํ•จ
    ) ๋ฉ”์†Œ๋“œ : ํด๋ž˜์Šค ์•ˆ์— ์กด์žฌํ•˜๋Š” ํ•จ์ˆ˜
    ) ๊ธฐ๋ณธ์ ์œผ๋กœ ์ ‘๊ทผ ์ œ์–ด์ž๋Š” ๋ชจ๋‘ public
    *) protected : ๋ถ€๋ชจ & ์ž์‹ ํด๋ž˜์Šค์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ์ ‘๊ทผ ์ œ์–ด์ž
abstract class User { 
    constructor(
        protected firstName: string,
        protected lastName: string,
        protected nickname: string
    ) {}
    // ์ถ”์ƒ ๋ฉ”์„œ๋“œ
    abstract getNickName(): void

    // ๊ธฐ๋ณธ ๋ฉ”์„œ๋“œ : firstName + lastName์„ ํ•œ ๋ฌธ์ž์—ด๋กœ ์ถœ๋ ฅํ•ด์คŒ
    getFullName(){
        return `${this.firstName} ${this.lastName}`
    }
}

class Player extends User {
    getNickName() {
        console.log(this.nickname)
    }
}
const nico = new Player("nico", "las", "๋‹ˆ๊ผฌ");
nico.getFullName()
nico.getNickName()	// User ํด๋ž˜์Šค ์ƒ์†๋ฐ›์•˜์œผ๋ฏ€๋กœ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ ๊ฐ€๋Šฅ
// console.log(nico.nickname) // protected๋ผ์„œ ํด๋ž˜์Šค ๋ฐ–์—์„œ ์ ‘๊ทผ ๋ถˆ๊ฐ€

์‹คํ–‰ ๊ฒฐ๊ณผ

๐Ÿ“Œ 4.1 Classes Recap

์‹ค์Šต) ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์“ฐ๋Š” ํ•ด์‹œ๋งต ๊ตฌํ˜„ํ•˜๊ธฐ : ๋‹จ์–ด ์‚ฌ์ „

  • ์‚ฌ์ „์— ์ƒˆ ๋‹จ์–ด ์ถ”๊ฐ€ & ๋‹จ์–ด ์ฐพ๊ธฐ & ๋‹จ์–ด ์‚ญ์ œ ๋ฉ”์†Œ๋“œ ๊ตฌํ˜„
    public์œผ๋กœ ๊ฐ’์€ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ์ง€๋งŒ ์ˆ˜์ •์€ ๋ชปํ•˜๊ฒŒ ํ•˜๊ณ  ์‹ถ์œผ๋ฉด
    property๋ฅผ readonly๋กœ ๋งŒ๋“ค์–ด์ฃผ๋ฉด ๋จ
    ๋‹ค๋ฅธ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฎ์–ด์“ฐ๋Š” ๊ฑธ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ™ : private, protected, public readonly(<- only in ts)
// Words ํƒ€์ž… : string๋งŒ์„ property๋กœ ๊ฐ€์ง€๋Š” object์ž„
// ์•„๋ž˜์˜ ๋ฌธ๋ฒ•์€ object์˜ ํƒ€์ž…์„ ์„ ์–ธํ•  ๋•Œ ์‚ฌ์šฉ
// object๊ฐ€ ์ œํ•œ๋œ ๊ฐœ์ˆ˜์˜ property ๋˜๋Š” key๋ฅผ ๊ฐ€์ง€๋„๋ก ์ •์˜ํ•ด์ฃผ๋Š” ๋ฐฉ๋ฒ•
type Words = {
    [key: string]: string
}

class Dict {
    // words ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ƒ์„ฑ์ž๋ถ€ํ„ฐ ๋ฐ”๋กœ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š๊ณ  ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋Œ€๋กœ ์ˆ˜๋™์œผ๋กœ ์ดˆ๊ธฐํ™”์‹œํ‚ด
    private words: Words
    constructor(){
        this.words = {}
    }
    // ์ƒˆ ๋‹จ์–ด ์ถ”๊ฐ€ ๋ฉ”์†Œ๋“œ
    add(word: Word){// ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์–ด๋–ค ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์ด๊ธธ ์›ํ•˜๋ฉด, ํŒŒ๋ผ๋ฏธํ„ฐ์— ํด๋ž˜์Šค๋ฅผ ํƒ€์ž…์ฒ˜๋Ÿผ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•จ
        // ์ฃผ์–ด์ง„ ๋‹จ์–ด๊ฐ€ ์•„์ง ์‚ฌ์ „์— ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด
        if(this.words[word.term] === undefined){
            this.words[word.term] = word.def
        }
    }
    
    // ๋‹จ์–ด ์‚ญ์ œ ๋ฉ”์†Œ๋“œ

    // ๋‹จ์–ด ์—…๋ฐ์ดํŠธ ๋ฉ”์†Œ๋“œ


    // term์„ ์ด์šฉํ•ด์„œ def๋ฅผ ์ฐพ๋Š” ๊ธฐ๋Šฅ
    def(term: string){
        return this.words[term]
    }
}

class Word {
    constructor(
        public readonly term: string,
        public readonly def: string
    ) {}

    // ๋‹จ์–ด์˜ ์ •์˜ ์ถ”๊ฐ€ ๋ฉ”์†Œ๋“œ

    // ๋‹จ์–ด์˜ ์ •์˜ ์ˆ˜์ • ๋ฉ”์†Œ๋“œ

    // ๋‹จ์–ด ์ถœ๋ ฅ ๋ฉ”์†Œ๋“œ
}

const kimchi = new Word("kimchi", "ํ•œ๊ตญ์˜ ์Œ์‹");

const dict = new Dict()

dict.add(kimchi);
dict.def("kimchi");

๐Ÿ“Œ 4.2 Interfaces

์ธํ„ฐํŽ˜์ด์Šค๋Š” ํƒ€์ž…๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ ํƒ€์ž…์ด ๋” ๋งŽ์€ ์šฉ๋„๋กœ ์“ฐ์ž„

< ํƒ€์ž… >

  • object์˜ ๋ชจ์–‘์„ ์ •ํ•ด์คŒ
  • ํƒ€์ž… alias ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ
  • ํƒ€์ž…์œผ๋กœ concrete ํƒ€์ž…์˜ ํŠน์ • ๊ฐ’์„ ๊ฐ€์ง€๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Œ
// ์—ฌ๊ธฐ์„  string ํƒ€์ž…์˜ ํŠน์ • ๊ฐ’๋“ค์ธ "red" | "blue" | "yellow"
type Team = "red" | "blue" | "yellow"
type Health = 1 | 5 | 10

type Player = {
    nickname: string,
    team: Team
    health: Health
}

const nico: Player = {
    nickname: "nico",
    team: "red"
    health: 1
}

< ์ธํ„ฐํŽ˜์ด์Šค >
์ธํ„ฐํŽ˜์ด์Šค๋Š” ์˜ค์ง 1๊ฐ€์ง€ ์šฉ๋„ ๊ฐ€์ง
: object์˜ ๋ชจ์–‘์„ ์ •ํ•ด์คŒ
=> ์ด ์šฉ๋„๋กœ ์“ธ ๋• ํƒ€์ž…๋ณด๋‹ค ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์“ฐ๋Š” ๊ฑธ ์ถ”์ฒœํ•จ (OOP์ฒ˜๋Ÿผ ๋ณด์—ฌ์„œ ๊ฐ€๋…์„ฑ ๊ตฟ)

// ์œ„์˜ Player ํƒ€์ž… ์ฝ”๋“œ์™€ ๋™์ผํ•œ ๋œป์ž„
interface Player {
    nickname: string,
    team: Team
    health: Health
}

์ธํ„ฐํŽ˜์ด์Šค๋Š” ํด๋ž˜์Šค์™€ ๋‹ฎ์•˜์Œ
์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณด์ž
๋™์ผํ•œ ๋‚ด์šฉ์˜ ์ฝ”๋“œ๋ฅผ ์œ„์—์„  ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๊ตฌํ˜„ํ–ˆ๊ณ , ์•„๋ž˜์—์„  ํƒ€์ž…์œผ๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค
์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†ํ•˜๋Š” ๊ฑด extends๋กœ, type์„ ์ƒ์†ํ•˜๋Š” ๊ฑด & ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•œ๋‹ค

interface User {
    name: string
}

interface Player extends User {
}

const nico: Player = {
    name: "nico"
}
type User = {
    name: string
}

type Player = User & {
}

const nico: Player = {
    name: "nico"
}
  • property๋“ค์„ ์ถ•์ ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค
    : ๋™์ผํ•œ ์ด๋ฆ„์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ๋งŒ๋“ค๋ฉด ts๊ฐ€ ์•Œ์•„์„œ ํ•˜๋‚˜์˜ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ํ•ฉ์ณ์คŒ
    (ํƒ€์ž…์—์„  ์•ˆ ๋จ)
interface User {
    name: string
}
interface User {
    lastName: string
}
interface User {
    health: number
}

// User ์ธํ„ฐํŽ˜์ด์Šค 3๊ฐœ๊ฐ€ ํ•ฉ์ณ์ ธ์„œ nico ๊ฐ์ฒด๋Š” nico.name, nico.lastName, nico.health ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ชจ๋‘ ๊ฐ€์ง
const nico: User = {
    name: "nico",
    lastName: "n",
    health: 1
}
profile
์•ˆ๋…•ํ•˜์„ธ์š”๐Ÿ˜Š ์ปดํ“จํ„ฐ๋น„์ „์„ ๊ณต๋ถ€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค ๐Ÿ™Œ

0๊ฐœ์˜ ๋Œ“๊ธ€