undefined

3์žฅ ํ•จ์ˆ˜

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

์ด ์žฅ์—์„œ๋Š”,

  • ์˜๋„๋ฅผ ๋ถ„๋ช…ํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•
  • ํ”„๋กœ๊ทธ๋žจ ๋‚ด๋ถ€๋ฅผ ์ง๊ด€์ ์œผ๋กœ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ์ˆ˜๋ฅผ ์‰ฝ๊ฒŒ ์ฝ๊ณ  ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•

์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณธ๋‹ค.


์ž‘๊ฒŒ ๋งŒ๋“ค์–ด๋ผ!

ํ•จ์ˆ˜๋Š” ์ž‘์„์ˆ˜๋ก ๋” ์ข‹๋‹ค. ๊ทธ๋ž˜์•ผ ์ฝ๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์›Œ์ง„๋‹ค.

์กฐ๊ฑด๋ฌธ, ๋ฐ˜๋ณต๋ฌธ ๋“ฑ์— ๋“ค์–ด๊ฐ€๋Š” ๋ธ”๋ก์€ ํ•œ ์ค„์ด์–ด์•ผ ํ•œ๋‹ค. ์ฆ‰,

  • ์ค‘์ฒฉ ๊ตฌ์กฐ๊ฐ€ ์ƒ๊ธธ ๋งŒํผ ํ•จ์ˆ˜๊ฐ€ ์ปค์ ธ์„œ๋Š” ์•ˆ ๋œ๋‹ค.
  • ํ•จ์ˆ˜์—์„œ ๋“ค์—ฌ ์“ฐ๊ธฐ ์ˆ˜์ค€์€ 2๋‹จ์„ ๋„˜์–ด์„œ๋ฉด ์•ˆ ๋œ๋‹ค.

 

ํ•œ ๊ฐ€์ง€๋งŒ ํ•ด๋ผ!

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

์—ฌ๊ธฐ์—์„œ ‘ํ•œ ๊ฐ€์ง€๋ฅผ ํ•œ๋‹ค’๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์€ ์ถ”์ƒํ™” ์ˆ˜์ค€์ด ํ•˜๋‚˜์ธ ๋‹จ๊ณ„๋งŒ ์ˆ˜ํ–‰ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๋‹จ์ˆœํžˆ ๋‹ค๋ฅธ ํ‘œํ˜„์ด ์•„๋‹ˆ๋ผ ์˜๋ฏธ ์žˆ๋Š” ์ด๋ฆ„์œผ๋กœ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ทธ ํ•จ์ˆ˜๋Š” ์—ฌ๋Ÿฌ ์ž‘์—…์„ ํ•˜๋Š” ์…ˆ์ด๋‹ค.

 

ํ•จ์ˆ˜ ๋‹น ์ถ”์ƒํ™” ์ˆ˜์ค€์€ ํ•˜๋‚˜๋กœ!

ํ•จ์ˆ˜๊ฐ€ ํ™•์‹คํžˆ ํ•œ ๊ฐ€์ง€ ์ž‘์—…๋งŒ ํ•˜๋ ค๋ฉด ํ•จ์ˆ˜ ๋‚ด ๋ชจ๋“  ๋ฌธ์žฅ์˜ ์ถ”์ƒํ™” ์ˆ˜์ค€์ด ๋™์ผํ•ด์•ผ ํ•œ๋‹ค.

ํ•œ ํ•จ์ˆ˜ ๋‚ด์— ์ถ”์ƒํ™” ์ˆ˜์ค€์„ ์„ž์œผ๋ฉด ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ์‚ฌ๋žŒ์ด ํ—ท๊ฐˆ๋ฆฐ๋‹ค. ํŠน์ • ํ‘œํ˜„์ด ๊ทผ๋ณธ ๊ฐœ๋…์ธ์ง€, ์„ธ๋ถ€์‚ฌํ•ญ์ธ์ง€ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ทผ๋ถ„ ๊ฐœ๋…๊ณผ ์„ธ๋ถ€์‚ฌํ•ญ์ด ๋’ค์„ž์ด๋ฉด ํ•จ์ˆ˜์— ์„ธ๋ถ€์‚ฌํ•ญ์„ ์ ์  ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋œ๋‹ค.

 

์œ„์—์„œ ์•„๋ž˜๋กœ ์ฝ”๋“œ ์ฝ๊ธฐ: ๋‚ด๋ ค๊ฐ€๊ธฐ ๊ทœ์น™

