μ“°μœ½ν„°λ””/TypeScript

νƒ€μž…μŠ€ν¬λ¦½νŠΈ_클래슀

Kkan 2023. 2. 3. 13:57
728x90
λ°˜μ‘ν˜•

🎈주제: 클래슀

 

1. ν΄λž˜μŠ€λž€?

νƒ€μž…μŠ€ν¬λ¦½νŠΈμ—μ„œμ˜ ν΄λž˜μŠ€λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ™€ 거의 λ™μΌν•˜λ‹€.

일뢀 κΈ°λŠ₯ μ€‘μ—λŠ” νƒ€μž…μŠ€ν¬λ¦½νŠΈμ—μ„œλ§Œ μ‘΄μž¬ν•˜λŠ” κ³ μœ λ¬Έλ²•μΈ 것듀이 μžˆμ–΄ "거의"라고 ν‘œν˜„ν–ˆλ‹€.

κ·Έ 일뢀 κΈ°λŠ₯듀은 컴파일 ν›„ 사라진닀.

 

class PersonStudent {
    // ν•„λ“œ
    name: string;
    age: number;
    readonly location: string = 'Korea'
}

const person1 = new PersonStudent();

 

1-1. μƒμ„±μž

 

ν΄λž˜μŠ€κ°€ μΈμŠ€ν„΄μŠ€ν™”κ°€ 될 λ•Œ μ΄ˆκΈ°ν™”λ₯Ό λ‹΄λ‹Ήν•œλ‹€.

 

class PersonStudent {
    // ν•„λ“œ
    name: string;
    age: number;
    readonly location: string = 'Korea'

    // μƒμ„±μž!!
    constructor(name: string, age:number) {
        this.name = name;
        this.age = age;
    }
}

// λ§€κ°œλ³€μˆ˜λ‘œ name: stringκ³Ό age:number κ°€ μžˆλ‹€.
const person1 = new PersonStudent('kim', 99)

 

 

1-2. λ©”μ„œλ“œ

 

λ©”μ„œλ“œλŠ” 객체(클래슀)μ—μ„œ 행동을 λ‹΄λ‹Ήν•œλ‹€.

 

class PersonStudent {
    // ν•„λ“œ
    name: string;
    age: number;
    readonly location: string = 'Korea'

    // μƒμ„±μž!!
    constructor(name: string, age:number) {
        this.name = name;
        this.age = age;
    }

    // λ©”μ„œλ“œ!!
    getinfo(): string {
        return `${this.name}λ‹˜μ€ ${this.age}μ„Έ μž…λ‹ˆλ‹€.`
    }
}

const person1 = new PersonStudent('kim', 99)

console.log(person1.getinfo());
// "kimλ‹˜μ€ 99μ„Έ μž…λ‹ˆλ‹€."

 

1-3. getter / setter

  • ν•„λ“œμ— μ ‘κ·Όν•  κΆŒν•œμ„ κ°€μ§„ μ œμ–΄μž
  • getterκ°€ μžˆμ§€λ§Œ, setterκ°€ μ—†λŠ” κ²½μš°μ—λŠ” μžλ™μœΌλ‘œ readonly 속성을 κ°€μ§„λ‹€.
  • setter λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž… X / getter의 λ°˜ν™˜ νƒ€μž…μ—μ„œ μΆ”λ‘ ν•œλ‹€.
  • private 속성은 .(dot)μ—°μ‚°μžλ‘œ μ ‘κ·Όν•  수 μ—†λ‹€.

class PersonStudent {
    // ν•„λ“œ
    name: string;
    private _age: number | string;

    // μƒμ„±μž!!
    constructor(name: string, age: number | string) {
        this.name = name;
        this._age = age;
    }

	// getter & setter
    get age() {
        if(this._age === 0) {
            return '숫자λ₯Ό μž…λ ₯ν•˜μ„Έμš”.'
        }

        return `λ‚˜μ΄λŠ” ${this._age}μ„Έ μž…λ‹ˆλ‹€.`
    }

