관리 메뉴

Daehyunii's Dev-blog

25μž₯ 클래슀 λ³Έλ¬Έ

25.2 클래슀 μ •μ˜

  ν΄λž˜μŠ€λŠ” class ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ •μ˜ν•œλ‹€. 클래슀 이름은 μƒμ„±μž ν•¨μˆ˜μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ 파슀칼 μΌ€μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λŠ”κ²ƒμ΄ μΌλ°˜μ μ΄λ‹€.

// 클래슀 μ„ μ–Έλ¬Έ
class Person {}

  ν΄λž˜μŠ€λŠ” ν•¨μˆ˜κ³ , λ”°λΌμ„œ ν΄λž˜μŠ€λŠ” κ°’μ²˜λŸΌ μ‚¬μš©ν•  수 μžˆλŠ” 일급 객체닀. 클래슀 λͺΈμ²΄μ—λŠ” 0개 μ΄μƒμ˜ λ©”μ„œλ“œλ§Œ μ •μ˜ν•  수 μžˆλ‹€. 클래슀 λͺΈμ²΄μ—μ„œ μ •μ˜ν•  수 μžˆλŠ” λ©”μ„œλ“œλŠ” constructor, ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œ, 정적 λ©”μ„œλ“œμ˜ μ„Έ 가지가 μžˆλ‹€.

// 클래슀 μ„ μ–Έλ¬Έ
class Person {
    // μƒμ„±μž
    constructor(name){
        this.name = name; // ν΄λž˜μŠ€μ— μ˜ν•΄ λ―Έλž˜μ— 생성될 객체의 ν”„λ‘œνΌν‹°
    }

    // ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œ
    sayHi(){
        console.log(`Hi my name is ${this.name}`);
    }

    // 정적 λ©”μ„œλ“œ
    static sayHello(){
        console.log('hello!');
    }
}

//μΈμŠ€ν„΄μŠ€ 생성
const me = new Person('lee');

console.log(me.name); // lee

me.sayHi(); // Hi my name is lee

Person.sayHello(); // hello!

  ν΄λž˜μŠ€μ™€ μƒμ„±μž ν•¨μˆ˜μ˜ μ •μ˜ 방식은 ν˜•νƒœμ μΈ λ©΄μ—μ„œ 맀우 μœ μ‚¬ν•˜λ‹€.

 

25.4 μΈμŠ€ν„΄μŠ€ 생성

  ν΄λž˜μŠ€λŠ” κ²°κ΅­ μƒμ„±μž ν•¨μˆ˜μ΄λ©° new μ—°μ‚°μžμ™€ ν•¨κ»˜ ν˜ΈμΆœλ˜μ–΄ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•œλ‹€.

class Person {}

const me = new Person();
console.log(me); // Person {}

  ν•¨μˆ˜λŠ” new μ—°μ‚°μžμ˜ μ‚¬μš© 여뢀에 따라 일반 ν•¨μˆ˜λ‘œ ν˜ΈμΆœλ˜κ±°λ‚˜ μΈμŠ€ν„΄μŠ€ 생성을 μœ„ν•œ μƒμ„±μž ν•¨μˆ˜λ‘œ ν˜ΈμΆœλ˜μ§€λ§Œ ν΄λž˜μŠ€λŠ” μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ” 것이 μœ μΌν•œ 쑴재 μ΄μœ μ΄λ―€λ‘œ λ°˜λ“œμ‹œ new μ—°μ‚°μžμ™€ ν•¨κ»˜ ν˜ΈμΆœν•΄μ•Ό ν•œλ‹€.

 

25.5 λ©”μ„œλ“œ

  클래슀 λͺΈμ²΄μ—λŠ” 0개 μ΄μƒμ˜ λ©”μ„œλ“œλ§Œ μ„ μ–Έν•  수 μžˆλ‹€. 클래슀 λͺΈμ²΄μ—μ„œ μ •μ˜ν•  수 μžˆλŠ” λ©”μ„œλ“œλŠ” constructor λ©”μ„œλ“œ, ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œ, 정적 λ©”μ„œλ“œ 세가지가 μžˆλ‹€.

 

