๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Language/Javascript

[Javascript]์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Getter, Setter, Static ์™„๋ฒฝ ๊ฐ€์ด๋“œ: ๊ฐœ๋…๊ณผ ํ™œ์šฉ ์˜ˆ์ œ

by YJ Dev 2024. 6. 26.
728x90
๋ฐ˜์‘ํ˜•
SMALL

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ Getter์™€ Setter๋Š” ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ œ์–ดํ•˜๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Static ํ‚ค์›Œ๋“œ๋Š” ํด๋ž˜์Šค ๋ ˆ๋ฒจ์—์„œ ๋ฉ”์„œ๋“œ์™€ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๊ฐœ๋…๋“ค์„ ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ณ , ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ getter์™€ setter


Getter์™€ setter ๊ทธ๋ฆฌ๊ณ  static ๋ฉค๋ฒ„๋Š” ๋ชจ๋‘ ํด๋ž˜์Šค์™€ ๊นŠ์€ ์—ฐ๊ด€์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋“ค์€ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ํด๋ž˜์Šค์˜ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•˜๊ณ  ์ œ์–ดํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ํด๋ž˜์Šค์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ •๋ณด๋Š” ์•„๋ž˜ ํฌ์ŠคํŒ…์—์„œ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.๐Ÿ˜

""

[์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ]์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค ์ดํ•ดํ•˜๊ธฐ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ํด๋ž˜์Šค๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ๋งค์šฐ ์œ ์šฉํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ํด๋ž˜์Šค๋Š” ๊ฐ์ฒด์˜ ๊ตฌ์กฐ์™€ ํ–‰๋™์„ ์ •์˜ํ•˜๋Š” ํ‹€์„ ์ œ๊ณตํ•˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ๋” ๊น”๋”ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ

creativevista.tistory.com


01. Getter์™€ Setter์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๐Ÿ“š

Getter๋ž€?

Getter๋Š” ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. ํ”„๋กœํผํ‹ฐ๋ฅผ ์ง์ ‘ ์ ‘๊ทผํ•˜๋Š” ๋Œ€์‹ , Getter๋ฅผ ํ†ตํ•ด ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Getter๋ฅผ ์ •์˜ํ•  ๋•Œ๋Š” get ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Setter๋ž€?

Setter๋Š” ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ์„ค์ •ํ•˜๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. ํ”„๋กœํผํ‹ฐ์— ์ƒˆ๋กœ์šด ๊ฐ’์„ ํ• ๋‹นํ•  ๋•Œ Setter๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถ”๊ฐ€์ ์ธ ๊ฒ€์ฆ์ด๋‚˜ ๋กœ์ง์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Setter๋ฅผ ์ •์˜ํ•  ๋•Œ๋Š” set ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.


02. Getter์™€ Setter ์‚ฌ์šฉ๋ฒ•๐Ÿ“

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ Getter์™€ Setter๋Š” ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•˜๊ณ  ๊ฐ’์„ ์„ค์ •ํ•˜๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜๊ณ , ์™ธ๋ถ€ ์ ‘๊ทผ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ES2019์—์„œ ๋„์ž…๋œ # ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋ผ์ด๋น— ํ•„๋“œ๋ฅผ ์ •์˜ํ•˜๊ณ , ์ด๋ฅผ Getter์™€ Setter๋กœ ์ œ์–ดํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์˜ˆ์ œ๋กœ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

1. ํ”„๋ผ์ด๋น— ํ•„๋“œ ์„ ์–ธ ๋ฐ ์ดˆ๊ธฐํ™”

ํ”„๋ผ์ด๋น— ํ•„๋“œ๋Š” ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, # ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.

class Person {
  #name; // ํ”„๋ผ์ด๋น— ํ•„๋“œ๋ฅผ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.

