3์ฅ ํจ์
์ด๋ค ํ๋ก๊ทธ๋จ์ด๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋จ์๋ ํจ์์ด๋ค.
์๋๋ฅผ ๋ถ๋ช ํ ํํํ๋ ํจ์๋ ์ด๋ป๊ฒ ๊ตฌํํ ์ ์์๊น?
ํจ์์ ์ด๋ค ์์ฑ์ ๋ถ์ฌํด์ผ ์ฒ์ ์ฝ๋ ์ฌ๋์ด ํ๋ก๊ทธ๋จ ๋ด๋ถ๋ฅผ ์ง๊ด์ ์ผ๋ก ํ์ ํ ์ ์์๊น?
1. ์๊ฒ ๋ง๋ค์ด๋ผ
ํจ์๋ฅผ ๋ง๋๋ ์ฒซ์งธ ๊ท์น์ `์๊ฒ`์ด๋ค.
์ผ๋ฐ์ ์ผ๋ก 5์ค ์ด๋ด๋ก ์ค์ฌ์ผ ๋ง๋ ํ๋ค.
2. ๋ธ๋ก๊ณผ ๋ค์ฌ์ฐ๊ธฐ
if ๋ฌธ, else, ๋ฌธ, while๋ฌธ ๋ฑ์ ๋ค์ด๊ฐ๋ ๋ธ๋ก์ ํ ์ค์ด์ด์ผ ํ๋ค.
๋๊ฒ ๊ฑฐ๊ธฐ์ ํจ์๋ฅผ ํธ์ถํ๋ค.
3. ํ ๊ฐ์ง๋ง ํด๋ผ
ํจ์๋ ํ ๊ฐ์ง๋ง์ ์ํด์ผ ํ๋ค.
ํ ๊ฐ์ง ์์ ๋ง ํ๋ ํจ์๋ ์์ฐ์ค๋ฝ๊ฒ ์น์ ์ผ๋ก ๋๋๊ธฐ ์ด๋ ต๋ค.
4. ํจ์ ๋น ์ถ์ํ ์์ค์ ํ๋๋ก
- ํจ์๊ฐ ํ์คํ ํ ๊ฐ์ง ์์ ๋ง ํ๋ ค๋ฉด ํจ์ ๋ด ๋ชจ๋ ๋ฌธ์ฅ์ ์ถ์ํ ์์ค์ด ๋์ผํด์ผ ํ๋ค.
- ํ ํจ์ ๋ด์ ์ถ์ํ ์์ค์ ์์ผ๋ฉด ์ฝ๋๋ฅผ ์ฝ๋ ์ฌ๋์ด ํท๊ฐ๋ฆด ์ ์๋๋ฐ, ํน์ ํํ์ด ๊ทผ๋ณธ ๊ฐ๋ ์ธ์ง ์๋๋ฉด ์ธ๋ถ์ฌํญ์ธ์ง ๊ตฌ๋ถํ๊ธฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์ด๋ค.
- ๋ด๋ ค๊ฐ๊ธฐ ๊ท์น(์์์ ์๋๋ก ์ฝ๋ ์ฝ๊ธฐ): ํ ํจ์ ๋ค์์๋ ์ถ์ํ ์์ค์ด ํ ๋จ๊ณ ๋ฎ์ ํจ์๊ฐ ์จ๋ค. ์ฆ, ์์์ ์๋๋ก ํ๋ก๊ทธ๋จ์ ์ฝ์ผ๋ฉด ํจ์ ์ถ์ํ ์์ค์ด ํ ๋ฒ์ ํ ๋จ๊ณ์ฉ ๋ฎ์์ง๋ค.
5. Switch ๋ฌธ
switch ๋ฌธ์ ์๊ฒ ๋ง๋ค๊ธฐ ์ด๋ ต๋ค.
๋คํ์ฑ์ ์ด์ฉํด ๊ฐ switch ๋ฌธ์ ์ ์ฐจ์ ํด๋์ค(์ถ์ ํฉํ ๋ฆฌ)์ ์จ๊ธฐ๊ณ ์ ๋๋ก ๋ฐ๋ณตํ์ง ์๋ ๋ฐฉ๋ฒ์ด ์๋ค.
public abstract class Employee {
public abstract boolean isPayday();
public abstract Money calculatePay();
public abstract void deliverPay(Money pay);
}
-----------------
public interface EmployeeFactory {
Employee makeEmployee(EmployeeRecord r) throws InvalidEmployeeType;
}
-----------------
public class EmployeeFactoryImpl implements EmployeeFactory {
public Employee makeEmployee(EmployeeRecord r) throws InvalidEmployeeType {
switch (r.type) {
case COMMISSIONED:
return new CommissionedEmployee(r);
case HOURLY:
return new HourlyEmployee(r);
case SALARIED:
return new SalariedEmployee(r);
default:
throw new InvalidEmployeeType(r.type);
}
}
}
- swich ๋ฌธ์ ์ถ์ ํฉํ ๋ฆฌ์ ๊ฝ๊ฝ ์จ๊ธด๋ค.
- ํฉํ ๋ฆฌ๋ switch ๋ฌธ์ ์ฌ์ฉํด ์ ์ ํ Employee ํ์ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ค.
- calculatePay, isPayday, deliverPay ๋ฑ๊ณผ ๊ฐ์ ํจ์๋ Employee ์ธํฐํ์ด์ค๋ฅผ ๊ฑฐ์ณ ํธ์ถ๋๋ค.
- ๋คํ์ฑ์ผ๋ก ์ธํด ์ค์ ํ์ ํด๋์ค์ ํจ์๊ฐ ์คํ๋๋ค.
6. ์์ ์ ์ธ ์ด๋ฆ์ ์ฌ์ฉํด๋ผ
์์ ์ ์ธ ์ด๋ฆ์ ์ฌ์ฉํ๋ฉด ๊ฐ๋ฐ์ ๋จธ๋ฆฟ์์์๋ ์ค๊ณ๊ฐ ๋๋ ทํด์ง๋ฏ๋ก ์ฝ๋๋ฅผ ๊ฐ์ ํ๊ธฐ ์ฌ์์ง๋ค.
7. ํจ์ ์ธ์
์ต์ ์ ์ ๋ ฅ ์ธ์๊ฐ ์๋ ๊ฒฝ์ฐ(๋ฌดํญ)์ด๋ฉฐ, ์ฐจ์ ์ ์ ๋ ฅ ์ธ์๊ฐ 1๊ฐ๋ฟ์ธ ๊ฒฝ์ฐ(๋จํญ)์ด๋ค.
- ๋ง์ด ์ฐ๋ ๋จํญ ํ์: ์ธ์์ ์ง๋ฌธ์ ๋์ง๋ ๊ฒฝ์ฐ, ์ธ์๋ฅผ ๋ญ๊ฐ๋ก ๋ณํํด ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ๊ฒฝ์ฐ, ์ด๋ฒคํธ
- ์ดํญ ํจ์: ์ง๊ต ์ขํ๊ณ ์ ๊ณผ ๊ฐ์ด ์ผ๋ฐ์ ์ผ๋ก ์ธ์ 2๊ฐ๋ฅผ ์ทจํ๋ ๊ฒฝ์ฐ์๋ ์ ์ ํ๋ค.
- ํ๋๊ทธ ์ธ์๋ ํจ์๊ฐ ํ๊บผ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ง๋ฅผ ์ฒ๋ฆฌํ๋ค๊ณ ๊ณตํํ๋ ๊ฒ์ด๋ฏ๋ก ํผํด์ผ ํ๋ค.
- ์ถ๋ ฅ ์ธ์๋ ํผํด์ผ ํ๋ค. ํจ์์์ ์ํ๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ค๋ฉด ํจ์๊ฐ ์ํ ๊ฐ์ฒด ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฐฉ์์ ํํ๋ค.
8. ๋ถ์ ํจ๊ณผ๋ฅผ ์ผ์ผํค์ง ๋ง๋ผ
ํจ์์์ ํ ๊ฐ์ง๋ฅผ ํ๊ฒ ๋ค๊ณ ์ฝ์ํ๊ณ ์ ๋จ๋ชฐ๋ ๋ค๋ฅธ ์์ ์ ํ๊ธฐ๋ ํ๋ค.
9. ๋ช ๋ น๊ณผ ์กฐํ๋ฅผ ๋ถ๋ฆฌํ๋ผ
ํจ์๋ ๋ญ๊ฐ๋ฅผ ์ํํ๊ฑฐ๋ ๋ญ๊ฐ์ ๋ตํ๊ฑฐ๋ ๋ ์ค ํ๋๋ง ํด์ผ ํ๋ค.
๊ฐ์ฒด ์ํ๋ฅผ ๋ณ๊ฒฝํ๊ฑฐ๋ ์๋๋ฉด ๊ฐ์ฒด ์ ๋ณด๋ฅผ ๋ฐํํ๊ฑฐ๋ ๋ ์ค ํ๋๋ค.
10. ์ค๋ฅ ์ฝ๋๋ณด๋ค ์์ธ๋ฅผ ์ฌ์ฉํ๋ผ
๋ช ๋ น ํจ์์์ ์ค๋ฅ ์ฝ๋๋ฅผ ๋ฐํํ๋ ๋ฐฉ์์ ๋ช ๋ น/์กฐํ ๋ถ๋ฆฌ ๊ท์น์ ๋ฏธ๋ฌํ๊ฒ ์๋ฐํ๋ค.
if (deletePage(page) == E_OK)
๋ฐ๋ฉด ์ค๋ฅ ์ฝ๋ ๋์ ์์ธ๋ฅผ ์ฌ์ฉํ๋ฉด ์ค๋ฅ ์ฒ๋ฆฌ ์ฝ๋๊ฐ ์๋ ์ฝ๋์์ ๋ถ๋ฆฌ๋๋ฏ๋ก ์ฝ๋๊ฐ ๊น๋ํด์ง๋ค.
try {
deletePage(page);
registry.deleteReference(page.name);
configKeys.deleteKey(page.name.makeKey());
}
catch(Exception e) {
logger.log(e.getMessage());
}
11. Try/Catch ๋ธ๋ก ๋ฝ์๋ด๊ธฐ
์ฝ๋ ๊ตฌ์กฐ์ ํผ๋์ ์ผ์ผํค๋ฉฐ ์ ์ ๋์๊ณผ ์ค๋ฅ ์ฒ๋ฆฌ ๋์์ ๋ค์๋๋ค.
๊ทธ๋ฌ๋ฏ๋ก try/catch ๋ธ๋ก์ ๋ณ๋ ํจ์๋ก ๋ฝ์๋ด๋ ํธ์ด ์ข๋ค.
12. ๋ฐ๋ณตํ์ง ๋ง๋ผ
์ค๋ณต์ ์์ ๋ฉด ๋ชจ๋ ๊ฐ๋ ์ฑ์ด ํฌ๊ฒ ๋์์ง๋ค.
13. ๊ตฌ์กฐ์ ํ๋ก๊ทธ๋๋ฐ
ํจ์๊ฐ ์๋ค๋ฉด return, break. continue๋ฅผ ์ฌ๋ฌ ์ฐจ๋ก ์ฌ์ฉํด๋ ๊ด์ฐฎ๋ค.
goto ๋ฌธ์ ํฐ ํจ์์์๋ง ์๋ฏธ๊ฐ ์์ผ๋ฏ๋ก ์์ ํจ์์์๋ ํผํด์ผ ํ๋ค.
14. ์ด๋ป๊ฒ ํจ์๋ฅผ ์ง๋์?
์ฒ์์๋ ๊ธธ๊ณ ๋ณต์กํ๋ค.
ํ์ ์ฝ๋๋ฅผ ๋ค๋ฌ๊ณ , ํจ์๋ฅผ ๋ง๋ค๊ณ , ์ด๋ฆ์ ๋ฐ๊พธ๊ณ , ์ค๋ณต์ ์ ๊ฑฐํ๊ณ , ๋ฉ์๋๋ฅผ ์ค์ด๊ณ ์์๋ฅผ ๋ฐ๊พผ๋ค.
๋๋ก๋ ์ ์ฒด ํด๋์ค๋ฅผ ์ชผ๊ฐ๊ธฐ๋ ํ๋ค.
์ต์ข ์ ์ผ๋ก ์์ ์ค๋ช ํ ๊ท์น์ ๋ฐ๋ฅด๋ ํจ์๊ฐ ์ป์ด์ง๋ค.
๊ฒฐ๋ก
ํ๋ก๊ทธ๋๋จธ๋ ์์คํ ์ ํ๋ก๊ทธ๋จ์ด ์๋๋ผ ์ด์ผ๊ธฐ๋ก ์ฌ๊ธด๋ค.
ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ผ๋ ์๋จ์ ์ฌ์ฉํด ์ข ๋ ํ๋ถํ๊ณ ํํ๋ ฅ์ด ๊ฐํ ์ธ์ด๋ฅผ ๋ง๋ค์ด ์ด์ผ๊ธฐ๋ฅผ ํ์ด๊ฐ๋ค.
์์ฑํ๋ ํจ์๊ฐ ๋ถ๋ช ํ๊ณ ์ ํํ ์ธ์ด๋ก ๊น๋ํ๊ฒ ๋ง์๋จ์ด์ ธ์ผ ์ด์ผ๊ธฐ๋ฅผ ํ์ด๊ฐ๊ธฐ๊ฐ ์ฌ์์ง๋ค.