๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป DEV/Computer Science

[CS] OOP (๊ฐ์ฒด์ง€ํ–ฅ) & Functional (ํ•จ์ˆ˜ํ˜•) ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ์ดˆ

by vodkassi 2021. 9. 15.
728x90

OOP, ์ ˆ์ฐจ์ง€ํ–ฅ, ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ .. ๋งŽ์ด ์‚ฌ์šฉํ–ˆ์ง€๋งŒ ์ •ํ™•ํ•œ ๊ธฐ๋ณธ ๊ฐœ๋…์„ ์•Œ๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์–ด, ๊ด€๋ จ ๋‚ด์šฉ์„ ๋‹ด์•„ ์ •๋ฆฌํ•œ ๊ธ€์„ ์จ ๋ณธ๋‹ค.

 

 

๐Ÿ“Œ  Introdction

 

์ ˆ์ฐจ์ง€ํ–ฅํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ๊ฐ์ฒด์ง€ํ–ฅํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋“ฑ์˜ ์šฉ์–ด๋ฅผ ์•„์šธ๋Ÿฌ 'ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„'์ด๋ผ ์นญํ•œ๋‹ค. ์ผ์ข…์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์„ธ๊ณ„๊ด€์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ํŠน์ • ๊ธฐ๋ฒ•์ด๋‚˜ ์ด๋ก ์„ ๋ชจ์•„ ํ•˜๋‚˜์˜ ์ฒด๊ณ„๋กœ ๋งŒ๋“ค์—ˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. 

 

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„์€ ์œ ํ˜•์— ๋”ฐ๋ผ ๋ช…๋ นํ˜•/์„ ์–ธํ˜•์œผ๋กœ ๋ถ„๋ฅ˜ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

๐Ÿ’ก ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ: ์–ด๋–ป๊ฒŒ(How) ํ•  ๊ฑด์ง€๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋ฐฉ์‹

- ์ ˆ์ฐจ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

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

 

๐Ÿ’ก ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ: ๋ฌด์—‡(What)์„ ํ•  ๊ฑด์ง€๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋ฐฉ์‹

- ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ 

 

 

โœจ  ์ ˆ์ฐจ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

์ตœ๊ทผ๊นŒ์ง€๋„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„ ์ค‘ ๊ฐ€์žฅ ํฐ ์ง€๋ถ„์„ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ๋Š” OOP (๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ) ๊ฐ€ ๋‚˜์˜ค๊ธฐ ์ „์— ๊ฐ€์žฅ ๋งŽ์ด ํ™œ์šฉ๋˜์—ˆ์œผ๋ฉฐ, ํ˜„์žฌ๋„ ์ฒ˜์Œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ ‘ํ•  ๋•Œ๋Š” ์ž์—ฐ์Šค๋ ˆ ์ ‘ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ์ ˆ์ฐจ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋‹ค. 

 

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

 

๐Ÿ“Œ ์ ˆ์ฐจ์ง€ํ–ฅ ํŠน์ง• 

- ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ์ž‘์„ฑ๋œ๋‹ค.

- ํ•จ์ˆ˜์™€ ํ•จ์ˆ˜, ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜ ๋“ฑ ์„œ๋กœ์— ๋Œ€ํ•œ ์˜์กด์„ฑ์ด ๋†’๋‹ค.

 

์•„๋ž˜๋Š” ์ ˆ์ฐจ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์˜ˆ์ด๋‹ค. 

 

const year = 2021
const month = September
const day = 14

function today() {
	return `Today is ${month} ${day}, ${year}`;
}

function tomorrow() {
	return `Tomorrow is ${month} ${day + 1}, ${year}`;
}

 

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

OOP(Object-oriented Programming)์œผ๋กœ๋„ ๋„๋ฆฌ ์•Œ๋ ค์ง„ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์—ญ์‹œ ์ง๊ด€์ ์ด๋ฉฐ, ์‚ฌ๋žŒ์ด ์‚ฌ๊ณ ํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๊ฐ€๊น๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ฐœ๋…์„ ๋…ผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ฃผ์š” ํŠน์ง• 4๊ฐ€์ง€์ธ ์บก์Šํ™”, ์ถ”์ƒํ™”, ์ƒ์†, ๋‹คํ˜•์„ฑ์„ ๊ตฌ์ฒด์ ์œผ๋กœ ์•Œ์•„๋ณด์•„์•ผ ํ•œ๋‹ค. 

 

 