  constructor(name) {
    this.#name = name; // ์ƒ์„ฑ์ž์—์„œ ํ”„๋ผ์ด๋น— ํ•„๋“œ๋ฅผ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
  }

2. Getter ์ •์˜

Getter๋Š” get ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜ํ•˜๋ฉฐ, ํ”„๋ผ์ด๋น— ํ•„๋“œ์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  // Getter ๋ฉ”์„œ๋“œ
  get name() {
    return this.#name; // ํ”„๋ผ์ด๋น— ํ•„๋“œ์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  }

3. Setter ์ •์˜

Setter๋Š” set ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜ํ•˜๋ฉฐ, ํ”„๋ผ์ด๋น— ํ•„๋“œ์˜ ๊ฐ’์„ ์„ค์ •ํ•  ๋•Œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. Setter์—์„œ๋Š” ๊ฐ’์„ ๊ฒ€์ฆํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€์ ์ธ ๋กœ์ง์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  // Setter ๋ฉ”์„œ๋“œ
  set name(newName) {
    if (newName) { // newName์ด ๋นˆ ๊ฐ’์ด ์•„๋‹Œ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
      this.#name = newName; // ํ”„๋ผ์ด๋น— ํ•„๋“œ์˜ ๊ฐ’์„ ์ƒˆ๋กœ์šด ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    } else {
      console.log('์ด๋ฆ„์€ ๋นˆ ๊ฐ’์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.'); // newName์ด ๋นˆ ๊ฐ’์ด๋ฉด ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
    }
  }
}

4. ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐ Getter์™€ Setter ํ˜ธ์ถœ

๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ํ›„, Getter์™€ Setter๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋ผ์ด๋น— ํ•„๋“œ์— ์ ‘๊ทผํ•˜๊ณ  ๊ฐ’์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const person = new Person('Alice'); // ์ƒˆ๋กœ์šด Person ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  name์„ 'Alice'๋กœ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
console.log(person.name); // Getter ํ˜ธ์ถœ: 'Alice'๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
person.name = 'Bob'; // Setter ํ˜ธ์ถœ: #name์˜ ๊ฐ’์„ 'Bob'์œผ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
console.log(person.name); // Getter ํ˜ธ์ถœ: 'Bob'์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
person.name = ''; // Setter ํ˜ธ์ถœ: '์ด๋ฆ„์€ ๋นˆ ๊ฐ’์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.' ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
console.log(person.name); // Getter ํ˜ธ์ถœ: #name์˜ ๊ฐ’์ด ์—ฌ์ „ํžˆ 'Bob'์ž„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

03. Getter์™€ Setter์˜ ์‹ค์ œ ํ™œ์šฉ ์˜ˆ์ œ๐Ÿ’ก

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ Getter์™€ Setter๋Š” ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•˜๊ณ  ์„ค์ •ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•œ ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋“ค์„ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ์ฝ๊ฑฐ๋‚˜ ์“ธ ๋•Œ ์ถ”๊ฐ€์ ์ธ ๋กœ์ง์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ํ™œ์šฉ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด Getter์™€ Setter์˜ ์œ ์šฉ์„ฑ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์˜ˆ์ œ 1: ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๊ฒ€์ฆ

์‚ฌ์šฉ์ž ํด๋ž˜์Šค์—์„œ ์ด๋ฉ”์ผ ์ฃผ์†Œ๋ฅผ ๊ฒ€์ฆํ•˜๋Š” Getter์™€ Setter

class User {
  #email; // ํ”„๋ผ์ด๋น— ํ•„๋“œ๋ฅผ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.

  constructor(email) {
    this.#email = email;
  }

  // Getter ๋ฉ”์„œ๋“œ
  get email() {
    return this.#email;
  }

  // Setter ๋ฉ”์„œ๋“œ
  set email(newEmail) {
    if (this.validateEmail(newEmail)) {
      this.#email = newEmail;
    } else {
      console.log('Invalid email format');
    }
  }