๋‚ด๋ ค๊ฐ€๊ธฐ ๊ทœ์น™์ด๋ž€, ์œ„์—์„œ ์•„๋ž˜๋กœ ๊ฐˆ์ˆ˜๋ก ํ•จ์ˆ˜ ์ถ”์ƒํ™” ์ˆ˜์ค€์ด ํ•œ ๋‹จ๊ณ„์”ฉ ๋‚ฎ์•„์ง„๋‹ค๋Š” ๊ทœ์น™์ด๋‹ค.

์œ„์—์„œ ์•„๋ž˜๋กœ ์ฝ์–ด ๋‚ด๋ ค๊ฐ€๋“ฏ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ์ถ”์ƒํ™” ์ˆ˜์ค€์„ ์ผ๊ด€๋˜๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์‰ฌ์›Œ์ง„๋‹ค.

 

Switch ๋ฌธ

๋ณธ์งˆ์ ์œผ๋กœ switch ๋ฌธ์€ N๊ฐ€์ง€ ์ผ์„ ํ•œ๋‹ค. ๋˜ํ•œ ์ž‘๊ฒŒ ๋งŒ๋“ค๊ธฐ ํž˜๋“ค๋‹ค.

switch๋ฌธ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์ฝ”๋“œ๋ฅผ ์ €์ฐจ์› ํด๋ž˜์Šค์— ์ˆจ๊ธฐ๊ณ  ์ ˆ๋Œ€๋กœ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค.

function calculatePay(e: Employee) {
	switch (e.type) {
		case COMISSIONED:
			return calculateComissionedPay(e);
		case HOURLY:
			return calculateHourlyPay(e);
		case SALARIED:
			return calculateSalariedPay(e);
    default:
      throw new InvalidEmployeeType(e.type)
	}
}

์œ„ ์ฝ”๋“œ์˜ ๋ฌธ์ œ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

  1. ํ•จ์ˆ˜๊ฐ€ ๊ธธ๋‹ค. Employee type์ด ์ถ”๊ฐ€๋œ๋‹ค๋ฉด ๋” ๊ธธ์–ด์ง„๋‹ค.
  2. ํ•œ ๊ฐ€์ง€ ์ž‘์—…๋งŒ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  3. Single Responsibility Principle์„ ์œ„๋ฐ˜ํ•œ๋‹ค. ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•  ์ด์œ ๊ฐ€ ์—ฌ๋Ÿฟ์ด๊ธฐ ๋•Œ๋ฌธ์—
  4. Open Closed Principle์„ ์œ„๋ฐ˜ํ•œ๋‹ค. ์ƒˆ type์ด ์ถ”๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ ๋•Œ๋ฌธ์—
  5. ์œ„ ํ•จ์ˆ˜์™€ ๊ตฌ์กฐ๊ฐ€ ๋™์ผํ•œ ์ฝ”๋“œ๊ฐ€ ๋ฌดํ•œ์ • ์กด์žฌํ•˜๊ฒŒ ๋œ๋‹ค.
  6. ex) isPayday(e: Employee, date: Date), deliverPay(e: Employee, pay: Money)

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด

  • switch ๋ฌธ์„ ํŒฉํ† ๋ฆฌ ํ•จ์ˆ˜๋กœ ๊ฝ๊ฝ ์ˆจ๊ธด๋‹ค.
  • ์œ ํ˜•๋ณ„ Employee๋Š” ์ƒ์†์„ ํ†ตํ•œ ๋‹คํ˜•์„ฑ์„ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๊ณ , ํŒฉํ† ๋ฆฌ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ƒ์„ฑํ•œ๋‹ค.

 

๋จผ์ € ๋ชจ๋“  ์œ ํ˜•์˜ Employee๊ฐ€ ์ƒ์†๋ฐ›๋Š” ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ๋‹ค์Œ์ฒ˜๋Ÿผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

abstract class Employee {
  protected record: EmployeeRecord;
  protected abstract isPayday(): boolean;
  protected abstract caclulatePay(): Money;
  protected abstract deliverPay(pay: Money): void;

  constructor(r: EmployeeRecord) {
    this.record = r;
  }
}

 

๊ฐ type ๋ณ„๋กœ ํŒŒ์ƒ ํด๋ž˜์Šค๋ฅผ ๋‹ค์Œ์ฒ˜๋Ÿผ ๊ตฌํ˜„ํ•œ๋‹ค.

