λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ“ Front-End/JavaScript

[JS] ν΄λž˜μŠ€μ™€ 프라이빗 ν•„λ“œ κ΅¬ν˜„ 이유

by Sun A 2024. 11. 6.

JavaScript ν΄λž˜μŠ€λž€

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ 클래슀(class)λŠ” 객체λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•œ ν…œν”Œλ¦Ώμ΄λ‹€. ν΄λž˜μŠ€λŠ” 객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°(OOP)의 κ°œλ…μ„ λ°”νƒ•μœΌλ‘œ, μ½› μž¬μ‚¬μš©μ„±κ³Ό ꡬ쑰적인 μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” 데 도움을 μ€€λ‹€. 

클래슀 μ„ μ–Έ 방법

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

  print() {
    console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
  }
}

Person : 클래슀λͺ…

constructor : 객체가 생성될 λ•Œ ν˜ΈμΆœλ˜λŠ” 것 / ν•„λ“œλ₯Ό μ„ μ–Έν•œλ‹€.

  • name, age : Person 클래슀의 ν•„λ“œ

print : Person 클래슀의 λ©”μ„œλ“œ / 좜λ ₯ κΈ°λŠ₯을 λ‹΄λ‹Ήν•œλ‹€. 

 

객체 생성 방법

const person1 = new Person('Alice', 30);
person1.print(); // "Hello, my name is Alice and I am 30 years old."

Person 클래슀λ₯Ό 기반으둜 person1μ΄λΌλŠ” 객체λ₯Ό μƒμ„±ν•˜κ³ , 클래슀 μ•ˆμ˜ λ©”μ„œλ“œμΈ print()λ₯Ό ν˜ΈμΆœν•˜μ—¬ 값을 좜λ ₯ν•œλ‹€. (print() λ©”μ„œλ“œκ°€ 좜λ ₯ λ©”μ„œλ“œμ΄κΈ° λ•Œλ¬Έμ— 좜λ ₯값이 λ‚˜μ˜€λŠ” 것이닀.)

 

프라이빗 ν•„λ“œλž€?

κ·Έλ ‡λ‹€λ©΄, ν΄λž˜μŠ€μ—μ„œ ν•„λ“œλ₯Ό μ„ μ–Έν•  λ•Œ #을 μ΄μš©ν•˜μ—¬ 프라이빗 ν•„λ“œλ‘œ μ„ μ–Έν•˜μ—¬ 클래슀 λ‚΄λΆ€μ—μ„œλ§Œ 속성을 μ ‘κ·Όν•  수 μžˆλ„λ‘ λ§Œλ“ λ‹€. μ΄μœ κ°€ 뭘까? 프라이빗 ν•„λ“œλ‘œ μ„ μ–Έν•˜μ§€ μ•Šμ•„λ„ μ½”λ“œλŠ” λ™μž‘ν•˜λŠ” 데 μ™œ 프라이빗 ν•„λ“œλ‘œ μ„ μ–Έν•΄μ•Ό ν• κΉŒ?

κ°„λ‹¨ν•˜κ²Œ ν•œ λ¬Έμž₯으둜 μš”μ•½ν•˜λ©΄ 객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ 핡심 κ°œλ… 쀑 ν•˜λ‚˜μΈ μΊ‘μŠν™”(encapsulation) 방식을 μ μš©ν•˜μ—¬ μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€. κ·Έλ ‡λ‹€λ©΄, μ™œ μΊ‘μŠν™” 방식을 μ μš©ν•΄μ•Ό 객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°μ„ μ•ˆμ „ν•˜κ²Œ ν•  수 μžˆμ„κΉŒ?

 

μΊ‘μŠν™”(encapsulation)

μΊ‘μŠν™”λž€ λ°μ΄ν„°(속성)와 λ©”μ„œλ“œ(λ™μž‘)λ₯Ό ν•˜λ‚˜μ˜ λ‹¨μœ„λ‘œ λ¬Άκ³ , μ™ΈλΆ€λ‘œλΆ€ν„° 정보λ₯Ό μ€λ‹‰ν•˜λŠ” 방식을 μ˜λ―Έν•œλ‹€. 

κ·Έλ ‡λ‹€λ©΄ 데이터와 λ©”μ„œλ“œλ₯Ό ν•˜λ‚˜μ˜ λ‹¨μœ„λ‘œ λ¬Άκ³  μ™œ μ™ΈλΆ€λ‘œλΆ€ν„° 정보λ₯Ό 은닉해야 ν•˜λŠ” μ§€ μ•Œμ•„λ³΄μž.

 