  validateEmail(email) {
    return /\S+@\S+\.\S+/.test(email); // ์ด๋ฉ”์ผ ํ˜•์‹์„ ๊ฒ€์ฆํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์ •๊ทœ ํ‘œํ˜„์‹
  }
}

const user = new User('test@example.com');
console.log(user.email); // Getter ํ˜ธ์ถœ: 'test@example.com'
user.email = 'invalid-email'; // Setter ํ˜ธ์ถœ: 'Invalid email format'
console.log(user.email); // Getter ํ˜ธ์ถœ: 'test@example.com'
user.email = 'new@example.com'; // Setter ํ˜ธ์ถœ: ์œ ํšจํ•œ ์ด๋ฉ”์ผ ํ˜•์‹
console.log(user.email); // Getter ํ˜ธ์ถœ: 'new@example.com'

์ด ์˜ˆ์ œ์—์„œ๋Š” ์ด๋ฉ”์ผ ์ฃผ์†Œ๋ฅผ ๊ฒ€์ฆํ•˜๋Š” ๋กœ์ง์ด Setter์— ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ ํ˜•์‹์˜ ์ด๋ฉ”์ผ ์ฃผ์†Œ๋ฅผ ์„ค์ •ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋˜๊ณ , ๊ธฐ์กด ์ด๋ฉ”์ผ ์ฃผ์†Œ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


์˜ˆ์ œ 2: ์ œํ’ˆ ๊ฐ€๊ฒฉ ๊ด€๋ฆฌ

์ œํ’ˆ ํด๋ž˜์Šค์—์„œ ๊ฐ€๊ฒฉ์„ ๊ฒ€์ฆํ•˜๋Š” Getter์™€ Setter

class Product {
  #price; // ํ”„๋ผ์ด๋น— ํ•„๋“œ๋ฅผ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.

  constructor(price) {
    this.#price = price;
  }

  // Getter ๋ฉ”์„œ๋“œ
  get price() {
    return this.#price;
  }

  // Setter ๋ฉ”์„œ๋“œ
  set price(newPrice) {
    if (newPrice > 0) {
      this.#price = newPrice;
    } else {
      console.log('Price must be a positive number');
    }
  }
}

const product = new Product(100);
console.log(product.price); // Getter ํ˜ธ์ถœ: 100
product.price = -50; // Setter ํ˜ธ์ถœ: 'Price must be a positive number'
console.log(product.price); // Getter ํ˜ธ์ถœ: 100
product.price = 150; // Setter ํ˜ธ์ถœ: ์œ ํšจํ•œ ๊ฐ€๊ฒฉ
console.log(product.price); // Getter ํ˜ธ์ถœ: 150

์ด ์˜ˆ์ œ์—์„œ๋Š” ๊ฐ€๊ฒฉ์ด 0๋ณด๋‹ค ํฐ์ง€ ๊ฒ€์ฆํ•˜๋Š” ๋กœ์ง์ด Setter์— ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฐ€๊ฒฉ์„ ์„ค์ •ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋˜๊ณ , ๊ธฐ์กด ๊ฐ€๊ฒฉ์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


์˜ˆ์ œ 3: ํ•™์ƒ ์ ์ˆ˜ ๊ด€๋ฆฌ

ํ•™์ƒ ํด๋ž˜์Šค์—์„œ ์ ์ˆ˜๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” Getter์™€ Setter

class Student {
  #score; // ํ”„๋ผ์ด๋น— ํ•„๋“œ๋ฅผ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.

  constructor(score) {
    this.#score = score;
  }

  // Getter ๋ฉ”์„œ๋“œ
  get score() {
    return this.#score;
  }

