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