μΊ‘μŠν™”κ°€ ν•„μš”ν•œ 이유

 μš°μ„  μΊ‘μŠν™”λ₯Ό 톡해 객체의 λ‚΄λΆ€ 데이터λ₯Ό λ³΄ν˜Έν•˜μ§€ μ•Šκ³  μ™ΈλΆ€μ—μ„œ μˆ˜μ •μ΄ κ°€λŠ₯ν•˜λ„λ‘ ν•˜λ©΄, 데이터가 μ˜λ„μΉ˜ μ•Šκ²Œ λ³€κ²½λ˜λŠ” 상황이 λ°œμƒν•  수 μžˆλ‹€. 

예λ₯Ό λ“€μ–΄ μƒκ°ν•΄λ³΄μž. 

은행 κ³„μ’Œμ˜ μž”μ•‘, 둜그인 μ„Έμ…˜μ˜ 정보, 물건의 재고 μˆ˜λŸ‰ 같은 μ€‘μš”ν•œ λ°μ΄ν„°λŠ” μ™ΈλΆ€μ—μ„œ μž„μ˜λ‘œ λ³€κ²½ν•΄μ„œλŠ” μ•ˆλœλ‹€. 각각이 κ³ μœ ν•œ 데이터이고 프라이빗 객체λ₯Ό ν™œμš©ν•œ λ™μž‘μ΄ μ•„λ‹ˆλΌλ©΄, 예기치 λͺ»ν•œ 였λ₯˜κ°€ λ°œμƒν•˜κΈ° 쉽닀.

1. 데이터 보호 및 무결성 μœ μ§€

μ™ΈλΆ€μ—μ„œ 직접 μ ‘κ·Όν•˜μ§€ λͺ»ν•˜λ„둝 λ°μ΄ν„°μ˜ 무결성을 μœ μ§€ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— μΊ‘μŠν™”κ°€ ν•„μš”ν•˜λ‹€. 무결성 μœ μ§€λ₯Ό 톡해 예기치 μ•Šμ€ 였λ₯˜μ™€ 버그λ₯Ό μ˜ˆλ°©ν•  수 μžˆλ‹€.

2. μ½”λ“œμ˜ 일관성과 μ•ˆμ •μ„± μœ μ§€

이상적인 κ°μ²΄λŠ” μžμ‹ μ˜ μƒνƒœμ™€ 행동을 슀슀둜 관리해야 ν•œλ‹€. 

예λ₯Ό λ“€μ–΄ μžλ™μ°¨ 객체λ₯Ό μ„€κ³„ν•œλ‹€λ©΄ μ—”μ§„μ˜ μƒνƒœλŠ” μžλ™μ°¨μ˜ λ‚΄λΆ€μ—μ„œ κ΄€λ¦¬λ˜μ–΄μ•Ό ν•˜λ©° μ™ΈλΆ€μ—μ„œ λ§ˆμŒλŒ€λ‘œ 엔진을 ν‚€κ³  끌 수 μžˆλ„λ‘ ν•΄μ„œλŠ” μ•ˆλœλ‹€. 

κ·Έλ ‡κΈ° λ•Œλ¬Έμ— μΊ‘μŠν™”λ₯Ό μ‚¬μš©ν•˜μ—¬ 클래슀 λ‚΄λΆ€μ˜ 데이터λ₯Ό κ²€μ¦ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•˜μ—¬ λ°μ΄ν„°μ˜ 일관성을 μœ μ§€ν•  수 μžˆλ‹€. λ˜ν•œ μ™ΈλΆ€μ—μ„œλŠ” ν΄λž˜μŠ€κ°€ μ œκ³΅ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν†΅ν•΄μ„œλ§Œ 객체의 μƒνƒœλ₯Ό λ³€κ²½ν•  수 μžˆμœΌλ―€λ‘œ 객체의 μƒνƒœκ°€ μ˜ˆμƒμΉ˜ λͺ»ν•˜κ²Œ λ³€κ²½λ˜λŠ” 일을 쀄일 수 μžˆλ‹€.

3. μœ μ§€λ³΄μˆ˜μ™€ ν™•μž₯μ„± ν–₯상

μΊ‘μŠν™”λŠ” μ½”λ“œμ˜ μœ μ§€λ³΄μˆ˜μ„±μ„ 높이고, ν™•μž₯성을 μ‰½κ²Œ λ§Œλ“ λ‹€. ν΄λž˜μŠ€κ°€ 데이터λ₯Ό μ€λ‹‰ν•˜κ³  λ©”μ„œλ“œλ§Œ κ³΅κ°œν•˜λŠ” 경우, 클래슀 λ‚΄λΆ€μ˜ κ΅¬μ‘°λ‚˜ 데이터λ₯Ό 변경해도 μ™ΈλΆ€ μ½”λ“œμ— 영ν–₯을 μ£Όμ§€ μ•ŠλŠ”λ‹€. 