  // Setter ๋ฉ”์„œ๋“œ
  set score(newScore) {
    if (newScore >= 0 && newScore <= 100) {
      this.#score = newScore;
    } else {
      console.log('Score must be between 0 and 100');
    }
  }
}

const student = new Student(85);
console.log(student.score); // Getter ํ˜ธ์ถœ: 85
student.score = 150; // Setter ํ˜ธ์ถœ: 'Score must be between 0 and 100'
console.log(student.score); // Getter ํ˜ธ์ถœ: 85
student.score = 95; // Setter ํ˜ธ์ถœ: ์œ ํšจํ•œ ์ ์ˆ˜
console.log(student.score); // Getter ํ˜ธ์ถœ: 95

์ด ์˜ˆ์ œ์—์„œ๋Š” ์ ์ˆ˜๊ฐ€ 0๊ณผ 100 ์‚ฌ์ด์ธ์ง€ ๊ฒ€์ฆํ•˜๋Š” ๋กœ์ง์ด Setter์— ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ํšจํ•˜์ง€ ์•Š์€ ์ ์ˆ˜๋ฅผ ์„ค์ •ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋˜๊ณ , ๊ธฐ์กด ์ ์ˆ˜๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


04. Static ํ‚ค์›Œ๋“œ์˜ ๊ฐœ๋…๊ณผ ์‚ฌ์šฉ๋ฒ•๐Ÿงฉ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ static ํ‚ค์›Œ๋“œ๋Š” ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์•„๋‹Œ ํด๋ž˜์Šค ์ž์ฒด์— ์†ํ•˜๋Š” ๋ฉ”์„œ๋“œ์™€ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ •์˜ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. Static ๋ฉ”์„œ๋“œ์™€ ํ”„๋กœํผํ‹ฐ๋Š” ํด๋ž˜์Šค์˜ ํŠน์ • ์ธ์Šคํ„ด์Šค๊ฐ€ ์•„๋‹Œ ํด๋ž˜์Šค ์ž์ฒด์— ๋ฌถ์—ฌ ์žˆ์œผ๋ฏ€๋กœ, ํด๋ž˜์Šค ์ด๋ฆ„์„ ํ†ตํ•ด ์ง์ ‘ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Static ํ‚ค์›Œ๋“œ์˜ ๊ฐœ๋…

  • Static ๋ฉ”์„œ๋“œ์™€ ํ”„๋กœํผํ‹ฐ๋Š” ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์•„๋‹Œ ํด๋ž˜์Šค ์ž์ฒด์— ์†ํ•ฉ๋‹ˆ๋‹ค.
  • ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Static ๋ฉ”์„œ๋“œ์™€ ํ”„๋กœํผํ‹ฐ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋‚˜ ์ƒ์ˆ˜ ๊ฐ’์„ ์ •์˜ํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

Static ๋ฉ”์„œ๋“œ ์ •์˜

Static ๋ฉ”์„œ๋“œ๋Š” static ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

class Calculator {
  // Static ๋ฉ”์„œ๋“œ ์ •์˜
  static add(a, b) {
    return a + b;
  }

  static multiply(a, b) {
    return a * b;
  }
}

console.log(Calculator.add(5, 3)); // 8
console.log(Calculator.multiply(5, 3)); // 15

์œ„ ์ฝ”๋“œ์—์„œ add์™€ multiply ๋ฉ”์„œ๋“œ๋Š” Calculator ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์•„๋‹Œ ํด๋ž˜์Šค ์ž์ฒด์— ์†ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Calculator ํด๋ž˜์Šค ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ ์ง์ ‘ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


Static ํ”„๋กœํผํ‹ฐ ์ •์˜

Static ํ”„๋กœํผํ‹ฐ๋„ static ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

class Configuration {
  // Static ํ”„๋กœํผํ‹ฐ ์ •์˜
  static apiUrl = 'https://api.example.com';

  static getApiUrl() {
    return Configuration.apiUrl;
  }
}

console.log(Configuration.apiUrl); // 'https://api.example.com'
console.log(Configuration.getApiUrl()); // 'https://api.example.com'

์œ„ ์ฝ”๋“œ์—์„œ apiUrl์€ Configuration ํด๋ž˜์Šค์˜ static ํ”„๋กœํผํ‹ฐ๋กœ, ํด๋ž˜์Šค ์ด๋ฆ„์„ ํ†ตํ•ด ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


05. Static ๋ฉ”์„œ๋“œ์™€ ํ”„๋กœํผํ‹ฐ์˜ ์‹ค์ œ ํ™œ์šฉ ์˜ˆ์ œ๐Ÿš€

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ static ๋ฉ”์„œ๋“œ์™€ ํ”„๋กœํผํ‹ฐ๋Š” ํด๋ž˜์Šค ์ž์ฒด์— ์†ํ•˜๋ฉฐ ์ธ์Šคํ„ด์Šคํ™”๋œ ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ ํด๋ž˜์Šค ์ž์ฒด์— ์ง์ ‘์ ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ static ๋ฉ”์„œ๋“œ์™€ ํ”„๋กœํผํ‹ฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‹ค์ œ์ ์ธ ํ™œ์šฉ ์˜ˆ์ œ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค.

1. ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋กœ์„œ์˜ ํ™œ์šฉ

class MathUtil {
  static multiply(a, b) {
    return a * b;
  }

