๊ฐœ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋ฐฐ์šฐ๋Š”๋ฐ ์žˆ์–ด ์•Œ์•„๋‘๋ฉด ์ข‹์€ ๋‚ด์šฉ๋“ค์„ ์ •๋ฆฌํ•ด๋ณธ๋‹ค.

์ ‘๊ทผ์ œ์–ด์ž์™€ ์บก์Šํ™”

  • ๋ฉค๋ฒ„ ๋ณ€์ˆ˜ ์ง์ ‘ ์ ‘๊ทผ ๋ชปํ•˜๋„๋ก ํ•ด์•ผํ•จ
  • ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • ๋‚ด๋ถ€์— ์–ด๋–ค ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š”์ง€๋Š” ๋ชจ๋ฅด๊ฒ ๊ณ , ์†Œํ†ต์€ ๋ฉ”์„œ๋“œ๋กœ๋งŒ ํ•ด!
  • ์ผ๋‹จ ์ด๊ฒŒ ๊ธฐ๋ณธ
public class Human {
   private String name;
   private int age;
 
   public Human(String name, int age) {
      this.name = name;
      this.age = Math.max(age, 0);
   }
}

getter, setter

  • ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋‚ด๋ถ€ ์ •๋ณด๋ฅผ ๊ถ๊ธˆํ•ดํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์—ด์–ด์ฃผ๋Š” ๋ฉ”์„œ๋“œ
  • ํ•„์š”ํ•œ ์‹œ์ ์— ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ์—ด๊ฒ ๋‹ค๋Š” ๋ฐœ์ƒ
  • ์ฝ๊ฒŒ ํ•ด์ฃผ๋ ค๋ฉด getter, ์“ฐ๊ฒŒ ํ•ด์ฃผ๋ ค๋ฉด setter
  • ์š”์ฆ˜ ์–ธ์–ด์—์„œ๋Š” immutable property์™€ ๊ฐ™์€ ๊ฒƒ์ด ์žˆ์–ด ๋ฐฉ์‹์ด ๋ฐ”๋€Œ๊ณ  ์žˆ๊ธด ํ•˜๋‹ค.
  • get, set์‹œ ๋‹ค๋ฅธ ์ž‘์—…์„ ํ•ด์•ผํ•  ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฑธ ์ผ๋‹จ ๊ธฐ๋ณธ์œผ๋กœ ํ•จ
    • ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ(์„ฑ๋Šฅ ๋“ฑ)์— public์œผ๋กœ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ์—ด์–ด์คŒ
public class Human {
   private String name;
   private int age;
 
   public Human(String name, int age) {
      this.name = name;
      this.age = Math.max(age, 0);
   }
}

ํ•จ์ˆ˜๋ฅผ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ์˜ ์žฅ์ 

  1. ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๊ณ  ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค getter์—์„œ โ€œ๊ณ„์‚ฐโ€ ๊ฐ€๋Šฅ
    • ๋ฉ”๋ชจ๋ฆฌ์— ๋‹ด์ง€ ์•Š๊ณ  ๊ณ„์‚ฐํ•ด์„œ ๋˜์ง
  2. setter์—์„œ ์ถ”๊ฐ€์ ์ธ ๋กœ์ง์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Œ
    • ์Œ์ˆ˜์˜ ๋‚˜์ด๊ฐ€ ๋“ค์–ด์˜ค๋Š” ๊ฒฝ์šฐ โ€œ๋ฌด์‹œโ€
  3. ์ƒ์†์„ ํ†ตํ•œ ๋‹คํ˜•์„ฑ ๊ตฌํ˜„ ๊ฐ€๋Šฅ