// Employee์˜ ํŒŒ์ƒ ํด๋ž˜์Šค
class ComissionedEmployee extends Employee {
  protected isPayday(): boolean {
    ...
  }
  protected caclulatePay(): number {
    ...
  }
  protected deliverPay(pay: number): void {
    ...
  }
}

 

ํŒฉํ† ๋ฆฌ ํ•จ์ˆ˜๋Š” ๋‹ค์Œ์ฒ˜๋Ÿผ ๊ตฌํ˜„ํ•œ๋‹ค.

function makeEmployee(r: EmployeeRecord): Employee {
  switch (r.type) {
    case 'COMISSIONED':
      return new ComissionedEmployee(r); //Employee์˜ ํŒŒ์ƒ ํด๋ž˜์Šค
    case 'HOURLY':
      return HourlyEmployee(r); //Employee์˜ ํŒŒ์ƒ ํด๋ž˜์Šค
    case 'SALARIED':
      return SalariedEmployee(r); //Employee์˜ ํŒŒ์ƒ ํด๋ž˜์Šค
    default:
      throw new InvalidEmployeeType(r.type);
  }
}

 

์ด์ œ ๋‹ค๋ฅธ ๋ชจ๋“  ์ฝ”๋“œ์—์„œ Employee์˜ type๋ณ„๋กœ switch๋ฌธ์„ ์‚ฌ์šฉํ•  ์ผ์ด ์—†์–ด์ง„๋‹ค.

๋˜ํ•œ, ์ƒˆ๋กœ์šด type์ด ์ถ”๊ฐ€๋˜๋”๋ผ๋„ ํŒฉํ† ๋ฆฌ ํ•จ์ˆ˜๋ฅผ ์ œ์™ธํ•œ ๋‹ค๋ฅธ ์ฝ”๋“œ๋Š” ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

const employee = makeEmployee(record);
// switch ๋ฌธ์ด ํ•„์š”์—†๋‹ค
if(employee.isPayday())
	employee.deliverPay();

 

์„œ์ˆ ์ ์ธ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋ผ!

์ข‹์€ ์ด๋ฆ„์ด ์ฃผ๋Š” ๊ฐ€์น˜๋Š” ํด๋ฆฐ์ฝ”๋“œ ์ „๋ฐ˜์— ๊ฑฐ์ณ์„œ ๊ฐ•์กฐํ•˜๊ณ  ์žˆ๋Š” ๋‚ด์šฉ์ด๋‹ค.

ํ•จ์ˆ˜๊ฐ€ ์ž‘๊ณ  ๋‹จ์ˆœํ• ์ˆ˜๋ก ์„œ์ˆ ์ ์ธ ์ด๋ฆ„์„ ๊ณ ๋ฅด๊ธฐ๋„ ์‰ฌ์›Œ์ง„๋‹ค.

  • ๊ธธ๊ณ  ์„œ์ˆ ์ ์ธ ์ด๋ฆ„์ด ์งง๊ณ  ์–ด๋ ค์šด ์ด๋ฆ„๋ณด๋‹ค ์ข‹๋‹ค.
  • ์ด๋ฆ„์„ ๋ถ™์ผ ๋•Œ ์ผ๊ด€์„ฑ์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๋ชจ๋“ˆ ๋‚ด์—์„œ ๊ฐ™์€ ๋ฌธ๊ตฌ, ๋ช…์‚ฌ, ๋™์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ฒด๋ฅผ ๋น„์Šทํ•˜๊ฒŒ ๋งŒ๋“ค์–ด๋ผ

 

ํ•จ์ˆ˜ ์ธ์ˆ˜

  • ํ•จ์ˆ˜ ์ธ์ˆ˜๋Š” 0๊ฐœ ์ธ ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹๊ณ  ๊ฐ€๋Šฅํ•œ 3๊ฐœ ์ด์ƒ์€ ํ”ผํ•˜๋Š” ํŽธ์ด ์ข‹๋‹ค.
    • ํ…Œ์ŠคํŠธ ๊ด€์ ์—์„œ๋„ ์ธ์ˆ˜๊ฐ€ ๋งŽ์„์ˆ˜๋ก ๋ชจ๋“  ์กฐํ•ฉ์„ ๊ตฌ์„ฑํ•ด ํ…Œ์ŠคํŠธํ•˜๊ธฐ๊ฐ€ ๋ถ€๋‹ด์Šค๋Ÿฌ์›Œ์ง„๋‹ค.
  • ์ถœ๋ ฅ ์ธ์ˆ˜๋Š” ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์šฐ๋ฏ€๋กœ ์ง€์–‘ํ•œ๋‹ค. ํ•จ์ˆ˜์—์„œ ์ธ์ˆ˜๋กœ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›๋Š” ๊ฒƒ์€ ์ง๊ด€์ ์ด์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

