๐Ÿ“š/Clean Code(ํด๋ฆฐ ์ฝ”๋“œ)

[ํด๋ฆฐ์ฝ”๋“œ ์Šคํ„ฐ๋””] 6์žฅ. ๊ฐ์ฒด์™€ ์ž๋ฃŒ ๊ตฌ์กฐ

z_ero 2025. 5. 1. 02:41

6์žฅ. ๊ฐ์ฒด์™€ ์ž๋ฃŒ ๊ตฌ์กฐ

๐Ÿงฉ ์ž๋ฃŒ๋ฅผ ๊ฐ์ถฐ์•ผ ํ•˜๋Š” ์ด์œ 

๋ณ€์ˆ˜๋ฅผ private์œผ๋กœ ๊ฐ์ถ”๋Š” ์ด์œ ๋Š” ๋‹จ์ˆœํ•˜๋‹ค.
๋‹ค๋ฅธ ์ฝ”๋“œ๊ฐ€ ๋ณ€์ˆ˜์— ์ง์ ‘ ์˜์กดํ•˜์ง€ ์•Š๊ฒŒ ํ•˜๋ ค๋Š” ๊ฒƒ.
๊ทธ๋ž˜์•ผ ๋‚˜์ค‘์— ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ๋งˆ์Œ๋Œ€๋กœ ๋ฐ”๊พธ๋”๋ผ๋„ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ์ง€ ์•Š๋Š”๋‹ค.


๊ทธ๋Ÿฐ๋ฐ ๋งŽ์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์ด get, set ํ•จ์ˆ˜๋งŒ ๋œ์ปฅ ๋งŒ๋“ค์–ด์„œ ๊ฒฐ๊ตญ ๋ณ€์ˆ˜์— ์ง์ ‘ ์ ‘๊ทผํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค.
์ด๊ฑด ์‚ฌ์‹ค์ƒ ์บก์Аํ™”๋ฅผ ๊นจ๋Š” ๊ฒƒ๊ณผ ๋‹ค๋ฆ„์—†๋‹ค.

๋‹จ์ˆœํžˆ ์กฐํšŒ/์„ค์ • ํ•จ์ˆ˜๋ฅผ ๋ถ™์ธ๋‹ค๊ณ  ํด๋ž˜์Šค๊ฐ€ ๋˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋‹ค.
์ง„์งœ ์บก์Аํ™”๋Š” “๊ตฌํ˜„์ด ์–ด๋–ป๊ฒŒ ๋˜์–ด ์žˆ๋Š”์ง€ ์™ธ๋ถ€์—์„œ ์•Œ ์ˆ˜ ์—†๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ”์ด๋‹ค.


๐Ÿงญ ์ž๋ฃŒ ์ถ”์ƒํ™”๋ž€?

์˜ˆ์‹œ 1: ๋‚˜์œ ์ถ”์ƒํ™”

public class Point {
  public double x;
  public double y;
}

→ ๋‚ด๋ถ€ ๊ตฌํ˜„์ด ๊ทธ๋Œ€๋กœ ๋“œ๋Ÿฌ๋‚œ ๋‹จ์ˆœํ•œ ์ž๋ฃŒ ๊ตฌ์กฐ์ผ ๋ฟ์ด๋‹ค.

 


์˜ˆ์‹œ 2: ์ข‹์€ ์ถ”์ƒํ™”

public interface Point {
  double getX();
  double getY();
  void setCartesian(double x, double y);
  double getR();
  double getTheta();
  void setPolar(double r, double theta);
}

→ ์ด ์ฝ”๋“œ๋งŒ ๋ด์„  ์ง๊ต์ขŒํ‘œ๊ณ„๋ฅผ ์“ฐ๋Š”์ง€, ๊ทน์ขŒํ‘œ๊ณ„๋ฅผ ์“ฐ๋Š”์ง€ ์ „ํ˜€ ์•Œ ์ˆ˜ ์—†๋‹ค.

