๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์‹œ๋„/๊ตญ๋น„์ง€์›

[D+44] javaScript Class

by ๐Ÿ‡๋ฐ•๋ด‰๋ด‰๐Ÿ‡ 2022. 11. 22.

 

๊ตญ๋น„์ง€์› D+44

- javaScript Class -

 


 

javaScript Class

• ํด๋ž˜์Šค์˜ ๊ฐœ๋…

- ES5์—์„œ๋Š” ํด๋ž˜์Šค๊ฐ€ ์—†์—ˆ์œผ๋ฉฐ ๊ฐ์ฒดํ˜•, ํด๋กœ์ €, ์ƒ์„ฑ์ž, ํ”„๋กœํ† ํƒ€์ž…๋“ฑ์„ ์ด์šฉํ•ด ํด๋ž˜์Šค์™€ ์œ ์‚ฌํ•œ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ–ˆ์—ˆ๋‹ค.
- ES5์™€ ๋‹ค๋ฅด๊ฒŒ ES6์—์„œ๋Š” ์™„๋ฒฝํ•œ ๊ฐ์ฒด์ง€ํ–ฅ์˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ํด๋ž˜์Šค ๋ฌธ๋ฒ•์„ ์ง์ ‘์ ์œผ๋กœ ์ง€์›ํ•œ๋‹ค.
- object ๋ฐ์ดํ„ฐ ํƒ€์ž…์œผ๋กœ ๋‚ด๋ถ€์ ์œผ๋กœ class๋Š” ๊ฒฐ๊ตญ object ํ˜•๊ณผ ๊ฐ™๋‹ค.

• ํด๋ž˜์Šค ์„ ์–ธ

class Student {
	constructor(name, number, score) {
		this.name = name;
		this.number = number;
		this.score = score;
	}

	getTotal() {
		return this.score.kor + this.score.eng + this.score.math;
	}

	getAvg() {
		return (this.getTotal() / 3).toFixed(2);
	}
}

const s1 = new Student("ํ™๊ธธ๋™", 1, { kor: 80, eng: 50, math: 78 });

console.log(s1.getTotal());
console.log(s1.getAvg());

 


- ํด๋ž˜์Šค๋Š” ๋ณ„๋„์˜ ์ƒ์„ฑ์ž(constructor)๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ ํด๋ž˜์Šค์˜ ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ ๋ฐ ์ดˆ๊ธฐํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค.
- ์ƒ์„ฑ์ž์—์„œ ๊ฐ’์„ ์ถ”๊ฐ€ ํ•˜๊ฑฐ๋‚˜ ์ดˆ๊ธฐํ™”๋ฅผ ํ•˜๊ณ  ์‹ถ์„ ๋•Œ, this๋ฅผ ํ†ตํ•ด ๋ณ€์ˆ˜๋ฅผ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค.
- ์ƒ์„ฑ์ž์— ๊ฐ์ฒด๋ฅผ ์ถ”๊ฐ€ํ•  ๊ฒฝ์šฐ ์–•์€ ๋ณต์‚ฌ์— ์ฃผ์˜ํ•˜๋„๋ก ํ•œ๋‹ค. (์ฐธ์กฐ๊ฐ’๋งŒ ๋ณต์‚ฌ)
- ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‹ถ์„๋•Œ new๋ฅผ ์‚ฌ์šฉํ•ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

• ํด๋ž˜์Šค ์ƒ์†

class Rectangle {
	constructor(_width, _height) {
		this.width = _width;
		this.heigth = _height;
	}
}

class Square extends Rectangle {
	constructor(length) {
		super(length, length);
	}
}

