๐ Chapter 7 : ์ ์ฐํ ํจ์๋ฅผ ๋ง๋ค์ด๋ผ.
๐ฏ ํ ์คํธํ๊ธฐ ์ฌ์ด ํจ์๋ฅผ ์์ฑํ๋ผ.โ
- ํ ์คํธ๋ฅผ ์์ฑํ๋ฉด ์ฝ๋๋ฅผ ์ฝ๊ฒ ๋ฆฌํฉํ ๋งํ ์ ์๊ณ , ์ค๋๋ ์ฝ๋๋ฅผ ํจ์ฌ ์ฝ๊ฒ ์ดํดํ ์ ์๋ค.
- ๋ํ, ์ผ๋ฐ์ ์ผ๋ก ๋ ๋ช ํํ๊ณ ๋ฒ๊ทธ๊ฐ ์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์๋ค.
- ํ ์คํธ ๊ฐ๋ฅํ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ์ฝ๋๊ฐ ์ ์ฐจ ๊ฐ์ ๋๊ณ , ํ ์คํธ๋ฅผ ์์ฑํ๊ธฐ ์ฌ์์ง๋ฉฐ, ์ฌ์ฉ์ ๊ฒฝํ๋ ๊ฐ์ ๋ ๊ฒ์ด๋ค.
- ๋ํ์ ์ธ ํ ์คํธ ํ๋ ์์ํฌ์ธ ์ฌ์ค๋ฏผ(Jasmine), ๋ชจ์นด(Mocha), ์ ์คํธ(Jest) ๊ฐ ์๋ค. (๋ชจ์นด ์ถ๊ฐ ์ฐธ๊ณ )
- ์ด ์ฑ ์ ์์ ์ฝ๋๋ฅผ ์ํด ์์ฑ๋ ํ ์คํธ ์ฝ๋๋ ํ ์คํธ ์คํ๊ธฐ๋ก ๋ชจ์นด๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค.
- ์๋๋ ์กฐ๊ธ ๋ณต์กํ ์ฝ๋์ด๋ค.
import { getTaxInformation } from './taxService';
function formatPrice(user, { price, location }) {
const rate = getTaxInformation(location); // <label id="test.external" />
const taxes = rate ? `์ถ๊ฐ ์ธ๊ธ $${price * rate}` : '์ถ๊ฐ ์ธ๊ธ';
return `${user}๋์ ํจ๊ป ๊ธ์ก: $${price} ๋ฐ ${taxes}`;
}
export { formatPrice };
- ํ
์คํธํ ๋ ์ด๋ ค์ด ๋ถ๋ถ์
const rate = getTaxInformation(location);
์ด ๋ถ๋ถ์ผ๋ก ์ธ๋ถ ํจ์๋ฅผ ํธ์ถํ ๋ ์์๋๋ค. - ๋ถ๋ฌ์จ ํจ์๋ฅผ ์ง์ ์ฌ์ฉํ ๋๋ ํ ์คํธํ๋ ค๋ ํจ์๊ฐ ๋ถ๋ฌ์จ ํจ์์ ๋ฐ์ ํ๊ฒ ๊ฒฐํฉ๋๋ ๋ฌธ์ ๊ฐ ์๋ค.
- ์ฆ, ํ ์คํธ๋ฅผ ์คํํ ๋ ํ ์คํธ๊ฐ ์ธ๋ถ API์๋ ์ ๊ทผํด์ผ ํ๋ฉฐ, ๊ทธ ๊ฒฐ๊ณผ ํ ์คํธ๋ ๋คํธ์ํฌ ์ ๊ทผ, ์๋ต ์๊ฐ ๋ฑ์ ์์กดํ๊ฒ ๋ ๊ฒ์ด๋ค.
- ์ด ๋ฌธ์ ๋ฅผ ํผํ๋ ค๋ฉด ๋ชจ์ ๊ฐ์ฒด(mock)๋ฅผ ์์ฑํด์ ํจ์๋ฅผ ๊ฐ๋ก์ฑ๊ณ ๋ช ์์ ์ธ ๋ฐํ๊ฐ์ ์ค์ ํ๊ฒ ๋ง๋ค์ด์ผ ํ๋ค.
import expect from 'expect';
import sinon from 'sinon';
import * as taxService from './taxService';
import { formatPrice } from './problem';
describe('๊ฐ๊ฒฉ ํ์', () => {
let taxStub;
beforeEach(() => {
// getTaxInformation ํจ์๋ฅผ ๋ฎ์ด ์จ์ ๊ฐ๋จํ ๋ฐํ๊ฐ์ด ๋๋๋ก ์คํ
(stub)์ ์์ฑํ๋ค.
// ์คํ
์ ๋ง๋ค ๋ ๋ถ๋ฌ์จ ์ฝ๋๋ ๊ฑด๋๋ฐ๊ธฐ ๋๋ฌธ์ ์ค์ ์ฝ๋๋ฅผ ์คํํ์ง ์๊ณ ์ถ๋ ฅ๋ ๊ฐ๋ง ์ ์ธํ๋ค.
// ์คํ
์ ์ฌ์ฉํ ๋ ์ฅ์ ์ ์ด๋ค ์ข
๋ฅ๋ ์ธ๋ถ ์์กด์ฑ์ ๊ฑฑ์ ํ ํ์๊ฐ ์๋ค.
taxStub = sinon.stub(taxService, 'getTaxInformation'); // <label id="test.stub" />
});
// ํ
์คํธ ๊พธ๋ฌ๋ฏธ๊ฐ ์ข
๋ฃ๋๋ฉด ์๋์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋๋ก ์ฝ๋๋ฅผ ๋ณต๊ตฌํด์ค์ผ ํ๋ค.
// ์ฝ๋๋ฅผ ๋ณต๊ตฌํ๋ ๊ฒ์ ํ์ ๋จ๊ณ์ด๋ค.
afterEach(() => {
taxStub.restore(); // <label id="test.restore" />
});
it('์ธ๊ธ ์ ๋ณด๊ฐ ์์ผ๋ฉด ์ธ๊ธ ์ถ๊ฐ๋ฅผ ์๋ดํด์ผ ํ๋ค', () => {
// ์คํ
์ ์ฌ์ฉํ ์
taxStub.returns(null); // <label id="test.stub2" />
const item = { price: 30, location: 'Oklahoma' };
const user = 'Aaron Cometbus';
const message = formatPrice(user, item);
const expectedMessage = 'Aaron Cometbus๋์ ํฉ๊ณ ๊ธ์ก: $30 ๋ฐ ์ถ๊ฐ ์ธ๊ธ';
expect(message).toEqual(expectedMessage);
});
it('์ธ๊ธ ์ ๋ณด๊ฐ ์์ผ๋ฉด ์ธ๊ธ ๊ธ์ก์ ์๋ ค์ค์ผ ํ๋ค', () => {
taxStub.returns(0.1);
const item = { price: 30, location: 'Oklahoma' };
const user = 'Aaron Cometbus';
const message = formatPrice(user, item);
const expectedMessage = 'Aaron Cometbus๋์ ํฉ๊ณ ๊ธ์ก: $30 ๋ฐ ์ถ๊ฐ ์ธ๊ธ $3';
expect(message).toEqual(expectedMessage);
});
});
- ํ ์คํธ ์ฝ๋์ ์คํ์ด(spy), ๋ชจ์ ๊ฐ์ฒด, ์คํ ๊ณผ ๊ฐ์ ์ฌ๋ฌ ๊ฐ์ง ์ธ๋ถ ํฌํผ๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด, ์ฝ๋๊ฐ ๋ณต์กํ๊ณ ๊ฐํ๊ฒ ๊ฒฐํฉํด ์๋ค๋ ์ฆ๊ฑฐ๋ก ์ฝ๋๋ฅผ ๋จ์ํํด์ผ ํ๋ค.
- ์ด๋ด ๊ฒฝ์ฐ ์ธ๋ถ ํจ์๋ฅผ ์ธ์๋ก ์ ๋ฌํ๋๋ก ๋ฐ๊พธ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
- ์์กด์ฑ์ ์ธ์๋ก ์ ๋ฌํ๋ ๊ฒ์ ์์กด์ฑ ์ฃผ์ (dependency injection)์ด๋ผ๊ณ ํ๋ค.
- ์ฝ๋์ ๊ฒฐํฉ์ ์ ๊ฑฐํ๋ ค๋ฉด
getTaxInformation()
์ ์ธ์๋ก ์ ๋ฌํ๋ ๊ฒ๋ง์ผ๋ก ์ถฉ๋ถํ๋ค.
function formatPrice(user, { price, location }, getTaxInformation) {
const rate = getTaxInformation(location);
const taxes = rate ? `์ถ๊ฐ ์ธ๊ธ $${price * rate}` : '์ถ๊ฐ ์ธ๊ธ';
return `${user}๋์ ํจ๊ป ๊ธ์ก: $${price} ๋ฐ ${taxes}`;
}
export { formatPrice };
- ์์ ๊ฐ์ด ํ๋ฉด ์์กด์ฑ ์ฃผ์ ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์คํ ์ด ํ์ํ์ง ์๊ฒ ๋๋ค.
- ํน์ ํ ์
๋ ฅ๊ฐ์ ๋ฐ์
formatPrice()
๊ฐ ํน์ ํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋์ง ํ ์คํธํ๋ค.
import expect from 'expect';
import { formatPrice } from './test';
describe('๊ฐ๊ฒฉ ํ์', () => {
it('์ธ๊ธ ์ ๋ณด๊ฐ ์์ผ๋ฉด ์ธ๊ธ ์ถ๊ฐ๋ฅผ ์๋ดํด์ผ ํ๋ค', () => {
const item = { price: 30, location: 'Oklahoma' };
const user = 'Aaron Cometbus';
const message = formatPrice(user, item, () => null);
expect(message).toEqual('Aaron Cometbus๋์ ํฉ๊ณ ๊ธ์ก: $30 ๋ฐ ์ถ๊ฐ ์ธ๊ธ');
});
it('์ธ๊ธ ์ ๋ณด๊ฐ ์์ผ๋ฉด ์ธ๊ธ ๊ธ์ก์ ์๋ ค์ค์ผ ํ๋ค', () => {
const item = { price: 30, location: 'Oklahoma' };
const user = 'Aaron Cometbus';
const message = formatPrice(user, item, () => 0.1);
expect(message).toEqual('Aaron Cometbus๋์ ํฉ๊ณ ๊ธ์ก: $30 ๋ฐ ์ถ๊ฐ ์ธ๊ธ $3');
});
});
- ํ
์คํธ ๋์์ธ ํจ์์
expect
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ธ์๋ ์๋ฌด๊ฒ๋ ํ์ํ์ง ์๋ค. ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ๊ฐ ๋ ์ฌ์์ก๊ณ , ์ฝ๋๊ฐ ๋จ์ผ ์ฑ ์์ ๊ฐ๋๋ก ์ฑ ์์ ์ค์ด๋ ๋ฉด์์๋ ๋์ฑ ํจ๊ณผ์ ์ด๋ค. - ์ฝ๋์๋ ๋ช ๊ฐ์ง ๋ถ์ ํจ๊ณผ์ ์ ์ถ๋ ฅ์ด ์์ ์ ์๋ค. ์ด๋ฌํ ๋ถ๋ถ์ ์ต๋ํ ์ ๊ฒ ์ฌ์ฉํ๋ ๊ฒ์ด ํ ์คํธ ๊ฐ๋ฅํ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฌ์์ด๋ค.
- ๋ง์ฝ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ด๋ ต๋ค๋ฉด ์ฝ๋๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ ํ ์คํธ์์ ๋ฐ์ํ๋ ๋ค๋ฅธ ๋ฌธ์
๐ฏ ํ์ดํ ํจ์๋ก ๋ณต์ก๋๋ฅผ ๋ฎ์ถฐ๋ผ.โ
- ์๋์ ์ฝ๋๋ฅผ ํ์ดํ ํจ์๋ก ๋ณ๊ฒฝํด ๋ณด์.
const myinfo = {
first: 'seungmin',
last: 'sa',
city: 'Daejoen',
state: 'still studying'
};
// ํด์ฒด ํ ๋น ์ฌ์ฉ
function getName({ first, last }) {
return `${first} ${last}`;
}
- ๋งค๊ฐ๋ณ์์์ ํด์ฒด ํ ๋น, ๋๋จธ์ง ๋งค๊ฐ๋ณ์, ๋งค๊ฐ๋ณ์ ๊ธฐ๋ณธ๊ฐ ๋ฑ์ ์ฌ์ฉํ๋ ํน๋ณํ ๋งค๊ฐ๋ณ์์ ๊ฒฝ์ฐ์๋ ๊ดํธ๋ฅผ ํฌํจํด์ผ ํ๋ค.
- ๊ดํธ๊ฐ ์์ผ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ฒด ์ ์ธ์ด ์๋๋ผ ํจ์ ์ ์ธ์ ํ๋ค๋ ๊ฒ์ ์ ์์ง ๋ชปํ๋ค.
const getName = { first, last } => `${first} ${last}`;
// Uncaught SyntaxError: Malformed arrow function parameter list
// ์๋ชป๋ ํ์ดํ ํจ์ ๋งค๊ฐ๋ณ์ ๋ชฉ๋ก
const getName = ({ first, last }) => `${first} ${last}`;
getName(myinfo);
// "seungmin sa"
- ํ์ดํ ํจ์์์ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ๊ฒฝ์ฐ์
return
๋ฌธ์ ์๋ตํ๋ค๋ฉด ํ์ดํ ํจ์์์ ํ์ดํ ์ฐ์ธก์ ์๋ ์ค๊ดํธ๋ ๊ฐ์ฒด๋ฅผ ๋ํ๋ด๋ ๊ฒ์ธ์ง, ์๋๋ฉด ํจ์ ๋ชธ์ฒด๋ฅผ ๊ฐ์ธ๋ ๊ฒ์ธ์ง ๊ตฌ๋ถํ๊ธฐ ์ด๋ ต๋ค. - ๋ฐ๋ผ์ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ๊ฒฝ์ฐ์๋ ๊ฐ์ฒด๋ฅผ ๊ดํธ๋ก ๊ฐ์ธ์ผ ํ๋ค.
const getName = ({ first, last }) => ({ fullName: `${first} ${last}` });
getName(myinfo);
// {fullName: ""seungmin sa""}
- ๊ดํธ๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ ๋ฐํํ ๋๋ ์ฝ๋๋ฅผ ์ฌ๋ฌ ์ค์ ๊ฑธ์ณ ์์ฑํ ์ ์๋ค.
return
๋ฌธ์ ์๋ตํ๋ ๋์์ ๋ฐํ๊ฐ์ ์ฌ๋ฌ ์ค๋ก ์์ฑํ ์ ์๋ค.
const getNameAndLocation = ({ first, last, city, state }) => ({
fullName: `${first} ${last}`,
location: `${city} ${state}`,
});
getNameAndLocation(myinfo);
// {fullName: "seungmin sa", location: "Daejoen still studying"}
- ํ์ดํ ํจ์๋ ๋ค๋ฅธ ํจ์๋ฅผ ๋ฐํํ๋ ํจ์์ธ ๊ณ ์ฐจ ํจ์(Higher-Order Function)๋ฅผ ๋ง๋๋ ๋ฐ ์ข๋ค.
const discounter = discount => {
return price => {
return price * (1 - discount);
};
};
const tenPercentOff = discounter(0.1);
tenPercentOff(100);
// 90
- return ์์ด ์ค๊ดํธ ์์ด ํจ์๋ฅผ ๋ฐํํ ์ ์๋ค.
const discounter = discount => price => price * (1 - discount);
const tenPercentOff = discounter(0.1);
tenPercentOff(100);
// 90
- ๊ณ ์ฐจ ํจ์๋ ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ๋๋ ๋ฐ ์ฌ์ฉํ ์ ์์ ๋ฟ๋ง ์๋๋ผ, ๋ฐฐ์ด ๋ฉ์๋์ ๋๋จธ์ง ๋งค๊ฐ๋ณ์์๋ ๋์์ ์ค ์ ์๋ค.
- ์๋ ๋ฐฉ๋ฒ์ ๊ณ ์ฐจ ํจ์๋ฅผ ๋ ๊ฐ์ ๋ค๋ฅธ ๋งค๊ฐ๋ณ์ ์งํฉ์ ๊ฐ์ง ๋จ์ผ ํจ์๋ก ๋ณํํ ๋ ํ์์ ์ผ๋ก ์ฌ์ฉํ๋ค.
discounter(0,1)(100);
// 90
๐ฏ ๋ถ๋ถ ์ ์ฉ ํจ์๋ก ๋จ์ผ ์ฑ ์ ๋งค๊ฐ๋ณ์๋ฅผ ๊ด๋ฆฌํ๋ผ.โ
- ๊ณ ์ฐจ ํจ์๋ ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ๋๋ ๋ฐฉ๋ฒ์ ํตํด ํน๋ณํ ๊ฐ์ ์ ๊ณตํ๋ฏ๋ก, ๋์ค์ ์๋์ ์ธ์์ ์ ๊ทผํ ์ ์๊ฒ ํด๋๊ณ ํจ์ ์คํ์ ๋ง์น ์ ์๋ค.
- ๋ํ, ๋งค๊ฐ๋ณ์๋ฅผ ๋ถ๋ฆฌํด ํจ์์ ์๋๋ฅผ ๋ช ํํ๊ฒ ์ ์งํ ์ ์๋ค.
- **๋ถ๋ถ ์ ์ฉ ํจ์(partially applied function)**๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ, ์ผ๋ถ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌํ๋ฉด ํด๋น ๋งค๊ฐ๋ณ์๋ฅผ ์ ๊ทธ๋ ํจ์๊ฐ ๋ฐํ๋์ด ์ฌ๊ธฐ์ ๋ ๋ง์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
- ์ฆ, ๋ถ๋ถ ์ ์ฉ ํจ์๋ฅผ ์ด์ฉํ๋ฉด ํ ๋ฒ์ ์ ๋ฌํด์ผ ํ ํจ์ ์ธ์์ ์๊ฐ ์ค์ด๋๋ ๋์ ์ธ์๋ฅผ ๋ ์ ๋ฌํด์ผ ํ๋ ๋ค๋ฅธ ํจ์๋ฅผ ๋ฐํํ๋ค.
- ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์๋ก ๋ ๋ฆฝ์ ์ธ ์ฌ๋ฌ ๋งค๊ฐ๋ณ์ ์งํฉ์ ๋ ์ ์๋ค. (๋จ์ผ ์ฑ ์์ ์ง๊ฒ ๋๋ค.)
- ๋ค์์ ์์ ๊ฐ์ฒด ์ ๋ณด์ด๋ค.
const building = {
hours: '8 a.m. - 8 p.m.',
address: 'Jayhawk Blvd',
};
const manager = {
name: 'Augusto',
phone: '555-555-5555',
};
const program = {
name: 'Presenting Research',
room: '415',
hours: '3 - 6',
};
const exhibit = {
name: 'Emerging Scholarship',
contact: 'Dyan',
};
- ์๋๋
building
,manager
,program
๋๋exhibit
์ ์ธ ๊ฐ์ง ์ธ์๋ฅผ ๋ฐ์ ํ๋์ ์ ๋ณด ์งํฉ์ผ๋ก ๊ฒฐํฉํ๋ ํจ์์ด๋ค.
function mergeProgramInfomation(building, manager, event) {
const { hours, address } = building;
const { name, phone } = manager;
const defaults = {
hours,
address,
contact: name,
phone,
};
return { ...defaults, ...event };
}
- ์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด, ํจ์๋ฅผ ํธ์ถํ ๋๋ง๋ค ์ ๋ฌํ๋ ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ building์ผ๋ก ํญ์ ๋์ผํ๋ค. ์ด ํจ์๋ฅผ ๋ฐ๋ณตํด์ ํธ์ถํ๊ณ ์๋ค.
- ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ด๋ฐ ๋ฐ๋ณต์ ํจ์๊ฐ ์์ฐ์ค๋ฝ๊ฒ ๋ถ๋ฆฌ๋ ์ ์๋ค๋ ๊ฒ์ด๋ค.
const programInfo = mergeProgramInfomation(building, manager, program);
const exhibitInfo = mergeProgramInfomation(building, manager, exhibit);
- ์ ์ฝ๋๋ฅผ ๊ณ ์ฐจ ํจ์๋ฅผ ์ด์ฉํด์ ๋จ์ผ ์ฑ ์ ๋งค๊ฐ๋ณ์๋ฅผ ๋ง๋ค๋ฉด ์์ ์์นํ ๋ ๊ฐ์ ์ธ์๋ฅผ ์ฌ์ฌ์ฉํ ์ ์๋ค.
- ์ธ๋ถ ํจ์๋ ๋งค๊ฐ๋ณ์๋ก
building
๊ณผmanager
๋ง ๊ฐ๊ณ , ์ด ํจ์๋ฅผ ์คํํ๋ฉด ๋งค๊ฐ๋ณ์๋กprogram
ํ๋๋ง ์ฌ์ฉํ๋ ํจ์๋ฅผ ๋ฐํํ๋๋ก ๋ง๋ค์ด์ผ ํ๋ค.
function mergeProgramInfomation(building, manager) {
const { hours, address } = building;
const { name, phone } = manager;
const defaults = {
hours,
address,
contact: name,
phone,
};
return program => {
return { ...defaults, ...program };
}
}
- ๋ค์๊ณผ ๊ฐ์ด ํธ์ถํ ์ ์๋ค.
const programInfo = mergeProgramInfomation(building, manager)(program);
// {
// address: "Jayhawk Blvd",
// contact: "Augusto",
// hours: "3 - 6",
// name: "Presenting Research",
// phone: "555-555-5555",
// room: "415",
// }
const exhibitInfo = mergeProgramInfomation(building, manager)(exhibit);
// {
// address: "Jayhawk Blvd",
// contact: "Dyan",
// hours: "8 a.m. - 8 p.m.",
// name: "Emerging Scholarship",
// phone: "555-555-5555",
// }
- ๋งค๊ฐ๋ณ์์ ๋จ์ผ ์ฑ ์์ ๋ถ์ฌํ๊ธฐ๋ ํ์ง๋ง ๋ฐ๋ณต๊น์ง ์ ๊ฑฐ๋์ง๋ ๋ชปํ๊ธฐ ๋๋ฌธ์ ๋ถ๋ถ ์ ์ฉ์ ์ฌ์ฉํ๋ฉด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค. (๋ค์ ํ์์)
- ๋ถ๋ถ ์ ์ฉ๊ณผ ๊ณ ์ฐจ ํจ์๋ฅผ ์ฌ์ฉํด ๋งค๊ฐ๋ณ์์ ๋จ์ผ ์ฑ ์์ ๋ถ์ฌํ๋ ๋ฐ๋ ๋๋จธ์ง ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
- ๋ฐฐ์ด์ ๋ฐ์ดํฐ๊ฐ ์๊ฑฐ๋ ์๋ณธ ๋ฐ์ดํฐ์ ์ผ๋์ผ๋ก ๋์๋๋ ์ถ๊ฐ ๋ฐ์ดํฐ๊ฐ ์๋ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ฉด ์ข๋ค.
const birds = ['meadowlark', 'robin', 'roadrunner'];
const zip = (...left) => (...right) => {
return left.map((item, i) => [item, right[i]]);
};
zip('kansas', 'wisconsin', 'new mexico')(...birds);
// [
// ["kansas", "meadowlark"],
// ["wisconsin", "robin"],
// ["new mexico", "roadrunner"]
// ]
๐ฏ ์ปค๋ง๊ณผ ๋ฐฐ์ด ๋ฉ์๋๋ฅผ ์กฐํฉํ ๋ถ๋ถ ์ ์ฉ ํจ์๋ฅผ ์ฌ์ฉํ๋ผ.โ
- ์ด์ ๊ณ ์ฐจ ํจ์์ ๋ถ๋ถ ์ ์ฉ์ ์ด์ฉํด ๋งค๊ฐ๋ณ์์ ๋จ์ผ ์ฑ ์์ ๋ถ์ฌํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๊ด๋ จ์ด ์๋ ๋งค๊ฐ๋ณ์๋ก ์ธํ ๋ฌธ์ ๋ ํด๊ฒฐํ์ง๋ง, ๊ฐ์ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ๋ณตํด์ ์ฌ์ฉํ๋ ๋ฌธ์ ๋ ํด๊ฒฐํ ์ ์์๋ค.
- ๊ณ ์ฐจ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ ํ ๋ฒ ์ ์ฅํ ํ ๋์ค์ ์ฌ์ฉํ ์ ์๋ ์๋ก์ด ํจ์๋ฅผ ๋ง๋ค์ด์ ๋ฐ๋ณต์ ํผํ ์ ์๋ค.
- ๊ณ ์ฐจ ํจ์์์ ๋ฐํ๋ ํจ์๋ ๋ฐ๋ก ๋ค์ ํธ์ถํ ํ์๊ฐ ์๋ค. ๊ณ ์ฐจ ํจ์๋ฅผ ํ ๋ฒ ํธ์ถํ๋ฉด ๊ณ์ํด์ ์ฌ์ฉํ ์ ์๋ ์๋ก์ด ํจ์๊ฐ ๋ฐํ๋๊ธฐ ๋๋ฌธ์ด๋ค.
- ๋ง์น ์ธ์๋ฅผ ํ๋ ์ฝ๋ฉํด๋ ํจ์๋ฅผ ์์ฑํ๋ ๊ฒ๊ณผ ๊ฐ๋ค.
- ์ด์ ์ ์ฌ์ฉํ๋ ์์ ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ๋ค.
const setStrongHallProgram = mergeProgramInfomation(building, manager);
const programInfo = setStrongHallProgram(program);
const exhibitInfo = setStrongHallProgram(exhibit);
- ๊ณ ์ฐจ ํจ์๋ฅผ ์ด์ฉํ๋ฉด ๋งค๊ฐ๋ณ์๋ฅผ ๋ณ๋๋ก ๋ถ๋ฆฌํ ์ ์๋ค. ๊ทธ๋ ์ง๋ง ํจ์๋ฅผ ์์ ํ ๋ถ๋ฆฌํ๊ธฐ ์ ์ ํจ์์ ํ์ํ ์ธ์์ ์๋ฅผ ์ค์ผ ์ ์๋๋ก ์ธ์๋ฅผ ๋ถ๋ฆฌํ๋ ๊ฒ์ด ํจ์ฌ ๋ ์ข๋ค.
- ํ ๋ฒ์ ์ธ์๋ฅผ ํ๋๋ง ๋ฐ๋ ํจ์๋ฅผ ์ปค๋ง(currying) ์ด๋ผ๊ณ ํ๋ฉฐ, ์ด๋ ํ๋์ ์ธ์๋ง ์ ๋ฌํ๋ ๋ฉ์๋๋ฅผ ๋ค๋ฃฐ ๋ ๋งค์ฐ ์ ์ฉํ๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ๋ ์์ํ ํํ์ ์ปค๋ง์ ์๋ฒฝํ๊ฒ ์ง์ํ์ง๋ ์์ง๋ง, ๋ถ๋ถ ์ ์ฉ์ ์ด์ฉํด์ ์ผ๋ จ์ ๋จ์ผ ๋งค๊ฐ๋ณ์๋ก ๋งค๊ฐ๋ณ์ ์ซ์๋ฅผ ์ค์ด๋ ๋ฐฉ๋ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
๐ ์ปค๋ง๊ณผ ๋ถ๋ถ ์ ์ฉโ
- ๋ถ๋ถ ์ ์ฉ(partial application) ํจ์๋ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ๋ฌ ๋ฒ ๋ฐ์ ์ ์๋ค.
- ๋ถ๋ถ ์ ์ฉ ํจ์์ ์ปค๋ง ํจ์๋ ๋ชจ๋ ์๋๋ณด๋ค ํ์ํ ์ธ์์ ์๊ฐ ์ ์ ํจ์๋ฅผ ๋ฐํํด ์ธ์ ์๋ฅผ ์ค์ผ ์ ์๋ค.
- ํจ์์๋ ํจ์๊ฐ ๋ฐ์ ์ ์๋ ์ ์ฒด ์ธ์์ ์๊ฐ ์์ผ๋ฉฐ ํญ์๋ผ๊ณ ๋ถ๋ฅธ๋ค.
- ๋ถ๋ถ ์ ์ฉ ํจ์๋ ์๋์ ํจ์๋ณด๋ค ํญ์๊ฐ ์ ์ ํจ์๋ฅผ ๋ฐํํ๋ค. ์ธ์๊ฐ ์ด ์ธ ๊ฐ ํ์ํ ๊ฒฝ์ฐ์ ํจ์๋ ์ธ ๊ฐ์ ์ธ์๊ฐ ํ์ํ์ง๋ง, ์ฌ๊ธฐ์ ๋ถ๋ถ ์ ์ฉ ํจ์๋ฅผ ์ด์ฉํ๋ฉด ํญ์๊ฐ ํ๋์ธ ํจ์๋ฅผ ๋ฐํํ๋ค.
- ๋ฐ๋ฉด ์ปค๋ง ํจ์๋ ์ฌ๋ฌ ๊ฐ์ ์ธ์๋ฅผ ๋ฐ๋ ํจ์์์ ์ ํํ ์ธ์ ํ๋๋ง ๋ฐ๋ ์ผ๋ จ์ ํจ์๋ฅผ ๋ฐํํ ๋ ์ฌ์ฉํ๋ค. ๊ฐ๋ น ์ธ์ ์ธ ๊ฐ๊ฐ ํ์ํ ํจ์๊ฐ ์๋ค๋ฉด, ๋จผ์ ์ธ์ ํ๋๋ฅผ ๋ฐ๋ ๊ณ ์ฐจ ํจ์๊ฐ ๋ค๋ฅธ ํจ์๋ฅผ ๋ฐํํ๊ณ , ๋ฐํ๋ ํจ์๋ ์ธ์ ํ๋๋ฅผ ๋ฐ๋๋ค. ์ด ํจ์์์ ๋์ผ๋ก ์ธ์ ํ๋๋ฅผ ๋ฐ๋ ๋ง์ง๋ง ํจ์๊ฐ ๋ฐํ๋๋ค.
- ๋ค์ ๊ฐ์ฒด ๋ฐฐ์ด ์์ ๋ฅผ ์ฌ์ฉํด ๋ณด์.
const dogs = [
{
์ด๋ฆ: '๋งฅ์ค',
๋ฌด๊ฒ: 10,
๊ฒฌ์ข
: '๋ณด์คํดํ
๋ฆฌ์ด',
์ง์ญ: '์์ค์ฝ์ ',
์์: '๊ฒ์ ์',
},
{
์ด๋ฆ: '๋๋',
๋ฌด๊ฒ: 90,
๊ฒฌ์ข
: '๋ ๋ธ๋ผ๋๋ ํธ๋ฆฌ๋ฒ',
์ง์ญ: '์บ์์ค',
์์: '๊ฒ์ ์',
},
{
์ด๋ฆ: '์๋',
๋ฌด๊ฒ: 40,
๊ฒฌ์ข
: '๋ํธ๋ผ๋๋ ํธ๋ฆฌ๋ฒ',
์ง์ญ: '์์ค์ฝ์ ',
์์: '๊ฐ์',
},
]
- ์๋ ์ฝ๋๋ ๊ฐ์์ง ๋ฐฐ์ด๊ณผ ํํฐ ์กฐ๊ฑด์ ์ธ์๋ก ๋ฐ์ ํ ํํฐ๋ง ์กฐ๊ฑด์ ๋ง๋ ๊ฐ์์ง์ ์ด๋ฆ๋ง ๋ชจ์์ ๋ฐํํ๋ ํจ์์ด๋ค.
function getDogNames(dogs, filter) {
const [key, value] = filter;
return dogs
.filter(dog => dog[key] === value)
.map(dog => dog['์ด๋ฆ']);
}
getDogNames(dogs, ['์์', '๊ฒ์ ์']); // ["๋งฅ์ค", "๋๋"]
- ์ ์ฝ๋๋ ๋ ๊ฐ์ง ๋ฌธ์ ๊ฐ ์๋ค.
- ์ฒซ์งธ, ํํฐ ํจ์์ ์ ์ฝ์ด ์๋ค. ํํฐ ํจ์๋ ํํฐ์ ๊ฐ๊ฐ์ ๊ฐ์์ง๋ฅผ ์ ํํ๊ฒ ๋น๊ตํ ๋๋ง ์ ์์ ์ผ๋ก ์๋ํ๋ค.
- ๋์งธ, ๋ชจ๋ ๋ฐฐ์ด ๋ฉ์๋์ ๋ง์ฐฌ๊ฐ์ง๋ก
map()
์ ๊ฒ์ฌํ๋ ํญ๋ชฉ๋ง ์ธ์๋ก ๋ฐ์ ์ ์๊ธฐ ๋๋ฌธ์ ์ ํจ ๋ฒ์ ๋ด์ ๋ค๋ฅธ ๋ณ์๋ค์ ๊ฐ์ ธ์ฌ ๋ฐฉ๋ฒ์ด ํ์ํ๋ค.map()
์ ๋ค๋ฅธ ํจ์ ๋ด๋ถ์ ํจ์์ด๋ฏ๋ก ์ด๋ฅผ ๊ฐ์ธ๊ณ ์๋ ํจ์์ ๋ณ์์ ์ ๊ทผํ ์ ์๋ค. ์ฆ, ๋งค๊ฐ๋ณ์๋ฅผ ์ด์ฉํด์ ์ธ๋ถ ํจ์์ ํ์ํ ๋ณ์๋ฅผ ์ ๋ฌํ ๋ฐฉ๋ฒ์ด ํ์ํ๋ค. - ์ฒซ ๋ฒ์งธ ๋ฌธ์ ๋ ๋น๊ต ํจ์๋ฅผ ํ๋ ์ฝ๋ฉํ์ง ์๊ณ ํํฐ ํจ์์ ์ฝ๋ฐฑ ํจ์๋ก ์ ๋ฌํ์ฌ ํด๊ฒฐ ํ ์ ์๋ค.
function getDogNames(dogs, filterFunc) {
return dogs
.filter(filterFunc)
.map(dog => dog['์ด๋ฆ'])
}
getDogNames(dogs, dog => dog['๋ฌด๊ฒ'] < 20);
// ["๋งฅ์ค"]
- ํ์ง๋ง ์ซ์
20
๊ณผ ๊ฐ์ ๊ฐ์ ํ๋ ์ฝ๋ฉํ๊ณ ์๋ค. ์ฆ, ๋ณ์๋ฅผ ์ฌ์ฉํ ๋ ์ง์ ์ฝ๋ฉํด์ ๋ฃ๊ฑฐ๋ ์ ํจ ๋ฒ์์ ์ถฉ๋์ด ์๋์ง ํ์ธํ๋ ์ ์ฐจ๋ฅผ ๊ฑฐ์น๊ณ ์๋ค. - ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ถ๋ถ ์ ์ฉ ํจ์๋ฅผ ๋ณ์์ ํ ๋นํด์ ๋ค๋ฅธ ํจ์์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๋๋จธ์ง ์ธ์๋ฅผ ์ ๊ณตํ ์ ์๋ค.
- ์ด๋ ๊ฒ ํ๋ฉด ์๋ก ๋ค๋ฅธ ๋ฌด๊ฒ๋ฅผ ๊ธฐ์ค์ผ๋ก ํด๋ ๊ณ์ํด์ ํจ์๋ฅผ ์ฌ์ฌ์ฉํ ์ ์๋ค.
- ์ ํจ ๋ฒ์ ์ถฉ๋์ด ๋ฐ์ํ ๊ฐ๋ฅ์ฑ๋ ๊ฑฐ์ ์๋ค.
const weightCheck = weight => dog => dog['๋ฌด๊ฒ'] < weight;
getDogNames(dogs, weightCheck(20));
// ["๋งฅ์ค"]
getDogNames(dogs, weightCheck(50));
// ["๋งฅ์ค", "์๋"]
- ์ปค๋ง ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ์ง์ ์์ ๋ค์ํ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌํ ์ ์๋ค. ๋ํ, ํจ์๋ฅผ ๋ฐ์ดํฐ๋ก ์ ๋ฌํ ์๋ ์๋ค.
- ์ค์ํ ๋ถ๋ถ์ ๋ฐ๋์ ๋ ๊ฐ์ ํจ์์ ๋ ๊ฐ์ ์ธ์ ์งํฉ์ผ๋ก ์ ํํ ํ์๊ฐ ์๋ค๋ ์ ์ผ๋ก ์ปค๋ง์ ์ฌ์ฉํด ์๋์ ๋น๊ต ํจ์๋ฅผ ๋ค์ ์์ฑํ ์ ์๋ค.
const identity = field => value => dog => dog[field] === value;
const colorCheck = identity('์์');
const stateCheck = identity('์ง์ญ');
getDogNames(dogs, colorCheck('๊ฐ์'));
// ["์๋"]
getDogNames(dogs, stateCheck('์บ์์ค'));
// ["์๋"]
- ํน์ ํ ์๊ตฌ ์ฌํญ์ด ์๋ ํจ์๋ฅผ ๊ฐ์ ธ์์ ์ฌ๋ฌ ๊ฐ์ง ๋ค๋ฅธ ๋น๊ต๋ฅผ ํ ์ ์๋๋ก ์ถ์ํ๋ฅผ ๋ง๋ค ์ ์๋ค.
- ๋ถ๋ถ ์ ์ฉ ํจ์๋ฅผ ๋ณ์์ ํ ๋นํ ์ ์๊ณ , ์ด ๋ณ์๋ฅผ ๋ฐ์ดํฐ๋ก ์ ๋ฌํ ์๋ ์๋ค
- ์ฆ, ๊ฐ๋จํ ๋๊ตฌ ๋ชจ์์ ์ฌ์ฉํด์ ๋งค์ฐ ์ ๊ตํ๊ฒ ๋น๊ตํ ์ ์๋ค.
function allFilters(dogs, ...checks) {
return dogs
.filter(dog => checks.every(check => check(dog)))
.map(dog => dog['์ด๋ฆ']);
}
allFilters(dogs, colorCheck('๊ฒ์ ์'), stateCheck('์บ์์ค'));
// ["๋๋"]
function anyFilters(dogs, ...checks) {
return dogs
.filter(dog => checks.some(check => check(dog)))
.map(dog => dog['์ด๋ฆ']);
}
anyFilters(dogs, weightCheck(20), colorCheck('๊ฐ์'));
// ["๋งฅ์ค", "์๋"]
๐ฏ ํ์ดํ ํจ์๋ก ๋ฌธ๋งฅ ํผ๋์ ํผํ๋ผ.โ
- ๋ฌธ๋งฅ์ ํจ์ ๋๋ ํด๋์ค์์
this
ํค์๋๊ฐ ์ฐธ์กฐํ๋ ๊ฒ์ด๊ธฐ๋ ํ๋ค. - ์ ํจ ๋ฒ์์ ๋ฌธ๋งฅ์ ํ์ ํ๊ธฐ๊ฐ ์ด๋ ต๊ธฐ๋ ํ์ง๋ง, ํผ๋ํ๋ ๊ฐ๋ ์ด๊ธฐ๋ ํ๋ค.
- ์ ํจ ๋ฒ์(scope)๋ ํจ์์ ์ฐ๊ด๋์ด ์๊ณ , ๋ฌธ๋งฅ(context)์ ๊ฐ์ฒด์ ์ฐ๊ด๋์ด ์๋ค๋ ๊ฒ์ด๋ค.
const validator = {
message: '๋ ์ ํจํ์ง ์์ต๋๋ค.',
setInvalidMessage(field) {
return `${field}${this.message}`;
},
};
validator.setInvalidMessage('๋์');
// ๋์๋ ์ ํจํ์ง ์์ต๋๋ค.
- ์ ์์ ์ฝ๋์์
this.message
๋ ํด๋น ๊ฐ์ฒด์ ์์ฑ์ ์ฐธ์กฐํ๋ค. - ์ด๋ ๊ฒ ์๋ํ๋ ์ด์ ๋ ๊ฐ์ฒด์์
setInvalidMessage()
๋ฉ์๋๊ฐ ํธ์ถ๋ ๋ ํจ์์์this
๋ฐ์ธ๋ฉ์ ์์ฑํ๋ฉด์ ํด๋น ํจ์๊ฐ ๋ด๊ธด ๊ฐ์ฒด๋ ๋ฌธ๋งฅ(context)์ ํฌํจ์ํค๊ธฐ ๋๋ฌธ์ด๋ค. - ๊ฐ์ฒด์์
this
๋ฅผ ๋ค๋ฃฐ ๋๋ ์ผ๋ฐ์ ์ผ๋ก ํฐ ๋ฌธ์ ๊ฐ ์์ง๋ง, ๊ฐ์ฒด์ ๋ด๊ธด ํจ์๋ฅผ ๋ค๋ฅธ ํจ์์ ์ฝ๋ฐฑ ํจ์๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ์ฃผ์๊ฐ ํ์ํ๋ค. - ์๋ฅผ ๋ค์ด
setTimeout()
,setInterval()
๋ฉ์๋๋map()
,filter()
๋ฉ์๋ ๋ฑ ์์ฃผ ์ฌ์ฉํ๋ ๋ฐฐ์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค. - ์ด ํจ์๋ค์ ์ฝ๋ฐฑ ํจ์๋ฅผ ๋ฐ์ผ๋ฉด์ ์ฝ๋ฐฑ ํจ์์ ๋ฌธ๋งฅ๋ ๋ณ๊ฒฝํ๋ค.
const validator = {
message: '๋ ์ ํจํ์ง ์์ต๋๋ค.',
setInvalidMessages(...fields) {
return fields.map(function (field) {
return `${field}${this.message}`;
});
},
};
- ์ฌ๊ธฐ์ ๋ฌธ์ ๋ ํจ์๋ฅผ ํธ์ถํ๋ฉด
TypeError
๋๋undefined
๋ฅผ ๋ฐ๋๋ค๋ ๊ฒ์ด๋ค.
validator.setInvalidMessages('๋์');
// ["๋์undefined"]
- ํจ์๋ฅผ ํธ์ถํ ๋๋ง๋ค ํธ์ถ๋๋ ์์น๋ฅผ ๋ฐํ์ผ๋ก
this
๋ฐ์ธ๋ฉ์ ๋ง๋ ๋ค. - ์ฒ์ ์์ฑํ๋
setInvalidMessage()
๋ ๊ฐ์ฒด๋ฅผ ๋ฌธ๋งฅ์ผ๋ก ํด์ ํธ์ถ๋์์ง๋ง, ์ฌ๊ธฐ์๋this
์ ๋ฌธ๋งฅ์ด ํด๋น ๊ฐ์ฒด์๋ค. map()
๋ฉ์๋์ ์ฝ๋ฐฑ ํจ์๋ก ์ ๋ฌํ ๊ฒฝ์ฐ์๋map()
๋ฉ์๋์ ๋ฌธ๋งฅ์์ ํธ์ถ๋๋ฏ๋ก ์ด ๊ฒฝ์ฐ์๋this
๋ฐ์ธ๋ฉ์ดvalidator
๊ฐ์ฒด๊ฐ ์๋๋ค.- ์ด๋์ ๋ฌธ๋งฅ์ ์ ์ญ ๊ฐ์ฒด๊ฐ ๋๋ค. ๋ธ๋ผ์ฐ์ ์์๋
window
๊ฐ, Node.js REPL ํ๊ฒฝ์์๋global
์ด ๋๋ค. - ์ฆ, ์ฝ๋ฐฑ ํจ์๋ก ์ ๋ฌ๋๋ฉด
message
์์ฑ์ ์ ๊ทผํ ์ ์๊ฒ ๋๋ค. - ํ์ดํ ํจ์๋ฅผ ์ด์ฉํ๋ฉด ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
- ํ์ดํ ํจ์๋ ํจ์๋ฅผ ํธ์ถํ ๋
this
๋ฐ์ธ๋ฉ์ ์๋ก ๋ง๋ค์ง ์๊ธฐ ๋๋ฌธ์, ํ์ดํ ํจ์๋ฅผ ์ด์ฉํด์map()
์ฝ๋ฐฑ์ ๋ค์ ์์ฑํ๋ฉด ์๋๋๋ก ์๋ํ๊ฒ ๋๋ค.
const validator = {
message: '๋ ์ ํจํ์ง ์์ต๋๋ค.',
setInvalidMessages(...fields) {
return fields.map(field => {
return `${field}${this.message}`;
});
},
};
validator.setInvalidMessages('๋์');
// ["๋์๋ ์ ํจํ์ง ์์ต๋๋ค."]
- ๊ทธ๋ ์ง๋ง
this
๋ฌธ๋งฅ(context)์ ์ง์ ์ค์ ํด์ผ ํ ๋๋ ์๋ค. - ์๋ฅผ ๋ค์ด ๋ค์ ์์ ์ฝ๋์ฒ๋ผ ์๋์
setInvalidMessages()
๋ฉ์๋๋ฅผ ๋ช ๋ช ๋ ๋ฉ์๋๊ฐ ์๋๋ผ ์์ฑ์ ํ ๋นํ ํ์ดํ ํจ์๋ก ์์ฑํ ๊ฒฝ์ฐ์๋ ์ด๋ป๊ฒ ํด์ผ ํ ๊น??
const validator = {
message: '๋ ์ ํจํ์ง ์์ต๋๋ค.',
setInvalidMessages: field => `${field}${this.message}`,
};
validator.setInvalidMessages('๋์');
// "๋์undefined"
- ์ด ๊ฒฝ์ฐ์๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค. ํ์ฌ ๊ฐ์ฒด์ ๋ํด ์๋ก์ด
this
๋ฌธ๋งฅ ๋ฐ์ธ๋ฉ์ ๋ง๋ค์ง ์์๋ค. - ์๋ก์ด ๋ฌธ๋งฅ์ ๋ง๋ค์ง ์์๊ธฐ ๋๋ฌธ์ ์ ์ญ ๊ฐ์ฒด์ ๋ฐ์ธ๋ฉ ๋ ๊ฒ์ด๋ค.
- ์ ๋ฆฌํ๋ฉด ํ์ดํ ํจ์๋ ์ด๋ฏธ ๋ฌธ๋งฅ์ด ์๊ณ ๋ค๋ฅธ ํจ์ ๋ด๋ถ์์ ์ด ํจ์๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ ๋ ์ ์ฉํ๋ค.