๊ตฌํ˜„ ๋ฐฉ์‹์ด ์™„์ „ํžˆ ๊ฐ์ถฐ์ ธ ์žˆ๊ณ , ์ธํ„ฐํŽ˜์ด์Šค๋งŒ์œผ๋กœ๋„ ์˜๋„๋ฅผ ์ถฉ๋ถ„ํžˆ ํ‘œํ˜„ํ•˜๊ณ  ์žˆ๋‹ค.
์ด๋Ÿฐ ๋ฐฉ์‹์ด ์ง„์งœ ์ž๋ฃŒ ์ถ”์ƒํ™”์— ๊ฐ€๊นŒ์šด ์„ค๊ณ„๋‹ค.


๐Ÿ“ ๊ฐ์ฒด vs ์ž๋ฃŒ ๊ตฌ์กฐ: ์„œ๋กœ ๋ฐ˜๋Œ€๋˜๋Š” ํŠน์„ฑ

 

๊ฐ์ฒด(Object) ์ž๋ฃŒ ๊ตฌ์กฐ(Data Structure)
์ž๋ฃŒ๋ฅผ ๊ฐ์ถ”๊ณ  ํ•จ์ˆ˜๋งŒ ๊ณต๊ฐœํ•จ ์ž๋ฃŒ๋ฅผ ๊ณต๊ฐœํ•˜๊ณ  ํ•จ์ˆ˜๋Š” ๊ฑฐ์˜ ์—†์Œ
์ƒˆ ์ž๋ฃŒ ํƒ€์ž… ์ถ”๊ฐ€๋Š” ์‰ฌ์›€ ์ƒˆ ๋™์ž‘(ํ•จ์ˆ˜) ์ถ”๊ฐ€๋Š” ์‰ฌ์›€
์ƒˆ ๋™์ž‘ ์ถ”๊ฐ€๋Š” ์–ด๋ ค์›€ ์ƒˆ ์ž๋ฃŒ ํƒ€์ž… ์ถ”๊ฐ€๋Š” ์–ด๋ ค์›€

→ ๋‘˜ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋” ์ข‹๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์—†๋‹ค. ๋ฌธ์ œ์— ๋”ฐ๋ผ ๋งž๋Š” ๊ตฌ์กฐ๋ฅผ ๊ณ ๋ฅด๋Š” ๊ฒŒ ์ค‘์š”ํ•˜๋‹ค.


๐Ÿ’ฅ ๊ธฐ์ฐจ ์ถฉ๋Œ๊ณผ ๋””๋ฏธํ„ฐ ๋ฒ•์น™

์•„๋ž˜ ์ฝ”๋“œ๋Š” ๋ณด๊ธฐ์—” ๊ฐ„๋‹จํ•˜์ง€๋งŒ ๋””๋ฏธํ„ฐ ๋ฒ•์น™์„ ์œ„๋ฐ˜ํ•˜๊ณ  ์žˆ๋‹ค.

final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath();

์ด๋ ‡๊ฒŒ ๋˜๋ฉด ctxt๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฌด์—‡์„ ๊ฐ–๊ณ  ์žˆ๋Š”์ง€ ์™ธ๋ถ€ ์ฝ”๋“œ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์ด ์•Œ์•„์•ผ ํ•œ๋‹ค.


→ ๊ฐœ์„ ๋œ ๋ฐฉ๋ฒ•:

BufferedOutputStream bos = ctxt.createScratchFileStream(classFileName);

๋ฌด์—‡์„ ํ•˜๋ผ๊ณ  ์‹œ์ผœ์•ผ์ง€, ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๊บผ๋‚ด์„œ ์กฐ์ž‘ํ•˜์ง€ ๋ง์ž.


๐Ÿงฑ ์žก์ข… ๊ตฌ์กฐ๋Š” ํ”ผํ•˜์ž

๊ฐ์ฒด์™€ ์ž๋ฃŒ ๊ตฌ์กฐ์˜ ํŠน์„ฑ์„ ์–ด์„คํ”„๊ฒŒ ์„ž์€ ํด๋ž˜์Šค๋Š” ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด get/set ํ•จ์ˆ˜๋„ ์žˆ๊ณ , ์ผ๋ถ€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊นŒ์ง€ ๋“ค์–ด ์žˆ๋Š” ํด๋ž˜์Šค๋Š”
๊ฐ์ฒด๋„ ์ž๋ฃŒ ๊ตฌ์กฐ๋„ ์•„๋‹Œ, ์–‘์ชฝ์˜ ๋‹จ์ ๋งŒ ๊ฐ€์ ธ์˜จ ์žก์ข… ๊ตฌ์กฐ๊ฐ€ ๋œ๋‹ค.