๋งŽ์ด ์“ฐ๋Š” ๋‹จํ•ญ ํ˜•์‹

๋‹จํ•ญ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ํฌ๊ฒŒ ์„ธ ๊ฐ€์ง€์ด๋‹ค.

  1. ์ธ์ˆ˜์— ์งˆ๋ฌธ์„ ๋˜์ง€๋Š” ๊ฒฝ์šฐ
  2. ex) fileExists: (path: string) ⇒ boolean
  3. ์ธ์ˆ˜๋ฅผ ๋ญ”๊ฐ€๋กœ ๋ณ€ํ™˜ํ•ด ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ
  4. ex) fileOpen: (path: string) ⇒ InputStream
  5. ๋‹จํ•ญ ํ•จ์ˆ˜๋ฅผ ์ด๋ฒคํŠธ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ - ํ”„๋กœ๊ทธ๋žจ์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ์ด๋ฒคํŠธ๋กœ ํ•ด์„ํ•ด ์ž…๋ ฅ ์ธ์ˆ˜๋กœ ์‹œ์Šคํ…œ ์ƒํƒœ๋ฅผ ๋ฐ”๊พผ๋‹ค. ex) passwordAttemptFailedNtimes: (attempts: number) ⇒ void

ํ•จ์ˆ˜ ์ด๋ฆ„์„ ์ง€์„ ๋•Œ๋Š” ์„ธ ๊ฒฝ์šฐ๋ฅผ ๋ถ„๋ช…ํžˆ ๊ตฌ๋ถ„ํ•˜๊ณ , ์ผ๊ด€์ ์ธ ๋ฐฉ์‹์œผ๋กœ ๊ฐ ํ˜•์‹์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

์ด๋ฒคํŠธ ํ•จ์ˆ˜๋Š” ์ด๋ฒคํŠธ๋ผ๋Š” ์‚ฌ์‹ค์ด ์ฝ”๋“œ์— ๋ช…ํ™•ํžˆ ๋“œ๋Ÿฌ๋‚˜์•ผ ํ•œ๋‹ค.

 

ํ”Œ๋ž˜๊ทธ ์ธ์ˆ˜

ํ”Œ๋ž˜๊ทธ ์ธ์ˆ˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ผ์„ ํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค.

๊ฐ€๋Šฅํ•œ ๋‘ ๊ฐœ์˜ ํ•จ์ˆ˜๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค.

 

์ดํ•ญ ํ•จ์ˆ˜, ์‚ผํ•ญ ํ•จ์ˆ˜

์ดํ•ญํ•จ์ˆ˜๊ฐ€ ์ ์ ˆํ•œ ๊ฒฝ์šฐ๋Š” ํ•œ ๊ฐ’์„ ํ‘œํ˜„ํ•˜๋Š” ๋‘ ์š”์†Œ์ธ ๊ฒฝ์šฐ, ์ž์—ฐ์ ์ธ ์ˆœ์„œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์ด๋‹ค.

ex) const point = new Point(0, 0)

์ดํ•ญ ํ•จ์ˆ˜๋Š” ๋‹จํ•ญ ํ•จ์ˆ˜๋ณด๋‹ค ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— ์ง€์–‘ํ•˜๋Š” ํŽธ์ด ์ข‹๋‹ค.

๋ฌด์กฐ๊ฑด ๋‚˜์œ ๊ฑด ์•„๋‹ˆ์ง€๋งŒ ์œ„ํ—˜์ด ๋”ฐ๋ฅธ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์ดํ•ดํ•˜๊ณ , ๊ฐ€๋Šฅํ•˜๋ฉด ๋‹จํ•ญ ํ•จ์ˆ˜๋กœ ๋ฐ”๊พธ๋„๋ก ์• ์จ์•ผ ํ•œ๋‹ค.