    set age(age) {
        if(typeof age === 'number') {
            this._age = age;
        } else {
            this._age = 0;
        }
    }
}

// ageκ°€ numberκ°€ μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— 문자λ₯Ό λ„£μœΌλ©΄ 였λ₯˜ λ°œμƒ
const person2 = new PersonStudent('kim', 0)

console.log(person2.age)
// "숫자λ₯Ό μž…λ ₯ν•˜μ„Έμš”."

 

 

1-4. extends

 

  • 상속 or ν™•μž₯의 μ—­ν™œμ„ ν•œλ‹€. (μ‚¬μš©μ‹œ κ³ λ―Όν•΄λ³Ό ν•„μš”κ°€ μžˆλ‹€.)

 

class κΈ°λ³Έ1 {
    result() {
        return 'Base';
    }
}

class νŒŒμƒ1 extends κΈ°λ³Έ1 {

}

const test1 = new νŒŒμƒ1();
console.log(test1.result());
// "Base"

 

class κΈ°λ³Έ2 {
    result() {
        return 'Base';
    }
}

class νŒŒμƒ2 extends κΈ°λ³Έ2 {
    result() {
        return 'Extends';
    }
}

const test2 = new νŒŒμƒ2();
console.log(test2.result());
// "Extends"

 

1-5. super

  • κΈ°λ³Έ 클래슀 호좜 μ‹œ μ‚¬μš©ν•œλ‹€.
  • μƒμ„±μžμ—μ„œ this μ‚¬μš© 전에 호좜 λ˜μ–΄μ•Ό ν•œλ‹€.

 

class Person {
    name: string;

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

    sayHello() {
        return `μ•ˆλ…•ν•˜μ„Έμš”! ${this.name}λ‹˜`
    }
}

class Student extends Person {
    constructor(name: string) {
        super(name);
    }

    sayHello() {
        return `μ•ˆλ…•ν•˜μ„Έμš”! ${this.name} ν•™μƒλ‹˜`
    }
}

const student1 = new Student('kkan');
console.log(student1.sayHello());
// "μ•ˆλ…•ν•˜μ„Έμš”! kkan ν•™μƒλ‹˜"

 

1-6. μ ‘κ·Όμ œμ–΄μž

 

  • 속성과 λ©”μ„œλ“œμ— 접근을 μ œν•œν•  수 μžˆλ‹€.
  • 클래슀 λ‚΄λΆ€ κ΅¬ν˜„ 정보λ₯Ό μ λ‹Ήνžˆ κ³΅κ°œν•˜μ—¬ μΌλΆ€λΆ€λ§Œ λ…ΈμΆœ μ‹œν‚¨λ‹€.

+) API와 λΉ„μŠ·ν•œ 흉내λ₯Ό λ‚Ό 수 μžˆλ‹€.

+) νƒ€μž… μ‹œμŠ€ν…œμ„ μ΄μš©ν•΄ κ·œμΉ™μ„ κ°•μ œν•  수 μžˆλ‹€.

 

μ œμ–΄μž μ„€λͺ…
public μ–΄λ””μ„œλ‚˜ μ ‘κ·Ό κ°€λŠ₯ (κΈ°λ³Έκ°’, μƒλž΅κ°€λŠ₯)
protected ν•΄λ‹Ή ν΄λž˜μŠ€μ™€ μ„œλΈŒν΄λž˜μŠ€μ—μ„œλ§Œ μ ‘κ·Ό κ°€λŠ₯
private ν•΄λ‹Ή 클래슀의 μΈμŠ€ν„΄μŠ€μ—μ„œλ§Œ μ ‘κ·Ό κ°€λŠ₯

 

class Person {
    public name: string;
    private age: number;
    protected gender: 'M' | 'F';