μ™ΈλΆ€μ˜ 영ν–₯을 적게 λ°›κΈ° λ•Œλ¬Έμ— μœ μ§€λ³΄μˆ˜κ°€ μš©μ΄ν•΄μ§„λ‹€. λ˜ν•œ λ‚΄λΆ€ κ΅¬ν˜„μ„ λ³€κ²½ν•˜λ”λΌλ„ μ™ΈλΆ€ μΈν„°νŽ˜μ΄μŠ€λŠ” λ™μΌν•˜κ²Œ μœ μ§€λ˜κΈ° λ•Œλ¬Έμ— μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ν•˜κ±°λ‚˜ κΈ°μ‘΄ κΈ°λŠ₯을 ν™•μž₯ν•˜λŠ” 것도 μˆ˜μ›”ν•΄μ§„λ‹€.

4. 정보 은닉과 λͺ¨λ“ˆν™”

객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ 정보 은닉은 맀우 μ€‘μš”ν•˜λ‹€. 정보 은닉을 톡해 객체 λ‚΄λΆ€μ˜ μ„ΈλΆ€ 사항을 감좔고, 객체가 μ œκ³΅ν•˜λŠ” 퍼블릭 μΈν„°νŽ˜μ΄μŠ€λ§Œ 외뢀에 κ³΅κ°œν•˜κΈ° λ•Œλ¬Έμ— λͺ¨λ“ˆν™”λ₯Ό μ‹€ν˜„ν•  수 있기 λ•Œλ¬Έμ΄λ‹€.

λͺ¨λ“ˆν™”λŠ” ν”„λ‘œκ·Έλž¨μ„ 독립적인 ꡬ성 μš”μ†Œλ‘œ λ‚˜λˆŒ 수 있게 ν•˜μ—¬ 각 μš”μ†Œλ₯Ό λ…λ¦½μ μœΌλ‘œ 개발, ν…ŒμŠ€νŠΈ, μˆ˜μ •ν•  수 있게 ν•œλ‹€.

λ˜ν•œ ν•œ λͺ¨λ“ˆμ˜ 변경이 λ‹€λ₯Έ λͺ¨λ“ˆμ— λ―ΈμΉ˜λŠ” 영ν–₯을 μ΅œμ†Œν™”ν•  수 있기 λ•Œλ¬Έμ— 정보 은닉은 μ€‘μš”ν•œ κ°œλ…μ΄λ‹€.

 

κ·Έλ ‡λ‹€λ©΄, μΊ‘μŠν™”μ˜ ν•„μš”μ„±μ— λŒ€ν•΄ νŒŒμ•…ν•˜μ˜€μœΌλ‹ˆ 데이터λ₯Ό μΊ‘μŠν™”ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ 프라이빗 ν•„λ“œλ₯Ό μ–΄λ–»κ²Œ μ‚¬μš©ν•˜λŠ”μ§€ μ•Œμ•„λ³΄μž.

프라이빗 ν•„λ“œ ν™œμš© 예제

class Person {
        #name;
        #age;

        constructor(name, age) {
            this.#name = name;
            this.#age = age;
        }

        getName() {
            return this.#name;
        }