25.5.1 constructor 

  constructorλŠ” μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ³  μ΄ˆκΈ°ν™”ν•˜κΈ° μœ„ν•œ νŠΉμˆ˜ν•œ λ©”μ„œλ“œλ‹€. constructroλŠ” 이름을 λ³€κ²½ν•  수 μ—†λ‹€.

class Person {
    constructor(name){
        this.name = name;
    }
}

 

25.5.2 ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œ

  μƒμ„±μž ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ” 경우 ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œλ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•΄μ„œλŠ” λͺ…μ‹œμ μœΌλ‘œ ν”„λ‘œν† νƒ€μž…μ— λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•΄μ•Ό ν•œλ‹€. ν•˜μ§€λ§Œ 클래슀 λͺΈμ²΄μ—μ„œ μ •μ˜ν•œ λ©”μ„œλ“œλŠ” μƒμ„±μž ν•¨μˆ˜μ— μ˜ν•œ 객체 생성 λ°©μ‹κ³ΌλŠ” λ‹€λ₯΄κ²Œ 클래슀의 prototype ν”„λ‘œνΌν‹°μ— λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•˜μ§€ μ•Šμ•„λ„ 기본적으둜 ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œκ°€ λœλ‹€.

// 클래슀 μ„ μ–Έλ¬Έ
class Person {
    // μƒμ„±μž
    constructor(name){
        this.name = name; 
    }

    // ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œ
    sayHi(){
        console.log(`Hi my name is ${this.name}`);
    }
}

const you = new Person('park');
you.sayHi(); // Hi my name is park

  μƒμ„±μž ν•¨μˆ˜μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ ν΄λž˜μŠ€κ°€ μƒμ„±ν•œ μΈμŠ€ν„΄μŠ€λŠ” ν”„λ‘œν† νƒ€μž… 체인의 일원이 λœλ‹€.

 

25.5.3 정적 λ©”μ„œλ“œ

  정적 λ©”μ„œλ“œλŠ” μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ§€ μ•Šμ•„λ„ ν˜ΈμΆœν•  수 μžˆλŠ” λ©”μ„œλ“œ 즉, ν•¨μˆ˜ 객체 μžμ‹ μ΄ κ°€μ§€λŠ” λ©”μ„œλ“œλ₯Ό λ§ν•œλ‹€. μƒμ„±μž ν•¨μˆ˜μ˜ 경우 μ •μ λ©”μ„œλ“œλ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•΄μ„œλŠ” λͺ…μ‹œμ μœΌλ‘œ μƒμ„±μž ν•¨μˆ˜μ— λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•΄μ•Ό ν•œλ‹€. ν•˜μ§€λ§Œ ν΄λž˜μŠ€μ—μ„œλŠ” λ©”μ„œλ“œμ— static ν‚€μ›Œλ“œλ₯Ό 뢙이면 정적 λ©”μ„œλ“œκ°€ λœλ‹€.

// 클래슀 μ„ μ–Έλ¬Έ
class Person {
    // μƒμ„±μž
    constructor(name){
        this.name = name; // ν΄λž˜μŠ€μ— μ˜ν•΄ λ―Έλž˜μ— 생성될 객체의 ν”„λ‘œνΌν‹°
    }

    // 정적 λ©”μ„œλ“œ
    static sayHello(){
        console.log('hello!');
    }
}

Person.sayHello(); // hello!

25.7 ν”„λ‘œνΌν‹°

25.7.1 μΈμŠ€ν„΄μŠ€ ν”„λ‘œνΌν‹°

  μΈμŠ€ν„΄μŠ€ ν”„λ‘œνΌν‹°λŠ” constructor λ‚΄λΆ€μ—μ„œ μ •μ˜ν•΄μ•Ό ν•œλ‹€.