Best Practice

  1. ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋Š” private
    • infomation hiding
  2. ์ƒˆ ๊ฐœ์ฒด๋Š” ์ƒ์„ฑํ•จ๊ณผ ๋™์‹œ์— ์œ ํšจํ•ด์•ผ ํ•œ๋‹ค.
    • ๊ฐœ์ฒด๋Š” ์‚ด์•„์žˆ๋Š” ๋™์•ˆ ์–ธ์ œ๋‚˜ ์œ ํšจํ•œ ์ƒํƒœ์—ฌ์•ผ ์ด์ƒ์ ์ž„
    • ์‹ค์ˆ˜๋„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Œ
    • ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ์Œ
  3. getter๋Š” ์ž์œ ๋กญ๊ฒŒ ์ถ”๊ฐ€
    • ์•Œ ํ•„์š” ์—†๋Š” ์ •๋ณด๋Š” ์•ˆ๋ณด์—ฌ์ฃผ๋Š”๊ฒŒ ์ •์„
    • ํ•˜์ง€๋งŒ ๋ณด์—ฌ์ค˜๋„ ํฐ ๋ฌธ์ œ๋Š” ์—†์Œ
    • ๊ทธ๋ž˜์„œ ์ž์œ ๋กญ๊ฒŒ ์—ด์–ด๋‘š
    • ํ•˜์ง€๋งŒ ๊ฐœ์ฒด์˜ Reference๋ฅผ ๋„˜๊ธฐ๋Š” ๊ฒฝ์šฐ ์ฃผ์˜ํ•ด์•ผ ํ•จ
      • C++์˜ ๊ฒฝ์šฐ โ€œ์ฝ๊ธฐ ์ „์šฉโ€ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์–ด ์ด๋Ÿฐ ๋ฌธ์ œ์—์„œ ์ž์œ ๋กœ์›€
  4. setter๋Š” ๊ณ ๋ฏผ ํ›„ ์ถ”๊ฐ€
    • ์ด์ƒ์ ์ธ ๊ฐœ์ฒด์˜ ์ƒํƒœ ์ˆ˜์ •๋ฒ•
      1. ๊ฐœ์ฒด์˜ ์‚ฌ์šฉ์ž๊ฐ€ ๋™์ž‘์„ ์ง€์‹œ
      2. ๋™์ž‘์˜ ๊ฒฐ๊ณผ๋กœ ๊ฐœ์ฒด ์•ˆ์— ์žˆ๋Š” ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝ
        • ์ฆ‰, ์Šค์Šค๋กœ ๋ณ€๊ฒฝ!
    • ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ๋ฐ”๊พธ๋Š” ๋…€์„์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•œ ํ”ผํ•˜์ž.
    • ๋ฌด์กฐ๊ฑด ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๊ธด ํ•จ.. (์•„๋ฌด ์ƒ๊ฐ ์—†์ด)
      • ๋งŒ์•ฝ SDK์ธ ๊ฒฝ์šฐ์—๋Š” ๋ฏธ๋ž˜๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Œ

์บก์Šํ™”

๊ฐœ์ฒด์˜ ๋ฐ์ดํ„ฐ์™€ ๋™์ž‘์„ ํ•˜๋‚˜๋กœ ๋ฌถ์Œ โ†’ Class

๋‚ด๋ถ€์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธ โ†’ getter, setter, ์ ‘๊ทผ์ œ์–ด์ž

  • ์‚ฌ์šฉ์ž๋Š” ํด๋ž˜์Šค ์†์„ ์•Œ ํ•„์š” ์—†์Œ
    • ํ•จ์ˆ˜๋„ ์ด๋ ‡๊ฒŒ ๋™์ž‘
    • ์ถ”์ƒํ™”
  • ํ•จ์ˆ˜๋ฅผ ๋ถ„๋ฆฌํ•  ๋•Œ ์ ์šฉํ–ˆ๋˜ ์›์น™์„ ํด๋ž˜์Šค์—๋„ ์ ์šฉํ•˜๋ฉด ๋จ

์ถ”์ƒํ™”