    constructor(name: string, age: number, gender: 'M' | 'F') {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    sayName() {
        return `이름은 ${this.name} μž…λ‹ˆλ‹€.`
    }

    sayAge() {
        return `λ‚˜μ΄λŠ” ${this.age}`
    }
}

const person1 = new Person('kkan', 22, 'M');

console.log(person1.sayAge())
// "λ‚˜μ΄λŠ” 22"

 

- private / protectedλŠ” .(dot) μ—°μ‚°μžλ₯Ό 톡해 접근이 λΆˆκ°€λŠ₯ν•˜λ‹€.

public인 name만 찍힘

 

private둜 μ„ μ–Έλœ ν•¨μˆ˜λŠ” μ„œλΈŒν΄λž˜μŠ€μ—μ„œλ„ μ ‘κ·Ό λΆˆκ°€.
protectedλŠ” μ„œλΈŒν΄λž˜μŠ€μ—μ„œ μ ‘κ·Ό κ°€λŠ₯.

 

1-7. static

 

  • 클래슀의 속성과 λ©”μ„œλ“œλ₯Ό new둜 μΈμŠ€ν„΄μŠ€ν™” ν•˜μ§€ μ•Šκ³  ν˜ΈμΆœν•  수 μžˆλ‹€.
  • μ ‘κ·Ό μ œμ–΄μžλ₯Ό ν™œμš©ν•  수 μžˆλ‹€.
  • λͺ‡κ°€μ§€ 정적 이름을 μ‚¬μš©ν•  수 μ—†λ‹€.

접근이 λ˜μ§€ μ•ŠλŠ”λ‹€...
static을 뢙이면 λͺ¨λ‘ μ ‘κ·Ό κ°€λŠ₯!

class StaticClass {
    private static type = 'Type';

    static getType() {
        return StaticClass.type;
    }
}

StaticClass.getType();

μ΄λ ‡κ²Œλ„ μ‚¬μš© κ°€λŠ₯ν•˜λ‹€.

 

1-8. readonly

Ts만의 κΈ°λŠ₯!

μ•ˆμ „ν•˜κ²Œ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€.

class Person {
    name: string;
    age: number;

    constructor(name: string, age: number) {
        this.name = name;
        this.age = age;
    }
}

const person1 = new Person('kkan', 22);
console.log(person1.name)   // "kkan"

person1.name = 'kim';
console.log(person1.name)   // "kim"

μ†μ‰½κ²Œ μ ‘κ·Όν•˜μ—¬ μˆ˜μ •μ΄ κ°€λŠ₯ν•˜λ‹€.

 

이제 접근이 λΆˆκ°€λŠ₯ν•˜λ‹€.

1-9. μΆ”μƒν΄λž˜μŠ€

 

  • abstractλ₯Ό μ„ μ–Έν•œ 클래슀둜 직접 μΈμŠ€ν„΄μŠ€ν™” 될 수 μ—†λŠ” ν΄λž˜μŠ€μ΄λ‹€.
  • 직접 μΈμŠ€ν„΄μŠ€ν™” 될 수 μ—†μ§€λ§Œ, extends ν›„ νŒŒμƒλœ 클래슀λ₯Ό μΈμŠ€ν„΄μŠ€ν™”ν•˜λ„λ‘ μœ λ„ν•œλ‹€.
  • 좔상 ν΄λž˜μŠ€λŠ” κ΅¬ν˜„λœ λ©”μ„œλ„λ₯Ό 포함 μ‹œν‚¬ 수 μžˆλ‹€.
  • abstract μ„ μ–Έν•œ λ©”μ„œλ„λŠ” νŒŒμƒλœ ν΄λž˜μŠ€μ—μ„œ λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•΄μ•Όν•œλ‹€.
  • μ„€κ³„μ˜ λͺ©μ μ„ κ°€μ‘Œλ‹€κ³  μƒκ°ν•˜λ©΄ λœλ‹€. (μ„ μ–Έλœ λ©”μ„œλ“œλ₯Ό κ°•μ œμ μœΌλ‘œ κ΅¬ν˜„ν•΄μ•Όν•˜λ―€λ‘œ!)
abstract class Person {
    // μ„ μ–Έλœ λ©”μ„œλ“œ
    abstract hello(): string

