TIL ( ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ )

2024. 6. 10. 23:28ใ†TIL

๐Ÿ’ก๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ž€?

 

1. ๊ฐ์ฒด์ง€ํ–ฅ

*๊ฐ์ฒด๋ž€ ํ˜„์‹ค ์„ธ๊ณ„์˜ ๋ฌผ์ฒด๋‚˜ ๊ฐœ๋…์„ ์†Œํ”„ํŠธ์›จ์–ด ์„ธ๊ณ„๋กœ ์˜ฎ๊ธด ๊ฒƒ์œผ๋กœ ๊ฐ์ฒด๋ฅผ '์ž๋™์ฐจ'๋‚˜ '์‚ฌ๋žŒ'์œผ๋กœ ์ƒ๊ฐํ•˜๋ฉด ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šฐ๋ฉฐ, ๊ฐ์ฒด๋Š” ์ •๋ณด์™€ ๊ทธ ์ •๋ณด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ–‰๋™(ํ•จ์ˆ˜)์„ ๊ฐ€์ง„๋‹ค.

 - ๊ฐ์ฒด์ง€ํ–ฅ์€ ๊ฐœ๋ฐœ์—์„œ ์ฃผ์š” ๊ตฌ์„ฑ์š”์†Œ๋ฅผ๊ธฐ๋Šฅ์ด ์•„๋‹Œ๊ฐ์ฒด๋กœ ์‚ผ์•„ "์–ด๋–ค ๊ฐ์ฒด๊ฐ€ ์–ด๋–ค ์ผ์„ ํ•  ๊ฒƒ์ธ๊ฐ€"์— ์ดˆ์ ์„ ๋งž์ถ˜๋‹ค.

- ์ฑ…์ž„๊ณผ ๊ถŒํ•œ์„ ๊ฐ€์ง„ ๊ฐ์ฒด๋“ค์ด ์„œ๋กœ ๋ฉ”์„ธ์ง€๋ฅผ ์ฃผ๊ณ  ๋ฐ›์•„ ํ˜‘์—ญํ•˜์—ฌ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์ด๋‹ค.

- ์ด๋Ÿฌํ•œ ๊ฐ์ฒด์ง€ํ–ฅ ๋ฐฉ๋ฒ•๋ก ์€ ๋ณต์žกํ•œ ์‹œ์Šคํ…œ์„ ํšจ๊ณผ์ ์œผ๋กœ ๋ถ„ํ•ดํ•˜๊ณ  ๊ตฌ์„ฑํ•˜๋ฉฐ, ๊ฐœ๋ฐœ์ž๊ฐ€ ์†์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ณ  ํšจ์œจ

์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ค€๋‹ค.

 

 

2. ๊ฐ์ฒด์ง€ํ–ฅ ์†Œํ”„ํŠธ์›จ์–ด์™€ ์ ˆ์ฐจ์ง€ํ–ฅ ์†Œํ”„ํŠธ์›จ์–ด ๊ตฌ๋ถ„

- ๊ฐ์ฒด์ง€ํ–ฅ ์†Œํ”„ํŠธ์›จ์–ด๋Š” ์บก์Аํ™”, ๋‹คํ˜•์„ฑ, ์ƒ์†์„ ์ง€์›ํ•˜๋ฉฐ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ์ œํ•œ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

- ์ด๋Ÿฌํ•œ ํŠน์ง•์„ ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š” ๋‹ค๋ฉด ์ ˆ์ฐจ์ง€ํ–ฅ ์†Œํ”„ํŠธ์›จ์–ด๋ผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.(ex. ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋Š” ์ˆœ์„œ๋กœ ์ž‘์„ฑํ•œ๊ฒƒ)

 

3.ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„

- ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๋ฐฉ์‹์ด๋‚˜ ๊ด€์ ์„ ๋ฐ”ํƒ•์œผ๋กœ ํšจ์œจ์ ์œผ๋กœ ๋ช…ํ™•ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

 

* ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„

- ๊ตฌ์กฐ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ (Structured Programming) : ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ผ๋Š” ๊ธฐ์ˆ ์ด ์‹œ์ž‘๋˜๋ฉด์„œ ๊ฐ€์žฅ ์ฒ˜์Œ ์ ์šฉ๋œ ํŒจ๋Ÿฌ๋‹ค์ž„์œผ๋กœ ๊ธฐ๋Šฅ์„ ์ค‘์‹ฌ์œผ๋กœ ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•œ๋‹ค.

- ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (Object-Oriented Programming, OOP) : "ํ˜„์‹ค ์„ธ๊ณ„๋ฅผ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๋ชจ๋ธ๋ง"ํ•˜๋Š” ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์˜ ์ฒ˜๋ฆฌ๋‹จ์œ„๊ฐ€ ๊ฐ์ฒด์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ๋ฒ•์ด๋‹ค.

- ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ (Functional Programming) : ๊ฐ€์žฅ ์ดˆ๊ธฐ์— ๋งŒ๋“ค์–ด์ง„ ํŒจ๋Ÿฌ๋‹ค์ž„์ด์ง€๋งŒ, ์ตœ๊ทผ ์ฃผ๋ชฉ๋ฐ›๊ธฐ ์‹œ์ž‘ํ•œ ํŒจ๋Ÿฌ๋‹ค์ž„์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์ค‘์‹ฌ์ ์œผ๋กœ ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•œ๋‹ค.

 

4. ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

์ถœ์ฒ˜: https://www.orientsoftware.com

• ์˜์˜์™€ ํŠน์ง•

- ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๋ฐ์ดํ„ฐ์™€ ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ๊ฐ™์€ ๋ชจ๋“ˆ ๋‚ด๋ถ€์— ๋ฐฐ์น˜๋˜๋Š” ๋ฐฉ์‹์„ ๋งํ•œ๋‹ค.

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

- ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„  ์ž๋™์ฐจ, ๋™๋ฌผ, ์‚ฌ๋žŒ ๋“ฑ๊ณผ ๊ฐ™์€ ํ˜„์‹ค ์„ธ๊ณ„๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

- ๊ฐ์ฒด๋Š” ๊ณ ์œ ํ•œ ํŠน์„ฑ์„ ๊ฐ€์ง€๋ฉฐ, ํŠน์ • ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

- ex) ์ž๋™์ฐจ๋ผ๋Š” ๊ฐ์ฒด๋Š” ์ถœ๋ฐœ, ์ •์ง€, ์šดํ–‰ ๋ฐ ์ œ๋™๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 • ์ฝ”๋“œ ์ž‘์„ฑ์˜ ๋ชฉํ‘œ

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

 

• ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

- ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๋ฐฉ์‹์€ ๋ฐ์ดํ„ฐ์™€ ๊ธฐ๋Šฅ์ด ๋ฐ€์ ‘ํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ์˜ ๊ตฌ์กฐ์™€ ๋™์ž‘์„ ์ง๊ด€์ ์œผ๋กœ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค.

- ํ•˜๋‚˜์˜ ๊ฐ์ฒด์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด ๊ทธ ๊ฐ์ฒด์˜ ๋‚ด๋ถ€๋งŒ ์‚ดํŽด๋ณด๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ ์ฐพ๊ธฐ๋„ ์‰ฝ๋‹ค.

- ๋˜ํ•œ ํ•˜๋‚˜์˜ ๊ฐ์ฒด์— ์ •์˜๋œ ๊ธฐ๋Šฅ์ด๋‚˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋Š” ๋‹ค๋ฅธ ๊ฐ์ฒด์—์„œ๋„ ์‰ฝ๊ฒŒ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

ํ•ต์‹ฌ ์›์น™

1) ์บก์Аํ™” : ๊ฐ์ฒด ๋‚ด๋ถ€์˜ ์„ธ๋ถ€์ ์ธ ์‚ฌํ•ญ(์ค‘์š”ํ•œ ์ •๋ณด)์„ ์™ธ๋ถ€์— ๋…ธ์ถœ์‹œํ‚ค์ง€ ์•Š๋„๋ก ๊ฐ์ถ”๋Š”๊ฒƒ์„ ๋งํ•œ๋‹ค.

class User {
	private name: string;
    private age: number;
 
    setName(name: string) {
    	this.name = name;}
    getName() {
    	return this.name;}
    }

 - private์ด๋ผ๋Š” ์ ‘๊ทผ ์ œํ•œ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์Šคํ„ด์Šค ๋‚ด๋ถ€์—์„œ๋งŒ ํ•ด๋‹น ๋ณ€์ˆ˜์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋„๋ก ์ œํ•œํ•œ๋‹ค.

 

2) ์ƒ์† : ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๊ฐ€ ๊ฐ€์ง„ ํŠน์ง•(ํ•จ์ˆ˜, ๋ณ€์ˆ˜ ๋ฐ ๋ฐ์ดํ„ฐ)์„ ๋‹ค๋ฅธ ํด๋ž˜์Šค๊ฐ€ ๊ทธ๋Œ€๋กœ ๋ฌผ๋ ค ๋ฐ›๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

 ์ƒ์œ„ ํด๋ž˜์Šค์˜ ํŠน์ง•์„ ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ๋ฌผ๋ ค๋ฐ›์Œ์œผ๋กœ์จ ์ฝ”๋“œ์˜ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ณ  ์žฌ์‚ฌ์šฉ์„ฑ์„ ์ฆ๋Œ€์‹œํ‚จ๋‹ค.