- JS์—์„œ๋„ ์ƒ์† ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•œ๋ฐ ์ด๋•Œ ๊ธฐ์กด์— ์ž๋ฐ”์—์„œ๋Š” ์žฌํ™œ์šฉ๊ณผ ๊ณตํ†ต๋œ ๊ทœ์•ฝ์„ ์ง€ํ‚ค๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์œผ๋กœ ์ƒ์†์„ ์‚ฌ์šฉํ•ด ์™”๋‹ค๋ฉด JS์—์„œ์˜ ์ƒ์†์€ ์žฌํ™œ์šฉ์ธก๋ฉด์— ํฌ์ปค์Šค๋ฅผ ๋’€๋‹ค.
- ์ž๋ฐ”์—์„œ์˜ ๊ฐœ๋…๊ณผ ๋น„์Šทํ•œ๋ฐ extends๋ฅผ ํ†ตํ•ด ์ƒ์†์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ƒ์†๋ฐ›์€ ๋ถ€๋ชจ๊ฐ์ฒด์— ๊ฐ’์„ ๋„˜๊ฒจ์ค„๋•Œ super()๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ’์„ ๋„˜๊ฒจ์ฃผ๋Š” ๋ฐฉ์‹๊นŒ์ง€ ์ผ์น˜ํ•œ๋‹ค.
- super๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์—๋Š” ๋ถ€๋ชจ๊ฐ์ฒด๊ฐ€ ๋จผ์ € ์ดˆ๊ธฐํ™”๊ฐ€ ๋˜์–ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ญ์ƒ ์ž์‹ ํด๋ž˜์Šค ์ƒ์„ฑ์ž์—์„œ ๊ฐ€์žฅ ์•ž์— ์ฝ”๋”ฉ๋˜์–ด์•ผ ํ•œ๋‹ค.

• ์ ‘๊ทผ์ œ์–ด

class Rectangle {
	constructor(_width, _height) {
		this.width = _width;
		this.heigth = _height;
	}
}

const r1 = new Rectangle(5, 4);
r1.width = 4;		// ์ž˜๋ชป๋œ ์ ‘๊ทผ์„ ๋ง‰์•„์•ผ ํ•œ๋‹ค

ํ˜„์žฌ๊นŒ์ง€ ๋ฐฐ์šด ํด๋ž˜์Šค๋Š” ํ•œ๊ฐ€์ง€ ๋ฌธ์ œ์ ์ด ์žˆ๋Š”๋ฐ ๋‚ด๊ฐ€ ์ž˜๋ชป๋œ ๊ฒฝ๋กœ๋กœ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜์˜€์„๋•Œ ๊ฐ’์ด ๋ณ€๊ฒฝ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ž˜๋ชป๋œ ๊ฒฝ๋กœ๋กœ ์ ‘๊ทผํ•ด ๊ฐ’์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ํ•จ๋ถ€๋Ÿฌ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋„๋ก ์ ‘๊ทผ์ œ์–ด์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

class Rectangle {
	// private ์ „๋ฐฉ์„ ์–ธ
	#width;
	#height;

	constructor(_width, _height) {
		// ๋ชจ๋“  ์†์„ฑ์— #์„ ๋ถ™์—ฌ์„œ ์‚ฌ์šฉํ•ด ์ค€๋‹ค
		this.#width = _width;
		this.#heigth = _height;
	}
}

const r1 = new Rectangle(5, 4);
r1.width = 4; // ์ ‘๊ทผ ๋ถˆ๊ฐ€

ํด๋ž˜์Šค์˜ ์†์„ฑ์ด๋‚˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ ํ•  ์ˆ˜ ์—†๋„๋ก ํ•˜๋Š” private๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ #์„ ๋ถ™์—ฌ์„œ ์ „๋ฐฉ์„ ์–ธ์„ ํ•œ ๋’ค์— ๋ชจ๋“  ์†์„ฑ์— #์„ ๋ถ™์—ฌ์ฃผ๋ฉด ๋œ๋‹ค.
์ด๋•Œ ์ฃผ์˜ํ•ด์•ผํ•  ์ ์€ #์„ ๋ถ™์—ฌ์„œ ๋ณ€์ˆ˜๊ฐ€ private๊ฐ€ ๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ณ€์ˆ˜๋ช… ๊ทธ ์ž์ฒด๋กœ ์ƒ๊ฐํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

• get, set

class Rectangle {
	constructor(_width, _height) {
		this.width = _width;
		this.heigth = _height;
	}
}

const r1 = new Rectangle(5, 4);
r1.width = 4;		// ์ž˜๋ชป๋œ ์ ‘๊ทผ์„ ๋ง‰์•„์•ผ ํ•œ๋‹ค

 