        getAge() {
            return this.#age;
        }
    }

    const person = new Person('John', 30);
    console.log(person.getName()); // 'John'
    console.log(person.getAge()); // 30
    console.log(person.#name); // SyntaxError: Private field '#name' must be declared in an enclosing class

μœ„μ™€ 같은 λ°©μ‹μœΌλ‘œ 프라이빗 ν•„λ“œλŠ” #을 μ΄μš©ν•΄μ„œ μ„ μ–Έν•˜λ©° μœ„μ™€ 같이 μ„ μ–Έν•œ μ΄ν›„μ—λŠ” μ™ΈλΆ€μ—μ„œ 직접 μ ‘κ·Όν•  수 μ—†λŠ” ν•„λ“œκ°€ λœλ‹€. μ™ΈλΆ€μ—μ„œ μ ‘κ·Όν•˜κΈ° μœ„ν•΄μ„œλŠ” getName()κ³Ό getAge()λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€. 

λ§Œμ•½ 맨 μ•„λž˜μ˜ console.log처럼 직접 ν•„λ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄ SyntaxError κ°€ λ°œμƒν•˜κ²Œ ν•  수 μžˆλ‹€. 

 

프라이빗 ν•„λ“œμ˜ μž₯점과 μ£Όμ˜μ‚¬ν•­

프라이빗 ν•„λ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ 클래슀의 μΊ‘μŠν™”λ₯Ό κ°•ν™”ν•˜κ³  객체의 μ•ˆμ •μ„±μ„ 높일 수 μžˆλ‹€λŠ” 큰 μž₯점이 μ‘΄μž¬ν•œλ‹€. μ™ΈλΆ€μ—μ„œμ˜ λ¬΄λΆ„λ³„ν•œ 접근을 λ§‰μ•„μ„œ 예기치λͺ»ν•œ μ—λŸ¬λ₯Ό λ°©μ§€ν•  수 μžˆλ‹€. 

λ˜ν•œ 클래슀의 μΈν„°νŽ˜μ΄μŠ€μ™€ κ΅¬ν˜„μ„ λͺ…ν™•νžˆ 뢄리할 수 있으며 클래슀λ₯Ό μ‚¬μš©ν•˜λŠ” κ°œλ°œμžμ—κ²Œ ν•„μš”ν•œ μ •λ³΄λ§Œ λ…ΈμΆœν•  수 μžˆμ–΄μ„œ μ½”λ“œμ˜ 일관성도 μœ μ§€ν•˜κ³  μœ μ§€λ³΄μˆ˜λ„ μš©μ΄ν•˜λ„λ‘ ν•΄μ€€λ‹€. 

ν•˜μ§€λ§Œ μ΄λŸ¬ν•œ μž₯점을 κ°€μ§„ 프라이빗 ν•„λ“œλ„ μ£Όμ˜μ‚¬ν•­μ΄ μ‘΄μž¬ν•œλ‹€. 

프라이빗 ν•„λ“œλŠ” 클래슀의 상속 κ΅¬μ‘°μ—μ„œ μžμ‹ ν΄λž˜μŠ€κ°€ λΆ€λͺ¨ 클래슀의 프라이빗 ν•„λ“œμ— μ ‘κ·Όν•  수 μ—†λ‹€λŠ” 점을 κ³ λ €ν•΄μ•Ό ν•œλ‹€.

λ§Œμ•½ extendsλ₯Ό μ‚¬μš©ν•˜μ—¬ 클래슀의 상속 ꡬ쑰λ₯Ό 섀계할 λ•ŒλŠ” μœ„μ˜ 사항을 μΆ©λΆ„νžˆ κ³ λ €ν•˜μ—¬ 섀계해야 ν•œλ‹€. 

 

κ²°λ‘ 

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ ν΄λž˜μŠ€μ™€ 프라이빗 ν•„λ“œλ₯Ό ν™œμš©ν•˜λ©΄ 객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ μ€‘μš”ν•œ 원칙인 μΊ‘μŠν™”λ₯Ό κ°•ν™”ν•  수 μžˆλ‹€.

μ‹€μ œλ‘œ 프라이빗 ν•„λ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 클래슀λ₯Ό μ„€κ³„ν•˜λ €λ‹ˆ λ„ˆλ¬΄ λ³΅μž‘ν•˜μ—¬ μ‹œκ°„ 내에 과제λ₯Ό μ œμΆœν•˜κΈ° μœ„ν•΄ μ‚¬μš©μ„ μƒλž΅ν–ˆμ—ˆλ‹€. ν•˜μ§€λ§Œ ν•„μš”ν•˜λ‹€λŠ” 점을 μΈμ§€ν–ˆκ³  이λ₯Ό κ³ λ €ν•˜μ—¬ 클래슀λ₯Ό μ„€κ³„ν•˜λ©΄ μžμ—°μŠ€λŸ½κ²Œ 객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ 원칙을 μ€€μˆ˜ν•œ ν”„λ‘œκ·Έλž˜λ°μ„ ν•  수 μžˆμ„ 것이라고 μƒκ°λœλ‹€. 

 

μ°Έκ³ κΈ€ : https://f-lab.kr/insight/utilizing-javascript-class-and-private-fields

 

μžλ°”μŠ€ν¬λ¦½νŠΈ ν΄λž˜μŠ€μ™€ 프라이빗 ν•„λ“œ ν™œμš©ν•˜κΈ°

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ ν΄λž˜μŠ€μ™€ 프라이빗 ν•„λ“œλ₯Ό ν™œμš©ν•˜λŠ” 방법과 μž₯점을 μ„€λͺ…ν•©λ‹ˆλ‹€. 프라이빗 ν•„λ“œλ₯Ό 톡해 클래슀의 μΊ‘μŠν™”λ₯Ό κ°•ν™”ν•˜κ³ , 객체의 μ•ˆμ •μ„±μ„ 높일 수 μžˆλŠ” μ „λž΅μ„ μ œμ‹œν•©λ‹ˆλ‹€.

f-lab.kr