๐Ÿ“Œ Encapsulation (์บก์Šํ™”) 

 

๊ฐ์ฒด์ง€ํ–ฅ์˜ ๊ฐ€์žฅ ํฐ ํŠน์ง• ์ค‘ ํ•˜๋‚˜๋Š” ์„œ๋กœ ๊ด€๋ จ๋˜์–ด ์žˆ๋Š” ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๋ฅผ ํ•˜๋‚˜์˜ ๋‹จ์œ„๋กœ ๋ฌถ๋Š”๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. (๊ฐ™์€ ๋ชฉ์ ์„ ๊ฐ–๋Š” ๊ธฐ๋Šฅ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ๋Š” ๊ฒƒ๊ณผ๋„ ๊ฐ™๋‹ค) ์—ฐ๊ด€์„ฑ ๋†’์€ ๊ฒƒ๋“ค๋ผ๋ฆฌ ํ•˜๋‚˜์˜ ๋‹จ์œ„, ์ฆ‰ ์บก์Š ์•ˆ์— ๋‹ด๋Š”๋‹ค๊ณ  ํ•˜์—ฌ '์บก์Šํ™”' ๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ, ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ๋‹จ์œ„๋‚˜ ์บก์Š์ด ๊ณง ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ์ฒด์ด๋‹ค. 

 

โ— ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์˜คํ•ดํ•˜๋Š” ๊ฒƒ ์ค‘ ํ•˜๋‚˜๊ฐ€, JavaScript (๋˜๋Š” ๋‹ค๋ฅธ ์–ธ์–ด์˜) Class ๊ฐ€ ๊ณง OOP ์˜ ๊ฐ์ฒด์ผ ๊ฒƒ์ด๋ผ๋Š” ์ ์ด๋‹ค. ์ด๋Š” ๋ถ€์ •ํ™•ํ•œ ํ‘œํ˜„์ด๋ฉฐ, 'OOP๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ํด๋ž˜์Šค์™€ ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค' ๊ณ  ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๋” ์ •ํ™•ํ•˜๋‹ค. ์ฆ‰ JS ๊ฐ€ ์ง€์›ํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด OOP ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. 

 

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

 

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

 

๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด, ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ํŠน์ง•์ด ๋‹ค ๋‹ด๊ฒจ ์žˆ๋‹ค. 

 

class Grade {
    constructor (score) {
    	this.score = score;
        this.curve = 10 
    }
    
    getTotal() {
    	return this.score * this.curve
    }
}

const myGrade = new Grade(9);
myGrade.getTotal() // 90

 

- ์—ฐ๊ด€์„ฑ์ด ๋†’์€ ๊ฐ’ (score, curve) ๊ณผ ๊ธฐ๋Šฅ (getTotal) ๋ผ๋ฆฌ ํ•˜๋‚˜์˜ ์บก์Š (Grade) ์•ˆ์— ๋‹ด๊ฒจ ์žˆ๋‹ค. 

- ์™ธ๋ถ€์—์„œ๋Š” ๋‚ด๋ถ€์˜ ๊ฐ’์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค. Grade ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•จ์œผ๋กœ์จ ๊ฐ€๋Šฅํ•˜๋‹ค. 

- ํ•˜๋‚˜์˜ ๊ฐ์ฒด๊ฐ€ ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ๋ถ€ํ„ฐ ๋…๋ฆฝ์ ์ด๋‹ค. Grade ํด๋ž˜์Šค๋Š” ๋‹ค๋ฅธ ํด๋ž˜์Šค์™€ ์ „ํ˜€ ๋‹ค๋ฅธ ๊ฐ’๊ณผ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ๋‹ค๋ฅธ ์™ธ๋ถ€ ๊ฐ’์— ์˜์กดํ•˜์ง€ ์•Š๋Š”๋‹ค. 

 

 

๐Ÿ“Œ Abstraction (์ถ”์ƒํ™”) 

 

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

 