  static add(a, b) {
    return a + b;
  }
}

// ์ธ์Šคํ„ด์Šคํ™” ์—†์ด ํด๋ž˜์Šค ์ด๋ฆ„์„ ํ†ตํ•ด ํ˜ธ์ถœ ๊ฐ€๋Šฅ
console.log(MathUtil.multiply(5, 10)); // 50
console.log(MathUtil.add(3, 7)); // 10

์œ„ ์˜ˆ์ œ์—์„œ MathUtil ํด๋ž˜์Šค๋Š” ์ˆ˜ํ•™ ๊ด€๋ จ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. multiply์™€ add ๋ฉ”์„œ๋“œ๋Š” ์ธ์Šคํ„ด์Šคํ™”๋œ ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ํด๋ž˜์Šค ์ž์ฒด์— ์†ํ•ด ์žˆ์œผ๋ฏ€๋กœ, MathUtil.multiply์™€ MathUtil.add๋ฅผ ํ†ตํ•ด ์ง์ ‘ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


2. ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ๋กœ์„œ์˜ ํ™œ์šฉ

class Car {
  constructor(make, model) {
    this.make = make;
    this.model = model;
  }

  static createCar(make, model) {
    return new Car(make, model);
  }
}

let myCar = Car.createCar('Toyota', 'Corolla');
console.log(myCar); // Car { make: 'Toyota', model: 'Corolla' }

์œ„ ์˜ˆ์ œ์—์„œ Car ํด๋ž˜์Šค๋Š” createCar๋ผ๋Š” static ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ์— ๋ณต์žกํ•œ ๋กœ์ง์ด๋‚˜ ์ดˆ๊ธฐํ™” ๊ณผ์ •์„ ๊ฐ์ถ”๊ณ  ๊ฐ„๋‹จํžˆ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•์Šต๋‹ˆ๋‹ค.


3. ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ์™€ ์—ฐ๋™์„ ์œ„ํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ”„๋กœํผํ‹ฐ

class API {
  static baseUrl = 'https://api.example.com';

  static fetchData(endpoint) {
    return fetch(`${API.baseUrl}/${endpoint}`)
      .then(response => response.json())
      .catch(error => console.error('Error fetching data:', error));
  }
}

// ์˜ˆ์ œ์—์„œ๋Š” fetch API๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ์‹ค์ œ API ์ฃผ์†Œ์™€ ์—ฐ๋™๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
API.fetchData('users')
  .then(data => console.log(data))
  .catch(error => console.error(error));

์œ„ ์˜ˆ์ œ์—์„œ API ํด๋ž˜์Šค๋Š” API์™€ ํ†ต์‹ ํ•  ๋•Œ ์‚ฌ์šฉํ•  ๊ธฐ๋ณธ URL์„ static ํ”„๋กœํผํ‹ฐ๋กœ ์ •์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. fetchData ๋ฉ”์„œ๋“œ๋Š” ์ด baseUrl์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ static ํ”„๋กœํผํ‹ฐ๋Š” ํด๋ž˜์Šค ์ „์—ญ์—์„œ ๊ณต์œ ๋˜๋ฉฐ, ํด๋ž˜์Šค์— ๊ด€๋ จ๋œ ์—ฌ๋Ÿฌ ๋ฉ”์„œ๋“œ์—์„œ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


06. Getter, Setter, Static์„ ์‚ฌ์šฉํ•  ๋•Œ ์ฃผ์˜ํ•  ์ โš ๏ธ

JavaScript์—์„œ Getter, Setter, ๊ทธ๋ฆฌ๊ณ  Static์„ ์‚ฌ์šฉํ•  ๋•Œ ๋ช‡ ๊ฐ€์ง€ ์ฃผ์˜ํ•  ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Getter์™€ Setter ์‚ฌ์šฉ ์‹œ

