TIL (Today I Learned)
22.02.22~22.02.23
์ค๋ ์ฝ์ ๋ฒ์
3์ฅ. ํจ์
์ฑ ์์ ๊ธฐ์ตํ๊ณ ์ถ์ ๋ด์ฉ
- ์ด๋ค ํ๋ก๊ทธ๋จ์ด๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋จ์๊ฐ ํจ์๋ค.
- ํจ์๋ ์๊ฒ ๋ง๋ค์ด์ผ ํ๋ค. ๋ค์ ๋งํด, if๋ฌธ/else๋ฌธ/while๋ฌธ์ ๋ค์ด๊ฐ๋ ๋ธ๋ก์ ํ ์ค์ด์ด์ผ ํ๋ค๋ ๋ง์ด๋ค. ์ด ๋ง์ ์ค์ฒฉ ๊ตฌ์กฐ๊ฐ ์๊ธธ๋งํผ ํจ์๊ฐ ์ปค์ ธ์๋ ์ ๋๋ค๋ ๋ป์ด๋ค. ๊ทธ๋ฌ๋ฏ๋ก ํจ์์์ ๋ค์ฌ์ฐ๊ธฐ ์์ค์ 1๋จ์ด๋ 2๋จ์ ๋์ด์๋ฉด ์๋๋ค.
- ๋จ์ํ ๋ค๋ฅธ ํํ์ด ์๋๋ผ ์๋ฏธ ์๋ ์ด๋ฆ์ผ๋ก ๋ค๋ฅธ ํจ์๋ฅผ ์ถ์ถํ ์ ์๋ค๋ฉด ๊ทธ ํจ์๋ ์ฌ๋ฌ ์์ ์ ํ๋ ์ ์ด๋ค[G34] -> ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒ๋ ํ๋์ ์์ ์ด๋ค!
- ๊ฐ ํจ์๋ ๋ค์ ํจ์๋ฅผ ์๊ฐํ๊ณ , ๊ฐ ํจ์๋ ์ผ์ ํ ์ถ์ํ ์์ค์ ์ ์งํ๋ค.
switch๋ฌธ
switch ๋ฌธ์ ๊ผญ ์ฌ์ฉํด์ผ ํ๋ค๋ฉด ๋คํ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์ฝ๋ ์์์ + ์ ํ ์ ํ ํ๋์ ํ ๋ฒ๋ง ์ฌ์ฉํ๋ค.
1) ์ถ์ํฉํ ๋ฆฌ์ switch ๋ฌธ์ ์จ๊ธฐ๊ณ ํฉํ ๋ฆฌ๊ฐ ๋์ ํ์ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑ.
2) ์ธํฐํ์ด์ค๋ฅผ ํตํด ํจ์๊ฐ ํธ์ถ
3) ๋คํ์ฑ์ผ๋ก ์ธํด ์ค์ ํ์ ํด๋์ค์ ํจ์๊ฐ ์คํ
public abstract class Employee {
public abstract boolean isPayday();
public abstract Money calculatePay();
public abstract void deliverPay(Money pay);
}
-----------------------------------
public interface EmployeeFactory {
public Employee makeEmployee(EmployeeRecord r) throws InvalidEmployeeType;
}
-----------------------------------
public class EmployeeFactoryImpl implements EmployeeFactory {
public Employee makeEmployee(EmployeeRecord r) throws InvalidEmployeeType [
switch (r.type) {
case COMMISIONED:
return new CommisionedEmployee(r);
case HOURLY:
return new HourlyEmployee(r);
case SALARIED;
}
}
}
ํจ์ ์ธ์
ํจ์์์ ์ด์์ ์ธ ์ธ์ ๊ฐ์๋ 0๊ฐ์ด๋ค. 3๊ฐ๋ ๊ฐ๋ฅํ ํผํ๋ ํธ์ด ์ข๊ณ , 4๊ฐ ์ด์์ ํน๋ณํ ์ด์ ๊ฐ ํ์ํ๋ค. ํน๋ณํ ์ด์ ๊ฐ ์์ด๋ ์ฌ์ฉํ๋ฉด ์ ๋๋ค.
1) ๋จํญ ํ์
- ์ธ์์ ์ง๋ฌธ์ ๋์ง๋ ๊ฒฝ์ฐ
boolean fileExists("MyFile")
- ์ธ์๋ฅผ ๋ฌด์ธ๊ฐ๋ก ๋ณํํด ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ๊ฒฝ์ฐ
InputStream fileOpen("MyFile")
2) ํ๋๊ทธ ์ธ์
- ํจ์๋ก boolean๊ฐ์ ๋๊ธฐ์ง ๋ง๊ณ boolean true์ธ ํจ์์ boolean false์ธ ํจ์๋ฅผ ๊ฐ๊ฐ ๋ง๋ค์ด๋ผ
3) ์ดํญ ํจ์
- ๋จํญ ํจ์๋ก ๋ง๋ค์.
writeField(outputStream, name)
-> writeField ๋ฉ์๋๋ฅผ outputStream ๊ตฌ์ฑ์์ผ๋ก ๋ง๋ค์ด outputStream.writeField(name)์ผ๋ก ํธ์ถ
-> outputStream์ ํ์ฌ ํด๋์ค ๊ตฌ์ฑ์ ๋ณ์๋ก ๋ง๋ค์ด ์ธ์๋ก ๋๊ธฐ์ง ์๋๋ค.
-> FieldWriter๋ผ๋ ์ ํด๋์ค๋ฅผ ๋ง๋ค์ด์ ๊ตฌ์ฑ์์์ outputStream์ ๋ฐ๊ณ write ๋ฉ์๋ ๊ตฌํ
4) ์ธ์ ๊ฐ์ฒด
- ์ธ์๊ฐ 2~3๊ฐ ํ์ํ๋ค๋ฉด ์ผ๋ถ๋ฅผ ๋ ์์ ์ธ ํด๋์ค ๋ณ์๋ก ์ ์ธํ์
Circle makeCircle(double x, double y, double radius);
Circle makeCircle(Point center, double radius);
5) ๋์ฌ์ ํค์๋
๋จํญ ํจ์๋ ํจ์์ ์ธ์๊ฐ ๋์ฌ/๋ช ์ฌ ์์ ์ด๋ค์ผ ํ๋ค. writeField(name)
ํจ์ ์ด๋ฆ์ ํค์๋๋ฅผ ์ถ๊ฐํ๋ฉด ์ธ์ ์์๋ฅผ ๊ธฐ์ตํ ํ์๊ฐ ์์ด์ง๋ค.
๋ถ์ ํจ๊ณผ๋ฅผ ์ผ์ผํค์ง ๋ง๋ผ
๋ถ์ ํจ๊ณผ๋ฅผ ๋ฌด์ํ๋ฉด ์๊ฐ์ ์ธ ๊ฒฐํฉ์ด๋ ์์ ์ข ์์ฑ์ ์ด๋ํ ์ ์๊ธฐ ๋๋ฌธ์, ๊ฐ๊ธ์ ์ด๋ฉด ํจ์ ์ด๋ฆ์ ๋ช ์ํ๋ ๊ฒ์ด ์ข๋ค. ์๋ก์ด ํจ์๋ฅผ ๋ง๋๋ ๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ.
์ค๋ฅ ์ฝ๋๋ณด๋ค ์์ธ๋ฅผ ์ฌ์ฉํ๋ผ
1) try-catch ๋ธ๋ก์ ๋ณ๋ ํจ์๋ก ๋ฝ์๋ด๊ธฐ
public void delete(Page page) {
try {
deletePageAndAllReferences(page);
} catch (Exception e) {
logErorr(e);
}
}
-------------------------------
private void deletePageAndAllReferences(Page page) throws Exception {
deletePage(page);
registry.deleteReference(page.name);
configKeys.deleteKey(page.name.makeKey());
}
private void logError(Exception e) {
logger.log(e.getMessage());
}
2) Error.java ์์กด์ฑ ์์
์ค๋ฅ ์ฝ๋๋ฅผ ์ ์ํ๋ ํด๋์ค๊ฐ ๋ณํ๋ค๋ฉด ํด๋น ์ค๋ฅ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ ํด๋์ค ์ ๋ถ๋ฅผ ๋ค์ ์ปดํ์ผํ๊ณ ๋ค์ ๋ฐฐ์นํด์ผ ํ๋ค. ์ค๋ฅ ์ฝ๋ ๋์ ์์ธ๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์์ธ๋ Exception ํด๋์ค์์ ํ์๋๊ธฐ ๋๋ฌธ์ ์ฌ์ปดํ์ผ์ด๋ ์ฌ๋ฐฐ์น ์์ด๋ ์ ์์ธ ํด๋์ค๋ฅผ ์ถ๊ฐํ ์ ์๋ค.
๊ตฌ์กฐ์ ํ๋ก๊ทธ๋๋ฐ
๋ฃจํ ์์์ break, continue๋ ๊ฑฐ์ ์ฌ์ฉํ์ง ๋ง ๊ฒ. ํนํ goto๋ ์ฌ์ฉ ๊ธ์ง
ํจ์๋ฅผ ์ง๋ ๋ฐฉ๋ฒ
1. ๋จผ์ ์ญ ์จ๋ด๋ ค๊ฐ๋ค + ๋จ์ ํ ์คํธ
2. ๊ธฐ๋ฅ ๋จ์๋ก ๋ถ๋ฆฌ / ์ ์ ํ ๋ค์ด๋ฐ / ์ค๋ณต ์ ๊ฑฐ ๋ฑ์ ๊ณ ๋ คํ์ฌ ๋ฆฌํฉํ ๋ง + ๋จ์ ํ ์คํธ
์ค๋ ์ฝ์ ์๊ฐ
๋ชฉ๋ก 3-1์ ๋ณด๋ ์๊ฐ ์กธํ ์ฝ๋์ ๋๋ฌด ๋๊ฐ์์ ๋๋๋ค. ๊ฑฐ์ ์ ์๊ถ ์๋ฐ์ผ๋ก ๊ณ ์ํด์ผ ํ ์ ๋
์ด๋ฒ ์ฅ์์๋ ๋ฌด์์์ ์ธ ์ฝ๋ ์์ฑ๋ฒ์ ์ง์ ํ๋ ๋ด์ฉ์ด ๋ง์๋ค. ์๋ 3๊ฐ์ง ๋ด์ฉ์ด ๋ด ์ฝ๋์ ์ฃผ ๋ฌธ์ ์ ์ธ๋ฐ, ์์ผ๋ก ํจ์๋ฅผ ์์ฑํ ๋๋ง๋ค ์ด 3๊ฐ์ง ๋ด์ฉ์ ์๊ฒจ์ผ๊ฒ ๋ค. ํนํ switch๋ฌธ์ ๊ผญ ํฉํ ๋ฆฌ ๋ฉ์๋๋ฅผ ์ ์ฉํด๋ด์ผ๊ฒ ๋ค!
1) switch๋ฌธ์ ์ฌ์ฉ
2) ํ๋๊ทธ ์ธ์๋ฅผ ํจ์ ์ธ์๋ก ๋๊ธฐ๋ ๊ฒ
3) try-catch ๋ธ๋ก ์ฌ์ฉ
๊ถ๊ธํ๊ฑฐ๋ ์ ์ดํด๋์ง ์๋ ๋ด์ฉ
์ถ์ ํฉํ ๋ฆฌ vs ํฉํ ๋ฆฌ ๋ฉ์๋
- ์ถ์ ํฉํ ๋ฆฌ ํจํด(Abstract Factory Pattern) : ์๋ก ๊ด๋ จ์ด ์๋ ๊ฐ์ฒด๋ค์ ํต์งธ๋ก ๋ฌถ์ด์ ํฉํ ๋ฆฌ ํด๋์ค๋ก ๋ง๋ค๊ณ , ์ด๋ค ํฉํ ๋ฆฌ๋ฅผ ์กฐ๊ฑด์ ๋ฐ๋ผ ์์ฑํ๋๋ก ๋ค์ ํฉํ ๋ฆฌ๋ฅผ ๋ง๋ค์ด์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ํจํด
- ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด : ์กฐ๊ฑด์ ๋ฐ๋ฅธ ๊ฐ์ฒด ์์ฑ์ ํฉํ ๋ฆฌ ํด๋์ค๋ก ์์ํ์ฌ, ํฉํ ๋ฅด ํด๋์ค์์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ํจํด
=> ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด์์๋ ๊ตฌ์ฑํ๋ง๋ค ํฉํ ๋ฆฌ๋ฅผ ๋ง๋ค์ด ์ด๋ค ๊ฐ์ฒด๋ฅผ ํ์ฑํ๋๋ฐ, ๊ทธ ๊ฐ์ฒด์ ๊ตฌ์ฑํ์ ์ผ์ ํ๋ฏ๋ก ์ถ์ ํฉํ ๋ฆฌ ํจํด์ ์ ์ฉํ์ฌ ๊ด๋ จ๋ ๊ฐ์ฒด๋ค์ ํ๊บผ๋ฒ์ ์บก์ํํ์ฌ ํฉํ ๋ฆฌ๋ก ๋ง๋ ํ ์ผ๊ด๋๊ฒ ๊ฐ์ฒด ์์ฑ.
https://victorydntmd.tistory.com/300
์๊ฐ์ ์ธ ๊ฒฐํฉ(temporal coupling)
์ํํธ์จ์ด์ ์ค๊ณ ์์ ์์ฒด๋ก์์ ์๊ฐ ์ญํ
ex) ๋ฉ์๋ A๋ ์ธ์ ๋ ๋ฐ๋์ ๋ฉ์๋ B๋ณด๋ค ๋จผ์ ํธ์ถํด์ผ ํ๋ค
1) ๋์์ฑ(๊ฐ์ ์๊ฐ์ ์ผ์ด๋๋ ์ผ)
2) ์์(์๊ฐ ์์์ ์ผ๋ค์ ์๋์ ์์น)
=> ์ฐ๋ฆฌ๋ ๋์์ฑ์ ํ์ฉํ๊ณ ์์๊ฐ ์๋ ํ๋ก๊ทธ๋จ์ ๋ง๋ค์ด์ผ ํ๋ค.
์์ ์ข ์์ฑ(order dependency)
ํ์ ์์ ์ ์ ํ ์์ ์ด ์๋ฃ๋ ๋๊น์ง ์์๊ฐใน ์ ์๋ค.
- SRP : ํด๋์ค์๋ ํ ๊ฐ์ง, ๋จ ํ ๊ฐ์ง ๋ณ๊ฒฝ ์ด์ ๋ง ์กด์ฌํด์ผ ํ๋ค.
-> ํด๋์ค์ ๋ณ๊ฒฝ = ์ฝ๋์ ๋ณ๊ฒฝ์ด๋ค.
- OCP : ํด๋์ค๋ ํ์ฅ์ ์ด๋ ค ์์ด์ผ ํ๋ฉฐ ๋ณ๊ฒฝ์ ๋ซํ ์์ด์ผ ํ๋ค.
-> ์ ์ง์์ ์ถ๊ฐํ ๋๋ง๋ค ์ฝ๋๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์ ๋๋ค.
'๐ ๊ฐ๋ฐ ์์ > Clean Code' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Clean Code] 6์ฅ ๊ฐ์ฒด์ ์๋ฃ๊ตฌ์กฐ (0) | 2022.03.02 |
---|---|
[Clean Code] 4์ฅ ์ฃผ์ (0) | 2022.02.26 |
[ํด๋ฆฐ ์ฝ๋] 2์ฅ ์๋ฏธ ์๋ ์ด๋ฆ (0) | 2022.02.21 |
[ํด๋ฆฐ ์ฝ๋] 1์ฅ ๊นจ๋ํ ์ฝ๋ (0) | 2022.02.19 |
[ํด๋ฆฐ์ฝ๋] ์ฑ ๊ตฌ๋งค ์ธ์ฆ (0) | 2022.02.18 |
๋๊ธ