์‚ผํ•ญ ํ•จ์ˆ˜ ๋˜ํ•œ ๋‹น์—ฐํžˆ ์ดํ•ญ ํ•จ์ˆ˜๋ณด๋‹ค ํ›จ์”ฌ ๋” ์–ด๋ ต๋‹ค. ์‹ ์ค‘ํžˆ ๊ณ ๋ คํ•˜์—ฌ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

 

์ธ์ˆ˜ ๊ฐ์ฒด

์ธ์ˆ˜๊ฐ€ 2๊ฐœ ์ด์ƒ ํ•„์š”ํ•˜๋‹ค๋ฉด ์ผ๋ถ€๋ฅผ ๋…์ž์ ์ธ ํด๋ž˜์Šค๋‚˜ object ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์งš์–ด๋ณธ๋‹ค.

๋ณ€์ˆ˜๋ฅผ ๋ฌถ์–ด์„œ ๋„˜๊ธธ ๋•Œ ์ด๋ฆ„์„ ๋ถ™์—ฌ์•ผ ํ•˜๋ฏ€๋กœ ๊ฒฐ๊ตญ์€ ๊ฐœ๋…์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

function makeCircle(x: number, y: number, radius: number)

type Point = {x: number, y: number}
function makeCircle(point: Point, radius: number)

 

๋™์‚ฌ์™€ ํ‚ค์›Œ๋“œ

ํ•จ์ˆ˜์˜ ์˜๋„๋‚˜ ์ธ์ˆ˜์˜ ์ˆœ์„œ์™€ ์˜๋„๋ฅผ ์ œ๋Œ€๋กœ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์ข‹์€ ํ•จ์ˆ˜ ์ด๋ฆ„์€ ๋‹ค์Œ์ฒ˜๋Ÿผ ์ง€์„ ์ˆ˜ ์žˆ๋‹ค.

  • ๋‹จํ•ญ ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜์™€ ์ธ์ˆ˜๊ฐ€ ๋™์‚ฌ/๋ช…์‚ฌ ์Œ์„ ์ด๋ค„์•ผ ํ•œ๋‹ค.
  • writeField(name)
  • ํ•จ์ˆ˜ ์ด๋ฆ„์— ํ‚ค์›Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. ์ฆ‰, ํ•จ์ˆ˜ ์ด๋ฆ„์— ์ธ์ˆ˜ ์ด๋ฆ„์„ ๋„ฃ๋Š”๋‹ค.
  • assertEquals(expected, actual) → assertExpectedEqualsActual(expected, actual)

 

๋ถ€์ˆ˜ ํšจ๊ณผ๋ฅผ ์ผ์œผํ‚ค์ง€ ๋งˆ๋ผ!

๋งŽ์€ ๊ฒฝ์šฐ ์‹œ๊ฐ„์ ์ธ ๊ฒฐํ•ฉ์ด๋‚˜ ์ˆœ์„œ ์ข…์†์„ฑ์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

function checkPassword(username: string, password: string) {
  const user = findByName(username)
  if(user) {
		const codedPhrase = getPhraseEncodedByPassword();
    const phrase = decrypt(codedPhrase, password);
    if ("Valid Password" === phrase) {
      Session.initialize(); // ๐Ÿ”ด ํ•จ์ˆ˜๊ฐ€ ์ผ์œผํ‚ค๋Š” ๋ถ€์ˆ˜ ํšจ๊ณผ
      return true
    }
  }
  return false
}

checkPassword๋ผ๋Š” ํ•จ์ˆ˜ ์ด๋ฆ„์—์„œ ์„ธ์…˜์„ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์ด ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š๋Š”๋‹ค.

์ด๋Ÿฐ ๋ถ€์ˆ˜ ํšจ๊ณผ๊ฐ€ ์‹œ๊ฐ„์ ์ธ ๊ฒฐํ•ฉ์„ ์ดˆ๋ž˜ํ•œ๋‹ค. ์ฆ‰, ์„ธ์…˜์„ ์ดˆ๊ธฐํ™”ํ•ด๋„ ๊ดœ์ฐฎ์€ ๊ฒฝ์šฐ์—๋งŒ ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์‹œ๊ฐ„์ ์ธ ๊ฒฐํ•ฉ์ด ํ•„์š”ํ•˜๋‹ค๋ฉด ํ•จ์ˆ˜ ์ด๋ฆ„์— ๋ถ„๋ช…ํžˆ ๋ช…์‹œํ•˜๋„๋ก ํ•œ๋‹ค.

 