๊ตฌ์ฒด์ ์ธ ๊ฒƒ์— ์†๋Œ€์ง€ ์•Š๊ฒ ๋‹ค.

  • ์ถ”์ƒ ์ž๋ฃŒํ˜•(Abstract data type)์ชฝ ๊ด€์ 
    • ํด๋ž˜์Šค๋ฅผ โ€œ์‚ฌ์šฉโ€ํ•˜๋Š” ์‚ฌ๋žŒ์˜ ๊ด€์ 
    • ์บก์Šํ™”(๋ฐ์ดํ„ฐ ๋ฌถ์Œ)์— ์ข€ ๋” ๋ฐฉ์ ์ด ๊ฐ€์žˆ๋Š” ๊ด€์ 
    • ์‚ฌ์šฉ์ž๋Š” ํด๋ž˜์Šค๋ฅผ โ€œ์ž๋ฃŒํ˜•โ€์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
    • ๊ทธ ์•ˆ์— ๋“ค์–ด๊ฐ„ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๊ฐ€ ์ •ํ™•ํžˆ ๋ญ”์ง€ ๋ชฐ๋ผ๋„ ๋จ
    • ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ๊ฐœ์ฒด ์ƒ์„ฑ ๊ฐ€๋Šฅ
  • ์ ˆ์ฐจ์  ๋ฐ์ดํ„ฐ ์ถ”์ƒํ™”(Procedural data abstraction)์ชฝ ๊ด€์ 
    • ํด๋ž˜์Šค๋ฅผ โ€œ์ œ์ž‘โ€ํ•˜๋Š” ์‚ฌ๋žŒ์˜ ๊ด€์ 
    • ๋ฉ”์„œ๋“œ์— ์ข€ ๋” ๋ฐฉ์ ์ด ๊ฐ€์žˆ๋Š” ๊ด€์ 
    • ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ์กฐ์ž‘ํ•˜๋Š” ๋Œ€์‹  โ€œ๋ฉ”์„œ๋“œโ€๋ฅผ ํ˜ธ์ถœ
    • ๋™์ž‘์  ๊ฐœ์ฒด(behavior objects) ์ง„์˜์ด๋ผ๊ณ  ํ•˜๊ธฐ๋„ ํ•จ (์ •์‹ X)

์ถ”์ƒํ™”์˜ ๋‹จ์ 

  • ๋™์ž‘์—†์ด ๋ฐ์ดํ„ฐ๋งŒ ์žˆ๋Š” ํด๋ž˜์Šค๋Š” ์“ธ๋ฐ์—†๋Š” ์ฝ”๋“œ๋งŒ ๋Š˜์–ด๋‚จ
    • DTO(Data Transfer Object)
    • ์ด๋Ÿฐ ๊ฒฝ์šฐ ๊ทธ๋ƒฅ public์„ ์“ฐ๊ธฐ๋„ ํ•จ..
  • ์–ด๋–ป๊ฒŒ ์ถ”์ƒํ™”๋ฅผ ํ•ด์•ผํ•˜๋Š”์ง€ ๋šœ๋ ทํ•œ โ€œ๊ฐ๊ด€์  ๊ธฐ์ค€โ€์ด ์—†์Œ
    • ์ธ๊ฐ„์€ ๋šœ๋ ทํ•œ ์‹ค์ฒด๊ฐ€ ์—†๋Š” ๊ฐœ๋…์„ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์›Œํ•จ
    • ์ดํ•ดํ•˜๋”๋ผ๋„ ๊ฐ์ž ๋‹ค๋ฅด๊ฒŒ ์ดํ•ดํ•จ
    • ๋‹คํ˜•์„ฑ, ์ƒ์†, ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๊ฐ€๋ฉด์„œ ๋” ๋ฌธ์ œ๊ฐ€ ๋จ

๋ฉ”์„œ๋“œ ์ด๋ฆ„ ์ง“๋Š” ๋ฐฉ๋ฒ•

