๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“’ ๊ฐœ๋ฐœ ์„œ์ /Clean Code

[ํด๋ฆฐ ์ฝ”๋“œ] 3์žฅ ํ•จ์ˆ˜

by nitronium102 2022. 2. 23.

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

 

[๋””์ž์ธํŒจํ„ด] ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด ( Abstract Factory Pattern )

์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด ( Abstract Factory Pattern ) ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์ด๋ผ๋Š” ์ด๋ฆ„๋งŒ ๋ด์„œ๋Š” ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ํŒจํ„ด๊ณผ ๋น„์Šทํ•ด๋ณด์ด์ง€๋งŒ, ๋ช…ํ™•ํ•œ ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ํŒจํ„ด ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ๊ฐ์ฒด ์ƒ์„ฑ

victorydntmd.tistory.com

 

์‹œ๊ฐ„์ ์ธ ๊ฒฐํ•ฉ(temporal coupling)

์†Œํ”„ํŠธ์›จ์–ด์˜ ์„ค๊ณ„ ์š”์†Œ ์ž์ฒด๋กœ์„œ์˜ ์‹œ๊ฐ„ ์—ญํ• 

ex) ๋ฉ”์„œ๋“œ A๋Š” ์–ธ์ œ๋‚˜ ๋ฐ˜๋“œ์‹œ ๋ฉ”์„œ๋“œ B๋ณด๋‹ค ๋จผ์ € ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค

1) ๋™์‹œ์„ฑ(๊ฐ™์€ ์‹œ๊ฐ„์— ์ผ์–ด๋‚˜๋Š” ์ผ)

2) ์ˆœ์„œ(์‹œ๊ฐ„ ์†์—์„œ ์ผ๋“ค์˜ ์ƒ๋Œ€์  ์œ„์น˜)

=> ์šฐ๋ฆฌ๋Š” ๋™์‹œ์„ฑ์„ ํ—ˆ์šฉํ•˜๊ณ  ์ˆœ์„œ๊ฐ€ ์—†๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค. 

 

์ˆœ์„œ ์ข…์†์„ฑ(order dependency)

ํ›„์† ์ž‘์—…์€ ์„ ํ–‰ ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์‹œ์ž๊ฐ›ใ„น ์ˆ˜ ์—†๋‹ค. 

 

 

- SRP : ํด๋ž˜์Šค์—๋Š” ํ•œ ๊ฐ€์ง€, ๋‹จ ํ•œ ๊ฐ€์ง€ ๋ณ€๊ฒฝ ์ด์œ ๋งŒ ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค.

-> ํด๋ž˜์Šค์˜ ๋ณ€๊ฒฝ = ์ฝ”๋“œ์˜ ๋ณ€๊ฒฝ์ด๋‹ค. 

- OCP : ํด๋ž˜์Šค๋Š” ํ™•์žฅ์— ์—ด๋ ค ์žˆ์–ด์•ผ ํ•˜๋ฉฐ ๋ณ€๊ฒฝ์— ๋‹ซํ˜€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

-> ์ƒˆ ์ง์›์„ ์ถ”๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์•ˆ ๋œ๋‹ค.

 

๋Œ“๊ธ€