๊ฐ€๋ น, ์•ž์„  ์ฝ”๋“œ์—์„œ score, curve, getTotal ์€ ๋ชจ๋‘ '์„ฑ์ '์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๊ฐ’๊ณผ ๊ธฐ๋Šฅ๋“ค์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๋ชจ๋“  ๊ฐ’์ด ๋‹ด๊ธด ๊ฐ์ฒด์˜ ์ด๋ฆ„์€ 'Grade' ๋กœ ์ •์˜๋˜์—ˆ๋‹ค. ๋˜ํ•œ, ์™ธ๋ถ€์—์„œ๋Š” Grade ๋‚ด์˜ getTotal() ๋ฉ”์„œ๋“œ๊ฐ€ ์–ด๋–ค ๋ฐฉ์‹์„ ํ†ตํ•ด ์„ฑ์ ์„ ์‚ฐ์ถœํ•˜๋Š”์ง€ ์ „ํ˜€ ์•Œ์ง€ ๋ชปํ•ด๋„ ์ด๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์„ฑ์ ์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

์ถ”์ƒํ™”์˜ ์žฅ์ ์€ ๊ฐ์ฒด ๋‚ด๋ถ€์˜ ๋ณ€ํ™”๊ฐ€ ์™ธ๋ถ€์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ๋ ฅ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์™ธ๋ถ€์— ๊ตฌํ˜„๋œ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ทธ๋Œ€๋กœ ์œ ์ง€๋œ๋‹ค๋ฉด, ๋‚ด๋ถ€์˜ ๋กœ์ง์ด๋‚˜ ๊ฐ’์ด ์–ด๋–ป๊ฒŒ ๋ฐ”๋€Œ๋“  ์ด๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์“ฐ๋Š” ์‚ฌ์šฉ์ž (ํ”„๋กœ๊ทธ๋ž˜๋จธ) ๋Š” ๊ธฐ์กด ๋ช…์นญ์„ ๊ทธ๋Œ€๋กœ ํ™œ์šฉํ•˜์—ฌ ๊ฐ’์„ ์‚ฐ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

๐Ÿ“Œ Inheritance (์ƒ์†) 

 

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

 

์œ„์˜ Grade ๋ฅผ ์ƒ์†๋ฐ›์•„ ์ž์‹ ๋งŒ์˜ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•œ letterGrade ํด๋ž˜์Šค ์˜ˆ์ œ๋ฅผ ๋ณด๋ฉด ์ด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

class letterGrade extends Grade {
    getLetter () {
    	return (this.score >= 60 ? 'P' : 'F')
    }
} 

const hisGrade = new letterGrade(5);

console.log(hisGrade); // {score: 5, curve:10}
hisGrade.getLetter(); // 'F'

 

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

 

 

๐Ÿ“Œ Polymorphism (๋‹คํ˜•์„ฑ) 

 

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

 

 

 

 

โœจ  ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ

 

ํ•จ์ˆ˜๋Š” ์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ ๊ฒฐ๊ณผ๋ฌผ์„ ๋‚˜์˜ค๋„๋ก ํ•˜๋Š” ์ผ์ข…์˜ ํŒŒ์ดํ”„๋ผ์ธ์ด๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋“ค์€ ํ•จ์ˆ˜๋ฅผ ์ง€์›ํ•˜๋Š”๋ฐ, ๋‹จ์ˆœํžˆ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ํ•จ์ˆ˜๋กœ ์ž‘์„ฑํ•œ๋‹ค๊ณ  ํ•˜์—ฌ "ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ"์„ ๊ตฌํ˜„ํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—๋Š” ์—ฌ๋Ÿฌ ๋ณต์žกํ•œ ๊ทœ์น™๊ณผ ๊ฐœ๋…์ด ํฌํ•จ๋˜๋Š”๋ฐ, ์ด ๊ธ€์—์„œ๋Š” ๊ธฐ๋ณธ์ ์ธ ํŠน์ง•๋งŒ ๋‹ค๋ฃฌ๋‹ค. 

 

๐Ÿ“Œ  ์ˆœ์ˆ˜ํ•จ์ˆ˜ ์‚ฌ์šฉ

์ˆœ์ˆ˜ํ•จ์ˆ˜๋ž€ ํ•จ์ˆ˜์—์„œ ์™ธ๋ถ€ ์ƒํƒœ๊ฐ’์„ ์ฐธ์กฐํ•˜๊ฑฐ๋‚˜ ์™ธ๋ถ€ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜์ด๋‹ค. ๋˜ํ•œ, ๋™์ผํ•œ ์ธ์ž๋ฅผ ๋„ฃ์„ ๋•Œ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค. ์ˆœ์ˆ˜ํ•จ์ˆ˜๋Š” ์™ธ๋ถ€์— ์ „ํ˜€ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์œผ๋ฉฐ, ์˜ค์ง ์ฃผ์–ด์ง€๋Š” ์ธ์ž๋งŒ์œผ๋กœ ์ž‘์—…ํ•œ๋‹ค. 

 

