15. class

양희쀀·2022λ…„ 1μ›” 30일
0

JavaScript Info

λͺ©λ‘ 보기
15/19
post-thumbnail

πŸ“Œ 15-1 ν΄λž˜μŠ€λž€?

ES6μ—μ„œ μΆ”κ°€λœ μƒˆλ‘œμš΄ 객체 생성 λ°©μ‹μœΌλ‘œ 클래슀 기반 객체지ν–₯ μ–Έμ–΄μ²˜λŸΌ μ‚¬μš©ν•  수 있게 λ§Œλ“€μ–΄λ…Ό ν˜•μ‹μ΄λ‹€.

  • λ‹€λ₯Έ μ–Έμ–΄μ˜ OOP κ°œλ…μ€ κ°™μ§€λ§Œ prototype에 λ©”μ†Œλ“œλ₯Ό μ—°κ²°ν•˜λŠ” ꡬ쑰
  • μ—°κ²°λœ λ©”μ†Œλ“œλ‘œ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•œλ‹€.

πŸ“Œ 15-2 클래슀의 νŠΉμ§•

  • new μ—°μ‚°μž 없이 ν˜ΈμΆœν•˜λ©΄ 였λ₯˜κ°€ λ°œμƒν•œλ‹€.
  • extends, super와 같은 문법을 μ‚¬μš©ν•˜μ—¬ 상속을 κ°„κ²°ν•˜κ²Œ λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€.
  • μ΄λ¦„μ˜ 첫 λ¬ΈμžλŠ” λŒ€λ¬Έμžλ₯Ό μ‚¬μš©ν•˜λŠ” 파슀칼 μΌ€μ΄μŠ€λ₯Ό μ‚¬μš©ν•œλ‹€.
  • λ©”μ†Œλ“œλ₯Ό ν”„λ‘œν† νƒ€μž…μœΌλ‘œ μ—°κ²°ν•˜μ—¬ μž‘μ„±ν•˜μ§€ μ•ŠλŠ”λ‹€.
  • ν‘œν˜„μ‹κ³Ό 선언문이 κ°€λŠ₯ν•˜λ‹€.
// 클래슀 μ„ μ–Έλ¬Έ
class Student {
    constructor(name) {
        this.name = name;
    }
}
// μΈμŠ€ν„΄μŠ€λ₯Ό new μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜μ—¬ 생성
const student = new Student("kim");
// 클래슀 μ•ˆμ˜ ν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš©ν•  수 있음
console.log(student.name);

/*
클래슀 ν‘œν˜„μ‹
const Student = class {
    constructor(name) {
        this.name = name;
    }
}
*/

πŸ“Œ 15-3 클래슀의 μš”μ†Œ

클래슀의 μš”μ†ŒλŠ” constructor (μƒμ„±μž), ν”„λ‘œν† νƒ€μž… λ©”μ†Œλ“œ, 정적 λ©”μ†Œλ“œλ‘œ κ΅¬μ„±λ˜μ–΄ μžˆλ‹€.

  • constructor: μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ³  μ΄ˆκΈ°ν™” ν•˜λŠ” 역할을 μˆ˜ν–‰ν•œλ‹€.
  • 정적 λ©”μ†Œλ“œ: μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ§€ μ•Šκ³  직접 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  수 μžˆλ‹€.
  • ν”„λ‘œν† νƒ€μž… λ©”μ†Œλ“œ: μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•΄μ„œ ν˜ΈμΆœν•  수 μžˆλ‹€.

🧩 클래슀 λ‚΄λΆ€ μš”μ†Œμ˜ νŠΉμ§•

  • constructor의 λ‚΄λΆ€ thisλŠ” μΈμŠ€ν„΄μŠ€μ˜ ν”„λ‘œνΌν‹°κ°€ λœλ‹€.
  • 클래슀 μ•ˆμ—μ„œ μƒμ„±ν•œ ν•¨μˆ˜λŠ” 클래슀의 ν”„λ‘œν† νƒ€μž…μ— μΆ”κ°€λœλ‹€.
  • 클래슀 λ©”μ„œλ“œ μ•žμ— static 문법을 μ‚¬μš©ν•˜λ©΄ ν”„λ‘œν† νƒ€μž…μ— μ—°κ²°λ˜μ§€ μ•Šκ³  정적 λ©”μ†Œλ“œλ‘œ μ‚¬μš©λœλ‹€.
  • μΈμŠ€ν„΄μŠ€μ˜ ν”„λ‘œνΌν‹°λŠ” constructor의 λ‚΄λΆ€μ—μ„œ μ •μ˜ν•œλ‹€.
  • constructor λ‚΄λΆ€λŠ” public ν•„λ“œμ΄λ‹€.
class Student {
    static name = "Lee";
    static log() {
        console.log(`정적 λ©”μ†Œλ“œ κ²°κ³Ό = ${this.name}`);
    }
    constructor(name) {
        this.name = name;
    }
    log() {
        console.log(`ν”„λ‘œν† νƒ€μž… λ©”μ†Œλ“œ κ²°κ³Ό = ${this.name}`);
    }
}
const student = new Student("Kim");
// κ²°κ³Ό : 정적 λ©”μ†Œλ“œ κ²°κ³Ό = Lee
Student.log();
// κ²°κ³Ό : ν”„λ‘œν† νƒ€μž… λ©”μ†Œλ“œ κ²°κ³Ό = Kim
student.log();
  • 정적 λ©”μ†Œλ“œ μ˜μ—­κ³Ό ν”„λ‘œν† νƒ€μž… λ©”μ†Œλ“œ μ˜μ—­μ€ κ³΅μœ ν•˜μ§€ μ•ŠλŠ”λ‹€.
  • 정적 λ©”μ†Œλ“œ 방식은 객체에 λ©”μ†Œλ“œλ₯Ό μΆ”κ°€ν•˜λŠ” 방식과 κ°™λ‹€.