class Mother {
  constructor(name, age, tech) {
    this.name = name;
    this.age = age;
    this.tech = tech;
  }
  getTech(){ return this.tech; } // ๋ถ€๋ชจ ํด๋ž˜์Šค getTech ๋ฉ”์„œ๋“œ
}

class Child extends Mother{
  constructor(name, age, tech) {
    super(name, age, tech); // ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœ
  }
}
const child = new Child("์˜์ด", "20", "Node.js");
console.log(child.name); // ์˜์ด
console.log(child.age); // 20

Mother ๋ถ€๋ชจ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์€ Child ์ž์‹ ํด๋ž˜์Šค์—์„œ name,age ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ์ง์ ‘ ์ ‘๊ทผํ•˜๊ณ  ํ˜ธ์ถœํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.

 

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

interface Human {
  name: string;
  setName(name);
  getName();
}
class Employee implements Human {
  constructor(public name: string) {  }

  setName(name) { this.name = name; }
  
  getName() { return this.name; }
}
const employee = new Employee("");
employee.setName("์ฒ ์ˆ˜");
console.log(employee.getName()); // ์ฒ ์ˆ˜

์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์ƒ์†๋ฐ›์€ ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์†Œ๋“œ๋Š” ๊ตฌํ˜„ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— Employee ํด๋ž˜์Šค๋Š” Human ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์ •์˜ํ•œ name ํ”„๋กœํผํ‹ฐ์™€ setName, getName ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ•์ œ๋กœ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋œ๋‹ค.(์ฝ”๋“œ์˜ ์ผ๊ด€์„ฑ ์œ ์ง€)

 

4) ๋‹คํ˜•์„ฑ : ํ•˜๋‚˜์˜ ๊ฐ์ฒด๊ฐ€ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ๋กœ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•˜๋ฉฐ, ์ด๋Š” ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง„ ํŠน์„ฑ์— ๋”ฐ๋ผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ๋‹ค๋ฅด๊ฒŒ ์žฌ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

=> ๋™์ผํ•œ ๋ฉ”์„œ๋“œ๋‚˜ ํ•จ์ˆ˜ ๋ช…์„ ์‚ฌ์šฉํ•˜๋”๋ผ๋„, ํด๋ž˜์Šค๋งˆ๋‹ค ๊ทธ ๋ฉ”์„œ๋“œ๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์ด ํŠน์ง•์ด๋‹ค.

class Person {
  constructor(name) { this.name = name; }
  buy() {}
}
class Employee extends Person {
  buy() { console.log(`${this.constructor.name} ํด๋ž˜์Šค์˜ ${this.name}๋‹˜์ด ๋ฌผ๊ฑด์„ ๊ตฌ๋งคํ•˜์˜€์Šต๋‹ˆ๋‹ค.`); }
}
class User extends Person {
  buy() { console.log(`${this.constructor.name} ํด๋ž˜์Šค์˜ ${this.name}๋‹˜์ด ๋ฌผ๊ฑด์„ ๊ตฌ๋งคํ•˜์˜€์Šต๋‹ˆ๋‹ค.`); }
}
const employee1 = new Employee("์˜ํฌ");
const user1 = new User("์›…์ด");

const personsArray = [employee1, user1];
personsArray.forEach((person) => person.buy());

// Employee ํด๋ž˜์Šค์˜ ์˜ํฌ๋‹˜์ด ๋ฌผ๊ฑด์„ ๊ตฌ๋งคํ•˜์˜€์Šต๋‹ˆ๋‹ค.
// User ํด๋ž˜์Šค์˜ ์›…์ด๋‹˜์ด ๋ฌผ๊ฑด์„ ๊ตฌ๋งคํ•˜์˜€์Šต๋‹ˆ๋‹ค.

- personsArray.forEach( ) ์—์„œ person ๋ณ€์ˆ˜๋Š” Person ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์€ Employee ๋˜๋Š” User ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

- ์—ฌ๊ธฐ์„œ ๊ฐ ์ธ์Šคํ„ด์Šค๋Š” buy ๋ฉ”์„œ๋“œ๋ฅผ ๋™์ผํ•˜๊ฒŒ ํ˜ธ์ถœํ•˜์ง€๋งŒ ์„œ๋กœ ๋‹ค๋ฅธ ํ–‰์œ„๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.