๋ถ„๋ฌด๊ธฐ์˜ ๋ฌผ์„ ๋ฟŒ๋ฆฌ๋Š” ํ–‰์œ„์„ ์ƒ๊ฐํ•ด๋ณด๋ฉด..

  1. ๋™์ž‘์— ์ดˆ์ ์„ ๋งž์ถ”๊ธฐ
    • ๋‹น๊ธฐ๊ธฐ: pull
    • ๋ˆ„๋ฅด๊ธฐ: press
  2. ์šฉ๋„์— ์ดˆ์ ์„ ๋งž์ถ”๊ธฐ
    • ๋ฟŒ๋ฆฌ๊ธฐ: spray

์ข‹์€ ํ‘œํ˜„๋ ฅ์„ ๊ฐ€์ง€๋Š” ์ฝ”๋“œ

  • ๋ฌผํ๋ฅด๋“ฏ ์ฝํžˆ๋Š” ๋ณ€์ˆ˜๋ช…
  • ๋‹จ์œ„๋กœ ํ•œ๋ฒˆ ์ฒดํฌํ•ด์ฃผ์ž(remainingWaterInML)
  • ๋‘๊ฐ€์ง€์˜ ์ผ์„ ํ•˜๋Š” ๊ฒฝ์šฐ And๋ฅผ ์จ์„œ ํ‘œํ˜„ํ•ด์ฃผ์ž(sprayAndGetUsedAmountWater())
    • ๋ฌผ๋ก  ์•ˆ ํ•˜๋Š”๊ฒŒ ๊ฐ€์žฅ ์ข‹๋‹ค.
    • ๋งŒ์•ฝ ๊ทธ๋ž˜์•ผ ํ•œ๋‹ค๋ฉด ํ™•์‹คํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜๋Š”๊ฒŒ ๋‚ซ๋‹ค๋Š” ์˜๋ฏธ
  • ๋งค์ง ๋„˜๋ฒ„๋ณด๋‹ค๋Š” ์ƒ์ˆ˜ํ˜• ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ž.

๊ฐœ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๋ฉฐ ๋ฐœ์ƒํ•˜๋Š” ์‹ค์ˆ˜๋“ค

  1. ๋ชจ๋“  ์„ธ๊ณ„๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ํ•˜๋ ค๋Š” ์‹œ๋„๋ฅผ ํ•˜์ง€ ๋ง์ž.
    • ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ๋งŒ๋“ค์ž.
    • ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ์“ธ๋ฐ์—†๋Š” ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ์˜ ์ฆ๊ฐ€๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
  2. ์ฝ”๋“œ๋ฅผ ์—ฌ๋Ÿฌ๋ฒˆ ๊ณ ์น˜๋Š” ๊ฑด ์ผ๋ฐ˜์ ์ด๋‹ค.
    • ์ ์–ด๋„ 2, 3๋ฒˆ์€ ๋’ค์—Ž์–ด์•ผ ์ข‹์€ ์ฝ”๋“œ๊ฐ€ ๋‚˜์˜จ๋‹ค.
    • ๋‹น์—ฐํ•œ ๊ฒƒ์ด๋ผ ๋ฐ›์•„๋“ค์—ฌ๋ผ.

์ข‹์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์Šต๊ด€

  1. ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋Š” ์‚ญ์ œํ•œ๋‹ค.
    • ๊ณ ์น˜๋Š” ์ผ์ด ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ๋Š” ์—…๋ฌด์™€ ๋‹ค๋ฆ„์—†๋‹ค.
    • ๊ทธ ๊ณผ์ •์—์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋Š” ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ์„ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.
  2. ํ•„์š”ํ•œ ์‹œ์ ์— ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ผ.
    • ๋ฏธ๋ฆฌ ๋งŒ๋“ค๋ ค๊ณ  ํ•˜๋Š” ํ–‰๋™์€ ๊ฒฐ๊ตญ ๋ถˆํ•„์š”ํ•œ ๋™์ž‘์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.
  3. ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์‚ด์„ ๋ถ™์—ฌ๋ผ.
    • ์ฒ˜์Œ ์ฝ”๋“œ๋ฅผ ์งค ๋•Œ ๊ฐ€์ •์€ ๊ฑฐ์˜ ํ‹€๋ฆด ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค.
    • ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ผˆ๋Œ€๋ฅผ ์งœ๊ณ , ์ด์— ์ถ”ํ›„ ํ™•์žฅ์ด ๊ฐ€๋Šฅํ† ๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