πŸ“Œ 15-4 μƒμ„±μž ν•¨μˆ˜μ—μ„œμ˜ 정적 λ©”μ†Œλ“œ ν”„λ‘œν† νƒ€μž… λ©”μ†Œλ“œ

function Student(age) {
    this.age = age;
}
Student.prototype.log = function() {
    console.log(`ν”„λ‘œν† νƒ€μž… λ©”μ†Œλ“œ κ²°κ³Ό = ${this.age}`);
}
Student.age = 21;
Student.log = function() {
    console.log(`정적 λ©”μ†Œλ“œ κ²°κ³Ό = ${this.age}`);
}
const student = new Student(30);
// κ²°κ³Ό : 정적 λ©”μ†Œλ“œ κ²°κ³Ό = 21
Student.log();
// κ²°κ³Ό : ν”„λ‘œν† νƒ€μž… λ©”μ†Œλ“œ κ²°κ³Ό = 30
student.log();

🧩 μƒμ„±μž ν•¨μˆ˜μ™€ 클래슀의 정적 λ©”μ†Œλ“œμ™€ ν”„λ‘œν† νƒ€μž… λ©”μ†Œλ“œ 차이

  • μƒμ •μž ν•¨μˆ˜μ—μ„œλŠ” 직접 ν”„λ‘œν† νƒ€μž…μ— μ—°κ²°ν•˜μ§€λ§Œ ν΄λž˜μŠ€λŠ” λ‚΄λΆ€μ˜ ν•¨μˆ˜μ„ μ‚¬μš©ν•˜λ©΄ ν”„λ‘œν† νƒ€μž…μ— μžλ™ μ—°κ²°λœλ‹€.
  • μƒμ„±μž ν•¨μˆ˜μ—μ„œλŠ” 직접 일급객체인 ν•¨μˆ˜λΌλŠ” νŠΉμ„±μ„ μ‚¬μš©ν•΄μ„œ 정적 λ©”μ†Œλ“œλ₯Ό μΆ”κ°€ν•˜μ§€λ§Œ ν΄λž˜μŠ€λŠ” static 문법을 μ§€μ›ν•œλ‹€.
  • ν”„λ‘œν† νƒ€μž… μ˜μ—­κ³Ό 정적 μ˜μ—­μ€ 객체의 생성 방식이 λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— 각자의 μ˜μ—­μ„ μΉ¨λ²”ν•˜μ§€ μ•ŠλŠ”λ‹€.

πŸ“Œ 15-5 public ν•„λ“œμ™€ private ν•„λ“œ

🧩 public ν•„λ“œ

  • constructor μ•ˆμ˜ 곡간은 무쑰건 pubilc μ˜μ—­μ΄λ‹€.
  • pubilc λ©”μ†Œλ“œλ‚˜ ν”„λ‘œνΌν‹°λ“€μ€ μ–΄λ””μ„œλ“  μ°Έμ‘°κ°€ κ°€λŠ₯ν•˜λ‹€.

🧩 private ν•„λ“œ

  • constructor λ°–μ˜ 곡간도 pubilc μ˜μ—­μ΄μ§€λ§Œ ν”„λ‘œνΌν‹°λ‚˜ λ©”μ†Œλ“œμ— #을 λΆ™ν˜€μ£Όλ©΄ private μ˜μ—­μœΌλ‘œ λ“€μ–΄κ°€κ²Œ λœλ‹€.
  • private λ©”μ†Œλ“œλ‚˜ ν”„λ‘œνΌν‹°λ“€μ€ 클래슀 λ‚΄λΆ€μ—μ„œλ§Œ μ°Έμ‘°κ°€ κ°€λŠ₯ν•˜λ‹€.
  • private μ˜μ—­μ„ μ‚¬μš©ν•¨μœΌλ‘œ μΊ‘μŠν™”μ™€ 은닉화λ₯Ό 지킬 수 μžˆλ‹€.
class Sum {
    // constructor λ°–μ—μ„œ ν”„λ‘œνΌν‹°λ‚˜ λ©”μ†Œλ“œμ— #을 λΆ™ν˜€μ£Όλ©΄ private이닀.
    #num1 = 10;
    constructor(num2) {
        this.num2 = num2;
    }
    add() {
        // 클래슀 λ‚΄λΆ€μ—μ„œλŠ” private ν”„λ‘œνΌν‹°λ₯Ό μ°Έμ‘°ν•  수 μžˆλ‹€.
        return this.#num1 + this.num2;
    }
}

const sum = new Sum(5);
// κ²°κ³Ό : 15
console.log(sum.add());
// κ²°κ³Ό : 5
console.log(sum.num2);
// κ²°κ³Ό : Private field '#num1' must be declared in an enclosing class (참초 λΆˆκ°€)
console.log(sum.#num1);
profile
JS 코린이

0개의 λŒ“κΈ€