class Person {
    constructor(name){
        this.name = name; // ν΄λž˜μŠ€μ— μ˜ν•΄ λ―Έλž˜μ— 생성될 객체의 ν”„λ‘œνΌν‹°
    }
}

const me = new Person('lee');
console.log(me); // Person {name : 'lee'}

  constructor λ‚΄λΆ€ μ½”λ“œκ°€ μ‹€ν–‰λ˜κΈ° 이전에 constructor λ‚΄λΆ€μ˜ thisμ—λŠ” 이미 ν΄λž˜μŠ€κ°€ μ•”λ¬΅μ μœΌλ‘œ μƒμ„±ν•œ μΈμŠ€ν„΄μŠ€μΈ 빈 객체가 λ°”μΈλ”©λ˜μ–΄ μžˆλ‹€.

 

25.8 상속에 μ˜ν•œ 클래슀 ν™•μž₯

25.8.1 클래슀 상속과 μƒμ„±μž ν•¨μˆ˜ 상속

  상속에 μ˜ν•œ 클래슀 ν™•μž₯은 μ§€κΈˆκΉŒμ§€ μ‚΄νŽ΄λ³Έ ν”„λ‘œν† νƒ€μž… 기반 μƒμ†κ³ΌλŠ” λ‹€λ₯Έ κ°œλ…μ΄λ‹€. ν”„λ‘œν† νƒ€μž… 기반 상속은 ν”„λ‘œν† νƒ€μž… 체인을 톡해 λ‹€λ₯Έ 객체의 μžμ‚°μ„ μƒμ†λ°›λŠ” κ°œλ…μ΄μ§€λ§Œ 상속에 μ˜ν•œ 클래슀 ν™•μž₯은 κΈ°μ‘΄ 클래슀λ₯Ό 상속받아 μƒˆλ‘œμš΄ 클래슀λ₯Ό ν™•μž₯ν•˜μ—¬ μ •μ˜ν•˜λŠ” 것이닀.

class Animal {
    constructor(age, weight){
        this.age = age;
        this.weight = weight;
    }

    eat(){
        return 'eat';
    }

    move(){
        return 'move';
    }
}

// 상속을 톡해 Animal 클래슀λ₯Ό ν™•μž₯ν•œ Bird 클래슀
class Bird extends Animal {
    fly(){
        return 'fly';
    }
}

const bird = new Bird(1,5);

console.log(bird); // Bird {age: 1, weight: 5}
console.log(bird instanceof Bird); // true
console.log(bird instanceof Animal); // true

console.log(bird.eat()); // eat
console.log(bird.move()); // move
console.log(bird.fly()); // fly

25.8.2 extends ν‚€μ›Œλ“œ

  상속을 톡해 클래슀λ₯Ό ν™•μž₯ν•˜λ €λ©΄ extends ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 상속받을 클래슀λ₯Ό μ •μ˜ν•œλ‹€. 상속을 톡해 ν™•μž₯된 클래슀λ₯Ό μ„œλΈŒν΄λž˜μŠ€λΌ λΆ€λ₯΄κ³ , μ„œλΈŒν΄λž˜μŠ€μ—κ²Œ μƒμ†λœ 클래슀λ₯Ό 수퍼클래슀라 λΆ€λ₯Έλ‹€. μˆ˜νΌν΄λž˜μŠ€μ™€ μ„œλΈŒν΄λž˜μŠ€λŠ” μΈμŠ€ν„΄μŠ€μ˜ ν”„λ‘œν† νƒ€μž… 체인뿐 μ•„λ‹ˆλΌ 클래슀 κ°„μ˜ ν”„λ‘œν† νƒ€μž… 체인도 μƒμ„±ν•œλ‹€. 이λ₯Ό 톡해 ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œ, 정적 λ©”μ„œλ“œ λͺ¨λ‘ 상속이 κ°€λŠ₯ν•˜λ‹€.