์œ ์—ฐ์„ฑ์˜ ๋‘ ์–ผ๊ตด

์œ ์—ฐ์„ฑ ๋†’์€ ์„ค๊ณ„๊ฐ€ ์ตœ๊ณ ๋Š” ์•„๋‹ˆ๋‹ค.

  • ๋„ˆ๋ฌด ์ชผ๊ฐค ๊ฒฝ์šฐ ์—ฌ๋Ÿฌ ํŒŒ์ผ์„ ๋„˜๋‚˜ ๋“ค์–ด์•ผ ํ•จ
  • ํ•˜๋‚˜์˜ ์ฝ˜ํ…์ŠคํŠธ๋กœ ์ ๋Š” ๊ฒƒ์ด ๋ณด๋‹ค ๋‚˜์€ ์†Œํ†ต์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
  • ๋จผ ๋ฏธ๋ž˜ ๋•Œ๋ฌธ์— ์ง€๋‚˜์น˜๊ฒŒ ์ชผ๊ฐœ๋Š” ๊ฒƒ์€ ์˜ค๋ฒ„ ์—”์ง€๋‹ˆ์–ด๋ง
  • ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ๊ธฐ๋ณธ์ž์„ธ๋ฅผ ๋จผ์ € ๊ฐ€์งˆ ๊ฒƒ
    • ์ฝ๊ธฐ ๋ช…ํ™•ํ•œ ์ฝ”๋“œ ์ƒ์„ฑ
    • ์‹ค์ˆ˜๋ฅผ ์ €์ง€๋ฅด๊ธฐ ์–ด๋ ค์šด ์ฝ”๋“œ ์ƒ์„ฑ
    • ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์ฝ”๋“œ ์ƒ์„ฑ
    • ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋ฉด ๋””๋ฒ„๊น…
  • ๊ทธ ์ดํ›„ ํ•„์š”์— ๋”ฐ๋ผ ์ ์  ์œ ์—ฐ์„ฑ์„ ํ‚ค์šฐ๋Š” ๋ฒ•์„ ๋ฐฐ์šฐ๊ธฐ

๊ฐœ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์•Œ๊ณ  ์žˆ์œผ๋ฉด ์ข‹์€ ์‚ฌ๊ณ ๋ฐฉ์‹

  • ๊ฐœ์ฒด๋Š” ์ž์œจ์„ฑ์„ ๊ฐ€์ง„๋‹ค.
    • โ€œ๋ถ„๋ฌด๊ธฐ๋กœ ํ™”๋ถ„์— ๋ฌผ์„ ์ค˜โ€: waterSpray.addWaterTo(flowerPot)
    • โ€œ๋ถ„๋ฌด๊ธฐ๋ฅผ ์ค„ํ…Œ๋‹ˆ ํ™”๋ถ„์•„ ๋„ˆ๊ฐ€ ๋ฌผ์„ ์ค˜โ€: flowerPot.addWater(waterSpray)
    • ์ „์ž๊ฐ€ ๋ณด๋‹ค ํ˜„์‹ค์„ธ๊ณ„์—์„œ ์ž์—ฐ์Šค๋Ÿฌ์šฐ๋‚˜, ์ฝ”๋“œ ์„ธ๊ณ„์—์„œ๋Š” ํ›„์ž๊ฐ€ ๋ณด๋‹ค ๋‚˜์€ ๋ฐฉ์‹
    • ๊ฐœ์ธ์  ์ƒ๊ฐ: ์˜์–ด์ ์ธ ์‚ฌ๊ณ  ๋ฐฉ์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์งœ๋Š” ๊ฒƒ์ด ๋ณด๋‹ค ์ˆ˜์›”ํ•จ
      • ์ฃผ์–ด๋ถ€ํ„ฐ ์ƒ๊ฐ

Reference