๋ช…๋ น๊ณผ ์กฐํšŒ๋ฅผ ๋ถ„๋ฆฌํ•˜๋ผ!

ํ•จ์ˆ˜๋Š” ๊ฐ์ฒด ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜, ๊ฐ์ฒด ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ๋‘˜ ์ค‘ ํ•˜๋‚˜๋งŒ ํ•˜๋„๋ก ํ•œ๋‹ค.

// ๐Ÿ”ด username ์†์„ฑ์„ unclebob์œผ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์— ์„ฑ๊ณตํ•˜๋ฉด true, ์‹คํŒจํ•˜๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
// username์ด unclebob์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ๋‹ค๋ฉด...์œผ๋กœ ์ฝํžŒ๋‹ค
if(set("username", "unclebob")) ...

// ๐ŸŸข ์กฐํšŒ์™€ ๋ช…๋ น์„ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋กœ ๋ถ„๋ฆฌํ•ด์„œ ํ˜ผ๋ž€์„ ์ผ์œผํ‚ค์ง€ ์•Š๋Š”๋‹ค.
if(attributeExists("username")) {
	setAttribute("username", "unclebob")
}

 

์˜ค๋ฅ˜ ์ฝ”๋“œ๋ณด๋‹ค ์˜ˆ์™ธ๋ฅผ ์‚ฌ์šฉํ•˜๋ผ!

์˜ค๋ฅ˜ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฉ์‹์€ ๋ช…๋ น/์กฐํšŒ ๋ถ„๋ฆฌ ๊ทœ์น™์„ ์œ„๋ฐ˜ํ•œ๋‹ค.

๋˜ํ•œ, ์—ฌ๋Ÿฌ ๋‹จ๊ณ„๋กœ ์ค‘์ฒฉ๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์•ผ๊ธฐํ•˜๊ฒŒ ๋œ๋‹ค. ํ˜ธ์ถœ์ž๋Š” ์˜ค๋ฅ˜ ์ฝ”๋“œ๋ฅผ ๊ณง๋ฐ”๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋ฐ˜๋ฉด ์˜ˆ์™ธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด try/catch ๋ฌธ์„ ํ†ตํ•ด ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์ฝ”๋“œ๊ฐ€ ์›๋ž˜ ์ฝ”๋“œ์—์„œ ๋ถ„๋ฆฌ๋  ์ˆ˜ ์žˆ๋‹ค.

 

try/catch ๋ธ”๋ก ๋ฝ‘์•„๋‚ด๊ธฐ

try/catch๋ฌธ์€ ์ •์ƒ ๋™์ž‘๊ณผ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋™์ž‘์„ ๋’ค์„ž๋Š”๋‹ค.

๋”ฐ๋ผ์„œ ๋ณ„๋„ ํ•จ์ˆ˜๋กœ ๋ฝ‘์•„๋‚ด๋Š” ํŽธ์ด ์ข‹๋‹ค.

 

์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋„ ํ•œ ๊ฐ€์ง€ ์ž‘์—…์ด๋‹ค.

๋”ฐ๋ผ์„œ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜๋Š” ์˜ค๋ฅ˜๋งŒ ์ฒ˜๋ฆฌํ•œ๋‹ค.

 

๊ตฌ์กฐ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ

๋ชจ๋“  ํ•จ์ˆ˜์™€ ํ•จ์ˆ˜ ๋‚ด ๋ชจ๋“  ๋ธ”๋ก์— ์ž…๊ตฌ์™€ ์ถœ๊ตฌ๊ฐ€ ํ•˜๋‚˜๋งŒ ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค.

  • ํ•จ์ˆ˜๋Š” return ๋ฌธ์ด ํ•˜๋‚˜์—ฌ์•ผ ํ•œ๋‹ค
  • ๋ฃจํ”„ ์•ˆ์—์„œ break, continue๋ฅผ ์‚ฌ์šฉํ•ด์„  ์•ˆ๋œ๋‹ค.

๋‹จ, ํ•จ์ˆ˜๊ฐ€ ์•„์ฃผ ํด ๋•Œ๋งŒ ์ƒ๋‹นํ•œ ์ด์ต์„ ์ œ๊ณตํ•œ๋‹ค.

ํ•จ์ˆ˜๋ฅผ ์ž‘๊ฒŒ ๋งŒ๋“ ๋‹ค๋ฉด return, break, continue์˜ ์‚ฌ์šฉ์ด ์˜๋„๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐ ๋” ์œ ๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.