์ ‘๊ทผ์ œํ•œ์ž๋ฅผ ์‚ฌ์šฉํ•ด ์ฃผ์—ˆ๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ฐ›๊ณ  ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
getter,setter๋ฅผ ์‚ฌ์šฉํ•ด ์ฃผ์–ด๋„ ๋˜์ง€๋งŒ ES6 ๋ฐฉ์‹์œผ๋กœ ๊ฐ’์„ getํ•˜๊ณ  setํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค.

// ์‚ฌ์šฉ๋ฐฉ๋ฒ• - get๊ณผ set์„ ๋„์–ด์“ฐ๋Š” ๊ฒƒ ๋ง๊ณ  ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ์‹์€ ์ผ์น˜ํ•œ๋‹ค.
get width() { return this.#width; }
set width(_width) { this.#width = _width; }

// ์ฃผ์˜์‚ฌํ•ญ
get width() { ... }	// o
get blahblah() { ... }	// x

์ด๋ฐฉ๋ฒ•์€ ์“ฐ๋Š” ์ž…์žฅ์—์„œ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ ๋งˆ์น˜ ๋ณ€์ˆ˜๊ฐ’์„ ๋ฐ”๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ๋Š๋‚Œ์ด๋ผ ํŽธํžˆ๋ผ์ง€๋งŒ get,set์„ ๋งŒ๋“ค์–ด ์ค„๋•Œ ์ด๋ฆ„์„ ์ผ๊ด€์„ฑ์—†์ด ํ•˜๋ฉด ๊ดด๋ž„ํ•จ์ด ๋ฐœ์ƒ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ผญ ์†์„ฑ์˜ ์ด๋ฆ„์œผ๋กœ ์„ค์ •ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ๊ด€๋ก€์ด๋‹ค.

• static

- ์ „์—ญํ™” ์ง€์—ญ๋ณ€์ˆ˜ ๋˜๋Š” ์ „์—ญํ™” ์ง€์—ญ ๋ฉ”์†Œ๋“œ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ํ‚ค์›Œ๋“œ
- static์€ ์ „์—ญ์˜์—ญ์— ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— static์ž…์žฅ์—์„œ class๋Š” ์†Œ์†์ผ๋ฟ ๊ทธ ์™ธ์—๋Š” ์˜๋ฏธ๊ฐ€ ์—†๋‹ค.
- static ๋ณ€์ˆ˜, static ๋ฉ”์†Œ๋“œ๋Š” ํด๋ž˜์Šค๊ฐ€ ์ธ์Šคํ„ด์Šคํ™” ๋˜๋Š”์ง€ ์—ฌ๋ถ€์™€ ์ƒ๊ด€์—†์ด ์ „์—ญ์˜์—ญ์— ํ•˜๋‚˜ ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
- this๋Š” ์˜๋ฏธ๊ฐ€ ์—†๋‹ค.
- ์ ‘๊ทผ ์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

class Persion
{
    static #count = 0;

    constructor()
    {
    }

    static getCount()
    {
        return Persion.#count;
    }

    static setCount(_count)
    {
        Persion.#count = _count;
    }
}

๋งŒ์•ฝ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค๋•Œ๋งˆ๋‹ค ๊ฐœ์ˆ˜๋ฅผ ์˜ฌ๋ฆฌ๋Š” count๋ฅผ class์— ๋„ฃ์–ด์ค€๋‹ค๊ณ ํ•˜๋ฉด count๋ณ€์ˆ˜์•ž์— static์„ ๋ถ™์—ฌ์„œ ์‚ฌ์šฉํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
์ด๋•Œ count๋Š” class Persion์˜ ์†Œ์†์ด์ง€ Persion์˜ ๊ฒƒ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— this๋ฅผ ์‚ฌ์šฉํ•ด ์ค„์ˆ˜ ์—†๋‹ค.
๊ทธ๋ž˜์„œ count๋ฅผ ์‚ฌ์šฉํ•ด์ค„ ๋•Œ Persion.count๋กœ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
์ด๋•Œ count์™€ ๊ด€๋ จ๋œ ๋ฉ”์†Œ๋“œ๋ฅผ ๋งŒ๋“ค์–ด์ค„ ๊ฒฝ์šฐ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฉ”์†Œ๋“œ ์•ž์— static์„ ๋ถ™์—ฌ์ฃผ์–ด์•ผ ํ•œ๋‹ค.


๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€