๋ชฉ์ฐจ
JS์ ๊ฐ์ฒด ํ๋กํผํฐ ์ค ์ ๊ทผ์ ํ๋กํผํฐ์ ๋ํด์ ์์๋ณด์!
1. ์ ๊ทผ์ ํ๋กํผํฐ
์ ๊ทผ์ ํ๋กํผํฐ๋ ์ค์ค๋ก ๊ฐ์ ๊ฐ์ง ์๊ณ
๋ค๋ฅธ ํ๋กํผํฐ์ ๊ฐ์ ์ฝ๊ฑฐ๋(get) ์ ์ฅํ ๋(set) ์ฌ์ฉํ๋ค.
๋ค๋ฅธ ์ธ์ด์์๋ ์ฐพ์๋ณผ ์ ์๊ณ getterํจ์, setterํจ์๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ํ๋ค!
getter
- ๋ฐ๋์ ๊ฐ์ ๋ฐํํด์ผ ํ๋ค.
- ํน์ ํ๋กํผํฐ๋ฅผ ์ํ๋ ๋ฐฉ์์ผ๋ก ๊ฐ๊ณตํ์ฌ ๋ด๋ณด๋ผ ๋ ์ฌ์ฉํ๋ค.
setter
- ํน์ ํ๋กํผํฐ์ ๊ฐ์ด ์ ์ฅ๋๋ ๋ฐฉ์์ ์กฐ์ํ๊ฑฐ๋ ์ ์ฝ์ฌํญ์ ์ ์ฉํ ๋ ์ฌ์ฉํ๋ค.
- ํ๋์ ์ธ์๋ฅผ ๋ฐ๋๋ค.
์ฌ์ฉ๋ฐฉ๋ฒ
๋ฐฉ๋ฒ 1) ๊ฐ์ฒด ๋ฆฌํฐ๋ด ๋ฐฉ์
์์ 1) ๋ฌผ์ฒด์ ๊ธธ์ด ๋จ์ (์ธ์น์ ์ผํฐ๋ฏธํฐ)
const obj1 = {
inch : 1,
get cm() {
return this.inch * 2.54;
},
set cm(temp) {
this.inch = Number((temp * 0.393701).toFixed(2));
}
}
๊ฐ์ด๋ ์ฐธ์กฐ๊ฐ, ํจ์ ๋ฑ์ ๋ด๋ ๋ฐ์ดํฐ ํ๋กํผํฐ ์ฆ, ์ผ๋ฐ์ ์ธ ํ๋กํผํฐ์ ๋ค๋ฅด๊ฒ
get, set์ด ์์ ๋ถ์ด์๋ ๊ฒ์ด ๋ฐ๋ก ์ ๊ทผ์ ํ๋กํผํฐ์ด๋ค.
์ฃผ์ํด์ผํ ์ ์ ํจ์์ ์๊น์๋ฅผ ๋๊ณ ์์ง๋ง
์ผ๋ฐ ํ๋กํผํฐ์ฒ๋ผ ์ฌ์ฉํด์ผํ๋ค๋ ์ ์ด๋ค!
ํ ๋ฒ ํํ๋ฅผ ์ดํด๋ณด๋ฉด
console.log(obj1)
์ด์ฒ๋ผ ๊ฐ์ฒด ์์ get, set์ด๋ผ๋ ํค์๋์ ํจ๊ป ์กด์ฌํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์์ 1-1) getterํจ์
console.log(obj1.inch)
console.log(obj1.cm)
>>> 1
>>> 2.54
์์ 1-2) setter ํจ์
// setter ํจ์ ์ญ์ ํ๋กํผํฐ์ฒ๋ผ ์ฌ์ฉ
obj.cm = 20
console.log(obj1.inch)
>>> 7.87
getter์ setterํจ์๋ ์ ๊ทผ์ "ํ๋กํผํฐ"์ด๋ค.
๋ฐ๋ผ์ ์์ ์์์ฒ๋ผ ์ผ๋ฐ์ ์ธ ํ๋กํผํฐ์ ๋์ผํ ํํ๋ก ์ฌ์ฉํ๋ฉด๋๋ค.
๋ฐฉ๋ฒ 2) ํด๋์ค์์ ์ฌ์ฉ
ํด๋์ค์์๋ ์ ๊ทผ์ ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์ญ์ ๋์ผํ๊ฒ get, set์ ์์ ๋ถ์ฌ์ ์ ์ํ๋ค.
class Player {
constructor (name, job, power = 1){
this.name = name;
this.job = job;
this.power = power;
}
get info() {
return `์ด๋ฆ : ${this.name} | ์ง์
๊ตฐ : ${this.job}`;
}
set powerStat(powerStat) {
if (typeof powerStat !== 'number') return;
if (powerStat < 0) return;
this.power = powerStat;
}
}
const p1 = new Player('Kassid', '์ ์ฌ');
get ํจ์๋ ๊ฐ์ฒด๋ฆฌํฐ๋ด ๋ฐฉ์๊ณผ ๋์ผํ๊ฒ ์ฌ์ฉํ๋ค!
console.log(p1.info);
>>> ์ด๋ฆ : Kassid | ์ง์
๊ตฐ : ์ ์ฌ
set ํจ์๋ ํ ๋น๋ฐ์ ๊ฐ์ ์ฒ๋ฆฌ ์ธ์๋ ์ ์ฝ์ฌํญ์ ์ค ๋ ์ฌ์ฉํ ์ ์๋ค.
์์ 1) ์ ์์ ์ผ๋ก ํ ๋นํ ๊ฒฝ์ฐ
p1.powerStat = 10
console.log(p1);
>>> Player {name: 'Kassid', job: '์ ์ฌ', power: 10}
์์ 2) ๋น์ ์์ ์ผ๋ก ํ ๋นํ ๊ฒฝ์ฐ (์ ์ฝ์ฌํญ ์๋ฐ)
p1.powerStat = -1
console.log(p1);
>>> Player {name: 'Kassid', job: '์ ์ฌ', power: 10}
ํด๋์ค ๋ด์ setterํจ์์์ ์ ์ฝ์ฌํญ์ ๋ฃ๊ณ
๊ทธ๊ฒ์ ์๋ฐํ ๊ฒฝ์ฐ return ํ๋๋กํ์๊ธฐ ๋๋ฌธ์
์์ ์์์์ ์ ๋ ฅํ ๊ฐ์ด ํ ๋น๋์ง ์์์ ์ ์ ์๋ค.
๋ํ getter ์ setter๋ ํด๋์ค์ ์กด์ฌํ ๊ฒฝ์ฐ
[[Prototype]]์ด ๋๋ค.
์ ์ฌ๊ธฐ์ ์ ๊น!
setterํจ์๋ ๊ฐ์ ํ ๋นํ ๋ ์ฌ์ฉํ๋๋ฐ ์ค์ ํ๋๋ช
๊ณผ ๋์ผํ๊ฒ ์ฌ์ฉํ๋ฉด ์๋ ๊น?
๋ผ๋ ์๊ฐ์ ํ๊ฒ ๋๋ค.
๊ณผ์ฐ ๊ฐ๋ฅํ ๊น?
ํ๋๋ช ๊ณผ setter์ ์ด๋ฆ์ด ๊ฐ์ ๊ฒฝ์ฐ
์์) ํ๋๋ช ๊ณผ setter๋ช ์ด ๊ฐ์ ํด๋์ค
class Player {
constructor (name, job, power = 1){
this.name = name;
this.job = job;
this.power = power;
}
get info() {
return `์ด๋ฆ : ${this.name} | ์ง์
๊ตฐ : ${this.job} | ํ : ${this.power}`;
}
set power(power) {
this.power = power;
}
}
const p1 = new Player('Kassid', '์ ์ฌ');
์์ ๊ฐ์ด ๋ ์ด๋ฆ์ด ๊ฐ์ ํด๋์ค๋ฅผ ์ ์ํ์๋ค.
ํ์ง๋ง ์ด๋ ์ํ๊น๊ฒ๋ ๋ ์ด๋ฆ์ ์๋ณํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
์ค๋ฅ ๋ฐ์ ์์ธ
โ constructor์ "this.power"๊ฐ setter ํจ์๋ฅผ ํธ์ถํ๋ค.
โก setterํจ์ ๋ด์ this.power๊ฐ setter ํจ์๋ฅผ ์ฌ๊ทํธ์ถํ๋ค.
โข ๋ฌดํ ๋ฐ๋ณต ์๋ฌ๋ฐ์!
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ์ด๋ป๊ฒ ํด์ผํ ๊น?
ํด๊ฒฐ์ฑ
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ํ๋๋ช ๊ณผ setter ํจ์๋ช ์ ๋ค๋ฅด๊ฒ ํด์ผํ๋ค.
ํ์ง๋ง ์ฌ์ฉ์ ์ ์ฅ์์๋ ๋์ผํ๊ฒ ์ฌ์ฉํ ์ ์๋ ํจ์๋ฅผ ๋ง๋ ๋ค๋ฉด
" _ํ๋๋ช " ๊ณผ ๊ฐ์ ํํ๋ฅผ ์ด์ฉํด ๊ตฌํํ ์์๋ค.
class Player {
constructor (name, job, power = 1){
this.name = name;
this.job = job;
this.power = power; //setterํจ์์ argument ํ ๋น
}
get info() {
return `์ด๋ฆ : ${this.name} | ์ง์
๊ตฐ : ${this.job} | ํ : ${this._power}`;
}
set power(power) {
this._power = power; // ์ค์ ํ๋๋ช
_power์ ๊ฐ ์ ์ฅ
}
}
const p1 = new Player('Kassid', '์ ์ฌ');
getterํจ์์ setterํจ์์ "_"๋ฅผ ๋ถ์ธ _power๋ฅผ ์ ์ธํ๊ณ ์ค๋ฅ ์์์ ๋ชจ๋ ๋์ผํ๋ค.
์๋ฆฌ
constructor์์ setterํจ์์ ๋ฐ์์จ argument๋ฅผ ํ ๋นํ๊ณ ,
setterํจ์ ๋ด์์ ์ ์๋ ์ค์ ํ๋๋ช "_power"์ ๊ฐ์ ์ ์ฅํ๋ ์๋ฆฌ์ด๋ค. (๋น์ฐํ ์์๋ก ์์ฑ๋ ํ๋๋ช ์)
์ด๋ฌํ ๋ฐฉ์์ผ๋ก ์๊ธฐ๋ฐ๋ณตํธ์ถ์ ๋ฐฉ์งํ๊ณ
์ฌ์ฉ์์ ์ ์ฅ์์ setterํจ์์ ํ๋๋ช ์ ๋์ผํ๊ฒ ์ด์ฉํ๋ ๊ฒ์ฒ๋ผ ํ์ฉํ ์ ์๋ค.
2. ์๋
๊ฐ์ฒด์งํฅ์ ์ฃผ์ ์์ ์ค ํ๋๋ '์๋'์ด๋ค.
๊ฐ์ฒด ๋ด๋ถ์ ๊ฐ์ ๊ฐ์ถ๋ค๋ ์๋ฏธ์ด๊ณ
์ธ์คํด์ค์ ํ๋กํผํฐ ๊ฐ์ ํจ๋ถ๋ก ์ด๋ํ๊ฑฐ๋ ์กฐ์ํ์ง ๋ชปํ๋๋ก ํ๊ธฐ ์ํ ์๋์ด๋ค.
ํ์ง๋ง JS์ ํ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก public์ด๊ธฐ ๋๋ฌธ์ ์ด๋์์๋ ์ ๊ทผํ ์ ์๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ ๋ค๋ฅธ ์ธ์ด์๋ ์๋ ๊ฐ๋ ์ธ private๋ฅผ ํ์ฉํ๋ฉด ํ๋๋ฅผ ์๋ํ ์ ์๋ค.
privateํ๋
(ํ์ฌ private๋ ์์ง ๊ณต์์ ์ผ๋ก ํ์ฉ๋์ง ์๊ธฐ๋๋ฌธ์ ์ผ๋ถ ๋ธ๋ผ์ฐ์ ์์๋ ์ผ๋ถ ๊ธฐ๋ฅ์ด ์ ๋๋ก ์ํ๋์ง ์๋๋คใ )
ํ๋ ๋ช ์ ์์ '#' ์ ๋ถ์ผ ๊ฒฝ์ฐ privateํ๋์ ์ ์๋๋ค.
๋ํ constructor ๋ด๋ถ๊ฐ ์๋ ํด๋์ค ๋ฐ๋ก ์์ชฝ์ ์ ์ํด์ผํ๋ค.
class Student {
#name = '';
#idNum = 0;
constructor (name, idNum){
this.#name = name;
this.#idNum = idNum;
}
}
const student1 = new Student('Kassid', 25);
console.log(student1.#name);
>>> SyntaxError: Cannot reference undeclared private names: "#name"
(ํฌ๋กฌ์์๋ ์์ฑ์ผ ๊ธฐ์ค ์ ๊ทผ ๊ฐ๋ฅ, 2023.4.10)
console.log(student1['#name']);
>>> undefined
์ด์ฒ๋ผ ํด๋์ค ์ธ๋ถ์์ private ํ๋์ ์ ๊ทผํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ๋ค.
๋ฐ๋ผ์ ํด๋น ํ๋์ ๋ํ ์กฐ์์ ํด๋์ค ๋ด๋ถ์์ ์ด๋ฃจ์ด์ ธ์ผํ๋ค.
ํด๋์ค ๋ด๋ถ์์์ privateํ๋ ์ ๊ทผ
class Student {
#name = '';
#idNum = 0;
constructor (name, idNum){
this.#name = name;
this.#idNum = idNum;
}
get info (){
return `์ด๋ฆ : ${this.#name} ๋ฒํธ : ${this.#idNum}`
}
get idNum (){
return this.#idNum;
}
set idNum (idNum){
if (typeof idNum === 'number' && idNum > 0){
this.#idNum = idNum;
}
}
}
const student1 = new Student('Kassid', 25);
student1.idNum = 10;
console.log(student1);
>>> Student {#name: 'Kassid', #idNum: 10}
constructor๋ ์ ๊ทผ์ ํ๋กํผํฐ, ์ผ๋ฐ ํจ์ ๋ฑ
ํด๋์ค ๋ด๋ถ์์๋ private ํ๋์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
์ด๋ฌํ ๋ฐฉ์์ผ๋ก ์ธ์คํด์ค์ ๊ฐ์ ๋ฐ๋ก ์ ๊ทผํ๋ ๊ฒ์ ๋ง๊ธฐ ์ํด์ ์ด์ฒ๋ผ ์บก์ํ๋ฅผ ํ๋ฉด๋๋ค!
'๐ | WEB DEV > Vanilla JS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
JS_๊ธฐ๋ณธ ๋ฌธ๋ฒ (28)_ Arrow function (0) | 2023.08.02 |
---|---|
JS_๊ธฐ๋ณธ ๋ฌธ๋ฒ (27)_ this ํค์๋ (0) | 2023.08.01 |
JS_๊ธฐ๋ณธ ๋ฌธ๋ฒ (25)_ ํด๋์ค (1) | 2023.04.02 |
JS_๊ธฐ์ (3)_ Hoisting(ํธ์ด์คํ ) ๋ฟ์๊ธฐ (0) | 2023.03.31 |
JS_๊ธฐ๋ณธ ๋ฌธ๋ฒ (24)_ ์์ฑ์ ํจ์ (0) | 2023.03.31 |
๋๊ธ