๊ทธ๋ž˜์„œ ์• ๋งคํ•˜๊ฒŒ ์„ž๊ธฐ๋ณด๋‹จ ํ™•์‹คํ•˜๊ฒŒ ๋‚˜๋ˆ„๋Š” ๊ฒŒ ๋‚ซ๋‹ค.
์ž๋ฃŒ ๊ตฌ์กฐ๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ๋‹ต๊ฒŒ, ๊ฐ์ฒด๋Š” ๊ฐ์ฒด๋‹ต๊ฒŒ!

 

๐Ÿ“ฆ DTO์™€ ํ™œ์„ฑ ๋ ˆ์ฝ”๋“œ

  • DTO (Data Transfer Object)
    ๋‹จ์ˆœํžˆ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๋Š” ๊ตฌ์กฐ์ฒด.
    ํ•จ์ˆ˜๋Š” ์—†๊ฑฐ๋‚˜, ์ตœ์†Œํ•œ์˜ get/set๋งŒ ์กด์žฌํ•œ๋‹ค.

  • ํ™œ์„ฑ ๋ ˆ์ฝ”๋“œ (Active Record)
    ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์œผ๋ฉด์„œ save(), find() ๊ฐ™์€ DB ๊ด€๋ จ ๋™์ž‘๋„ ํฌํ•จํ•˜๋Š” ๊ตฌ์กฐ.
    → ๊ทธ๋Ÿฐ๋ฐ ์—ฌ๊ธฐ์— ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊นŒ์ง€ ์–น๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด, ๊ธˆ์„ธ ์žก์ข… ๊ตฌ์กฐ๊ฐ€ ๋˜์–ด๋ฒ„๋ฆฌ๋‹ˆ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.
    ๊ทธ๋Ÿฌ๋‹ˆ ํ•ต์‹ฌ์€ ์—ญํ•  ๋ถ„๋ฆฌ! ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๋Š” ๊ตฌ์กฐ๋Š” ์ •๋ง ๊ทธ ์—ญํ• ์—๋งŒ ์ง‘์ค‘ํ•˜๋„๋ก ์„ค๊ณ„ํ•˜๋Š” ๊ฒŒ ์ข‹๋‹ค.


โœ๏ธ ๋งˆ๋ฌด๋ฆฌํ•˜๋ฉฐ

๊ฐ์ฒด๋Š” ๋™์ž‘์„ ์ค‘์‹ฌ์œผ๋กœ, ์ž๋ฃŒ ๊ตฌ์กฐ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์„ค๊ณ„ํ•œ๋‹ค.

  • ์ƒˆ๋กœ์šด ํƒ€์ž…์„ ์ž์ฃผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด๋ผ๋ฉด → ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„๊ฐ€ ๋” ์œ ๋ฆฌํ•˜๊ณ 
  • ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด๋‚˜ ๋™์ž‘์„ ๊ณ„์†ํ•ด์„œ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค๋ฉด → ์ž๋ฃŒ ๊ตฌ์กฐ + ์ ˆ์ฐจํ˜• ์„ค๊ณ„๊ฐ€ ์ ํ•ฉํ•˜๋‹ค

์ค‘์š”ํ•œ ๊ฑด ๋ฌด์กฐ๊ฑด “๊ฐ์ฒด ์ง€ํ–ฅ!” ํ˜น์€ “์บก์Аํ™”!”๋ฅผ ์™ธ์น˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ,
์ง€๊ธˆ ๋‚ด๊ฐ€ ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ํ’€๊ณ  ์žˆ๋Š”์ง€์— ๋”ฐ๋ผ ๊ฐ€์žฅ ์ ์ ˆํ•œ ์„ค๊ณ„๋ฅผ ์„ ํƒํ•  ์ค„ ์•„๋Š” ํƒœ๋„๋‹ค.

๋ฐ˜์‘ํ˜•