    // κ΅¬ν˜„λœ λ©”μ„œλ“œ
    run() {
        return this.hello() + ' run'
    }
}

// 직접 μΈμŠ€ν„΄μŠ€κ°€ 될 수 μ—†λ‹€.
// const person1 = new Person();

class Student extends Person {
    hello() {
        return 'μ•ˆλ…•!'
    }
}

const student = new Student(); 
console.log(student.hello());

 

1-10. Parameter Properties

 

이제 μ½”λ“œμ˜ 가독성을 올렀보자!

 

STEP.01

class Person {
    public name: string;
    private age: number;
    protected gender: 'M' | 'F';

    constructor(name: string, age: number, gender: 'M' | 'F') {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    sayName() {
        return `이름은 ${this.name} μž…λ‹ˆλ‹€.`
    }

    protected sayAge() {
        return `λ‚˜μ΄λŠ” ${this.age} μž…λ‹ˆλ‹€.`
    }
}

class Student extends Person {
    id: number;

    constructor(name: string, age: number, gender: 'M' | 'F', id: number) {
        super(name, age, gender)
        this.id = id
    }
}

 

STEP.02

class Person {
    constructor(
        public name: string,
        private age: number,
        protected gender: 'M' | 'F') {
        //μƒλž΅λ¨
    }

    sayName() {
        return `이름은 ${this.name} μž…λ‹ˆλ‹€.`
    }

    protected sayAge() {
        return `λ‚˜μ΄λŠ” ${this.age} μž…λ‹ˆλ‹€.`
    }
}

class Student extends Person {
    id: number;

    constructor(name: string, age: number, gender: 'M' | 'F', id: number) {
        super(name, age, gender)
        this.id = id
    }
}

쑰금 보기 쒋을지도,,?

 

1-11. λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”©

λΆ€λͺ¨ ν΄λž˜μŠ€μ— μ •μ˜λœ λ©”μ„œλ“œλ₯Ό μžμ‹ ν΄λž˜μŠ€μ—μ„œ μƒˆλ‘œ κ΅¬ν˜„ν•˜λŠ” 것이닀.

  • μ˜€λ²„ λΌμ΄λ“œ λ©”μ„œλ“œμ˜ λ§€κ°œλ³€μˆ˜ νƒ€μž…μ€ μ˜€λ²„ 라이딩 λ©”μ„œλ“œμ˜ λ§€κ°œλ³€μˆ˜ νƒ€μž…κ³Ό κ°™κ±°λ‚˜ μƒμœ„ νƒ€μž…μ΄μ–΄μ•Ό ν•œλ‹€.
  • μ˜€λ²„ λΌμ΄λ“œ λ©”μ„œλ“œμ˜ λ§€κ°œλ³€μˆ˜ κ°œμˆ˜κ°€ μ˜€λ²„ 라이딩 λ©”μ„œλ“œμ˜ λ§€κ°œλ³€μˆ˜ κ°œμˆ˜μ™€ κ°™κ±°λ‚˜ λ§Žμ•„μ•Ό ν•œλ‹€. (단, 쑰건 1이 μ„±λ¦½λœλ‹€λŠ” μ „μ œκ°€ μžˆμ–΄μ•Ό 함)
class Person {
    run() {
        return '달리기!'
    }
}

class Businessman extends Person {
    run() {
        return 'νšŒμ‚¬μ›μ΄ 달린닀.'
    }
}

class Student extends Person {
    run() {
        return '학생이 달린닀.'
    }
}

const person1 = new Person();           // "달리기!"
const student1 = new Student();         // "νšŒμ‚¬μ›μ΄ 달린닀."
const businessman1 = new Businessman(); // "학생이 달린닀."

 

 

 

End.

728x90
λ°˜μ‘ν˜•