  • ๋ฌดํ•œ๋ฃจํ”„์— ์ฃผ์˜: Getter๋‚˜ Setter ๋‚ด์—์„œ ๋™์ผํ•œ ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•˜๊ฒŒ ๋˜๋ฉด ๋ฌดํ•œ๋ฃจํ”„๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ์ฝ๊ฑฐ๋‚˜ ์„ค์ •ํ•  ๋•Œ๋งˆ๋‹ค Getter๋‚˜ Setter๊ฐ€ ๋ฐ˜๋ณตํ•ด์„œ ํ˜ธ์ถœ๋˜๋Š” ๋ฌธ์ œ๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Getter์™€ Setter ๋‚ด์—์„œ ๋‹ค๋ฅธ ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ง์ ‘ ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ• ๋“ฑ์„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ถ€์ˆ˜ํšจ๊ณผ์— ์ฃผ์˜: Getter์™€ Setter๋Š” ๋ณดํ†ต ๊ณ„์‚ฐ๋œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ ๋‹ค๋ฅธ ๋ถ€์ˆ˜ํšจ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Setter์—์„œ ๋‹ค๋ฅธ ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์™ธ๋ถ€ ๋ฆฌ์†Œ์Šค์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

Static ์‚ฌ์šฉ ์‹œ

  • ์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผ ๋ถˆ๊ฐ€: Static ๋ฉ”์„œ๋“œ๋‚˜ ํ”„๋กœํผํ‹ฐ๋Š” ํด๋ž˜์Šค ์ž์ฒด์— ์†ํ•˜๋ฏ€๋กœ ์ธ์Šคํ„ด์Šคํ™”๋œ ๊ฐ์ฒด์—์„œ๋Š” ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Static ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ๋Š” this๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ๋‚˜ ๋ฉ”์„œ๋“œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

  • ์ƒ์†๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ ์‹œ ์ฃผ์˜: ์ƒ์†๋œ ํด๋ž˜์Šค์—์„œ Static ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ, ์ผ๋ฐ˜์ ์œผ๋กœ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ Static ๋ฉ”์„œ๋“œ์— ์ ‘๊ทผํ•˜๋ ค๋ฉด super๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์ดํ•ดํ•˜๊ณ  ์ ์ ˆํžˆ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
class Rectangle {
  constructor(width, height) {
    this._width = width;
    this._height = height;
  }

  // Getter
  get area() {
    return this._width * this._height;
  }

  // Setter
  set dimensions({ width, height }) {
    if (width > 0 && height > 0) {
      this._width = width;
      this._height = height;
    } else {
      throw new Error('Width and height must be positive numbers');
    }
  }

  // Static method
  static isEqual(rect1, rect2) {
    return rect1._width === rect2._width && rect1._height === rect2._height;
  }
}

// ์‚ฌ์šฉ ์˜ˆ์‹œ
let rect1 = new Rectangle(10, 5);
let rect2 = new Rectangle(5, 10);

console.log(rect1.area); // 50

rect1.dimensions = { width: 20, height: 10 };
console.log(rect1.area); // 200

console.log(Rectangle.isEqual(rect1, rect2)); // false

์ด ์˜ˆ์ œ์—์„œ๋Š” Getter์™€ Setter๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง์‚ฌ๊ฐํ˜•์˜ ๋ฉด์ ์„ ๊ณ„์‚ฐํ•˜๊ณ , Static ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ ๊ฐœ์˜ ์ง์‚ฌ๊ฐํ˜•์ด ๊ฐ™์€์ง€ ๋น„๊ตํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ฃผ์˜์‚ฌํ•ญ์„ ์ž˜ ์ดํ•ดํ•˜๊ณ  ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜๋ฉด JavaScript์˜ ํด๋ž˜์Šค์—์„œ ๋”์šฑ ํšจ์œจ์ ์ด๊ณ  ์•ˆ์ „ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

728x90
๋ฐ˜์‘ํ˜•