// NOT pure function
let a = 1; 
function add (num) {
	return num + a;
}


// pure function
function add (num1, num2) {
	return num1 + num2;
}

 

๐Ÿ“Œ  ๋น„์ƒํƒœ์„ฑ, ๋ถˆ๋ณ€์„ฑ 

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

 

Side effect ๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ์‹œ์— ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ๊ธฐ์น˜ ๋ชปํ•œ ๋ณ€์ˆ˜ ๊ฐ’์˜ ๋ณ€๊ฒฝ, ๊ฐ์ฒด๋‚˜ ์ž๋ฃŒ ์ˆ˜์กฐ์˜ ๊ฐ’ ์ˆ˜์ •, ์˜ค๋ฅ˜ ๋ฐœ์ƒ, I/O ์ž‘์—… ๋“ฑ์„ ๋ชจ๋‘ ํฌํ•จํ•œ๋‹ค. 

 

// NOT functional programming
function (obj) {
    obj.Name = 'Function'
    return obj
}

// functional programming
function (obj) {
    return { ...obj, Name: 'Function'}
}

 

๐Ÿ“Œ  ์ผ๊ธ‰๊ฐ์ฒด, ๊ณ ์ฐจํ•จ์ˆ˜ ์‚ฌ์šฉ

์ผ๊ธ‰๊ฐ์ฒด๋ž€ ๋‹ค์Œ์˜ ํŠน์„ฑ์„ ์ง€๋‹Œ ๊ฐ์ฒด์ด๋‹ค.

 

- ๋ณ€์ˆ˜๋‚˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์•ˆ์— ๋‹ด์„ ์ˆ˜ ์žˆ์Œ

- Parameter ๋กœ ์ „๋‹ฌ ๊ฐ€๋Šฅ

- ๋ฐ˜ํ™˜๊ฐ’ (return) ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

 

JS ์˜ ํ•จ์ˆ˜๋Š” ์œ„์˜ ํŠน์ง•์„ ๋ชจ๋‘ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ผ๊ธ‰ ๊ฐ์ฒด์ด๋‹ค. ๋”ฐ๋ผ์„œ ํ•จ์ˆ˜๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ธฐ๊ฑฐ๋‚˜ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ณ ์ฐจํ•จ์ˆ˜๋ฅผ ์ž์ฃผ ํ™œ์šฉํ•˜๊ฒŒ ๋œ๋‹ค. 

 

const calc = (num1, num2, op) => op(num1, num2);

const add = (num1, num2) => num1 + num2;
const multiply = (num1, num2) => num1 * num2;
const power = (num1, num2) => Math.pow(num2, num1);

calc(2, 3, add) // 5
calc(2, 3, multiply) // 6
calc(2, 3, power) // 9

 

 

 

โœจ  ๋ฐฐ์šด ์ 

  • ๋Œ€์„ธ๊ฐ€ OOP ์—์„œ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ ์ด๋™ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ํ•˜๋Š”๋ฐ ์•„์ง ์ ˆ์ฐจ์ง€ํ–ฅ๊ณผ OOP ์— ์ต์ˆ™ํ•œ ๋‚˜๋กœ์จ๋Š” ํ•จ์ˆ˜ํ˜•์˜ ๊ตฌ์ฒด์ ์ธ ๊ฐœ๋…๋“ค์ด ์•„์ง ์™€๋‹ฟ์ง€ ์•Š๋Š”๋‹ค. (ํŠนํžˆ ๋ชจ๋‚˜๋“œ..) ๊ณ ์ฐจํ•จ์ˆ˜์™€ ์ผ๊ธ‰๊ฐ์ฒด์— ๋Œ€ํ•œ ๊ธฐ๋ณธ๊ธฐ๋ฅผ ์กฐ๊ธˆ ๋” ๋‹ค์ง„ ๋’ค์—, ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ด€๋ จ ๊ตฌ์ฒด์ ์ธ ํŠน์ง•๋“ค์„ ์‘์šฉํ•ด๋ณด์•„์•ผ ํ•˜๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ ๋‹ค. 

 

 

โœจ์ฐธ๊ณ ์ž๋ฃŒ

๋Œ“๊ธ€