# [Java] ๊ฐ์ฒด์ง€ํ–ฅ ์ƒํ™œ์ฒด์กฐ ์›์น™ 9๊ฐ€์ง€์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž
Study Repository

[Java] ๊ฐ์ฒด์ง€ํ–ฅ ์ƒํ™œ์ฒด์กฐ ์›์น™ 9๊ฐ€์ง€์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž

by rlaehddnd0422

๊ฐ์ฒด์ง€ํ–ฅ ์ƒํ™œ์ฒด์กฐ 9๊ฐ€์ง€ ์›์น™

์†ŒํŠธ์›์Šค ์•ค์†”๋Ÿฌ์ง€

์ฑ… ์†ŒํŠธ์›์Šค ์•ค์†”๋Ÿฌ์ง€์— ๋‚˜์˜ค๋Š” '๊ฐ์ฒด์ง€ํ–ฅ ์ƒํ™œ์ฒด์กฐ ์›์น™'์— ๋Œ€ํ•ด ์•Œ์•„๋ด…์‹œ๋‹ค.

๋ˆ„๊ตฌ๋‚˜ ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„๋ฅผ ์ž˜ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ฌด์˜์‹์ ์œผ๋กœ ๋ฒ„๋ฆฌ๊ธฐ ํž˜๋“  ์Šต๊ด€๋“ค๋กœ ์ธํ•ด '์ข‹์€ ์„ค๊ณ„'์˜ ๋ฐ”ํƒ์ด ๋˜๋Š” ํ•ต์‹ฌ ๊ฐœ๋…๋“ค(์‘์ง‘๋„, ๊ฒฐํ•ฉ๋„, ์ค‘๋ณต, ์บก์Šํ™”, ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ์„ฑ, ๊ฐ€๋…์„ฑ, ์ดˆ์ )์„ ๋†“์น˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

 

์ฑ…์— ์„œ์ˆ ๋œ ์›์น™๋“ค์„ ํ†ตํ•ด ์ข‹์€ ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„์˜ ์›์น™์„ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

์ฑ…์—๋Š” ์ด 9๊ฐ€์ง€์˜ ์›์น™์ด ์„œ์ˆ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

<๊ทœ์น™>

  1. ํ•œ ๋ฉ”์†Œ๋“œ์—๋Š” ์˜ค์ง ํ•œ ๋‹จ๊ณ„์˜ ๋“ค์—ฌ์“ฐ๊ธฐ๋งŒ ํ•œ๋‹ค.
  2. else ์˜ˆ์•ฝ์–ด๋ฅผ ์“ฐ์ง€ ์•Š๋Š”๋‹ค.
  3. ๋ชจ๋“  ์›์‹œ ๊ฐ’๊ณผ ๋ฌธ์ž์—ด์„ ํฌ์žฅํ•œ๋‹ค.
  4. ํ•œ ์ค„์— ์ ์„ ํ•˜๋‚˜๋งŒ ์ฐ๋Š”๋‹ค.
  5. ์ค„์—ฌ์“ฐ์ง€ ์•Š๋Š”๋‹ค(์ถ•์•ฝ ๊ธˆ์ง€).
  6. ๋ชจ๋“  ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ž‘๊ฒŒ ์œ ์ง€ํ•œ๋‹ค.
  7. 3๊ฐœ ์ด์ƒ์˜ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง„ ํด๋ž˜์Šค๋ฅผ ์“ฐ์ง€ ์•Š๋Š”๋‹ค.
  8. ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•œ๋‹ค.
  9. getter, setter, property๋ฅผ ์“ฐ์ง€ ์•Š๋Š”๋‹ค.

1. ํ•œ ๋ฉ”์†Œ๋“œ์—๋Š” ์˜ค์ง ํ•œ ๋‹จ๊ณ„์˜ ๋“ค์—ฌ์“ฐ๊ธฐ๋งŒ ํ•œ๋‹ค.

๋ณผ๋ฅจ์ด ํฐ ๋ฉ”์†Œ๋“œ๋Š” ์‘์ง‘๋„๊ฐ€ ๋–จ์–ด์ง€๊ธฐ ๋งˆ๋ จ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•˜๋‚˜์˜ ๋ฉ”์†Œ๋“œ๋Š” ํ•˜๋‚˜์˜ ์ผ๋งŒ ๋‹ด๋‹นํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋ฉ”์†Œ๋“œ์— ํ•œ ๊ฐ€์ง€ ์ผ๋งŒ ๋‹ด๋‹นํ•˜๋„๋ก ์„ค์ •ํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์œ ๋‹›์ด ๋” ์ž‘์•„์ง์— ๋”ฐ๋ผ ์žฌ์‚ฌ์šฉ์˜ ์ˆ˜์ค€์€ ์˜ฌ๋ผ๊ฐ€๊ณ , ์œ ์ง€๋ณด์ˆ˜์˜ ์žฅ์ ๋„ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • 1๊ฐœ์˜ ๋ฉ”์†Œ๋“œ ์•ˆ์—์„œ if / for / while ๋“ฑ์„ 2 depth ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ

์ž˜๋ชป๋œ ์˜ˆ์‹œ ์ฝ”๋“œ

public class Book {
    private char[][] data = new char[10][10];

    public Book(char[][] data) {
        this.data = data;
    }
    private String readBook() {
        StringBuffer buf = new StringBuffer();
        for (int i = 0; i < 10; i++) { // 1
            for (int j = 0; j < 10; j++) { // 2
                buf.append(data[i][j]);
            }
        }
        return buf.toString();
    }
}
  • readBook() ๋ฉ”์†Œ๋“œ๋ฅผ ๋ณด๋ฉด for๋ฌธ์—์„œ ๋“ค์—ฌ์“ฐ๊ธฐ๊ฐ€ 2 depth ๊นŒ์ง€ ์˜ฌ๋ผ๊ฐ„ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ˆ˜์ •๋œ ์˜ˆ์‹œ ์ฝ”๋“œ

public class Book {
    private char[][] data = new char[10][10];

    public Book(char[][] data) {
        this.data = data;
    }
    private String readBook() {
        StringBuffer buf = new StringBuffer();
        for (int i = 0; i < 10; i++) { // 1
            readLine(buf, i);
        }
        return buf.toString();
    }

    private void readLine(StringBuffer buf, int i) {
        for (int j = 0; j < 10; j++) { // 2
            buf.append(data[i][j]);
        }
    }
}
  • ์ด๋ ‡๊ฒŒ ๊ฐ๊ฐ์˜ ๋ฉ”์†Œ๋“œ์˜ ๋“ค์—ฌ์“ฐ๊ธฐ๊ฐ€ 1 depth ๋ฅผ ๋„˜์–ด๊ฐ€์ง€ ์•Š๋„๋ก ํ•จ์œผ๋กœ์จ, ๋†’์€ ๊ฐ€๋…์„ฑ๊ณผ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ด์™€ ๊ฐ™์ด ๋ฆฌํŽ™ํ† ๋งํ•˜๋ฉด ์ฝ”๋“œ์˜ ๋ฒ„๊ทธ๋ฅผ ์ฐพ๊ธฐ๋„ ๋Œ€์ฒด๋กœ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.

 

>>>>>>>>>> indent๋Š” 1 depth๋ฅผ ๋„˜์–ด๊ฐ€์ง€ ์•Š๋„๋ก ํ•˜์ž.


2. else ์˜ˆ์•ฝ์–ด๋ฅผ ์“ฐ์ง€ ์•Š๋Š”๋‹ค.

if/else ๊ตฌ๋ฌธ์€ ๋ชจ๋“  ์–ธ์–ด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ, ์—ฌ๋Ÿฌ ๊ฒน์œผ๋กœ ์ค‘์ฒฉ๋œ ์กฐ๊ฑด๋ฌธ์„ ์ ‘ํ•  ๊ฒฝ์šฐ else๊ฐ€ ์žˆ๋Š” ์ฝ”๋“œ๋Š” ์˜๋„๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์— ๋Œ€๋น„ํ•˜์—ฌ else๋ฌธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  if ์กฐ๊ฑด์— ๋งŒ์กฑํ•˜๋ฉด if ์‹คํ–‰๋ฌธ์œผ๋กœ ๋ฉ”์†Œ๋“œ๋ฅผ ์ข…๋ฃŒ๋˜๊ณ , ๋‚˜๋จธ์ง€ ์ฝ”๋“œ๋Š” ๊ธฐ๋ณธ ๋กœ์ง์„ ๋”ฐ๋ผ๊ฐ€๋Š” ๋ฐฉ๋ฒ•์„ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ž˜๋ชป๋œ ์˜ˆ์‹œ ์ฝ”๋“œ

public void login(String username, String password) {
    if (userRepository.isValid(username, password)) {
        redirect("homePage");
    } else {
        redirect("errorPage");
    }
}
public class Calculator {

    private int calculate(int a, int b, String op) {
        if (op.equals("*")) {
            return a * b;
        } else {
            return a + b;
        } 
    }
}

์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ์˜ else๋ฌธ์€ early return ๋ฌธ์„ ํ†ตํ•ด ์•„๋ž˜์™€ ๊ฐ™์ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ˆ˜์ •ํ•œ ์˜ˆ์‹œ ์ฝ”๋“œ

public void login(String username, String password) {
    if (userRepository.isValid(username, password)) {
        redirect("homePage");
    }
    
    redirect("errorPage");
}
public class Calculator {

    private int calculate(int a, int b, String op) {
        if (op.equals("*")) {
            return a * b;
        } 
        return a + b;
    }
}
  • ์ด๋ ‡๊ฒŒ ๋ฆฌํŽ™ํ† ๋งํ•˜์—ฌ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๊ฐ€๋…์„ฑ์ด ์ฆ๊ฐ€ํ–ˆ๊ณ , ์ดํ•ดํ•˜๊ธฐ๋„ ์‰ฌ์›Œ์กŒ์Šต๋‹ˆ๋‹ค.
  • ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ด๋ ‡๊ฒŒ else๋ฌธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด, optimistic(if๋ฌธ์„ ํ†ตํ•ด ๊ธฐ๋ณธ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๋”ฐ๋ฅด๊ฒŒ ํ•˜๋Š” ์กฐ๊ฑด์„ ์„ค์ •)ํ•˜๊ณ , defensive(๊ธฐ๋ณธ ์‹œ๋‚˜๋ฆฌ์˜ค์— ์ถฉ์กฑํ•˜์ง€ ์•Š์œผ๋ฉด ์˜ค๋ฅ˜ ์ƒํƒœ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก)ํ•˜๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

>>>>>>>>>>> else ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ๊ธˆ์ง€


3. ๋ชจ๋“  ์›์‹œ๊ฐ’๊ณผ ๋ฌธ์ž์—ด์„ ํฌ์žฅํ•œ๋‹ค.

๋ชจ๋“  ์›์‹œ๊ฐ’(primitive)์„ ๊ฐ์ฒด๋กœ ํฌ์žฅ(wrapper)ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์›์‹œํ˜• ๋ฐ์ดํ„ฐ๋Š” ๋ณ€์ˆ˜๋ช…์œผ๋กœ์„œ๋งŒ ๊ทธ ์˜๋ฏธ๋ฅผ ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ๊ณ  ์•„๋ฌด๋Ÿฐ ์˜๋ฏธ๋ฅผ ๋‹ด๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์›์‹œ๊ฐ’์„ ํด๋ž˜์Šค๋กœ ๊ฐ์‹ผ๋‹ค๋ฉด ๊ทธ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฌด์—‡์ธ์ง€, ๊ทธ๋ฆฌ๊ณ  ์™œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ๋ณด๋‹ค ๋ช…ํ™•ํ•˜๊ฒŒ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

์˜ˆ๋ฅผ ๋“ค๋ฉด, int ๊ฐ’ ํ•˜๋‚˜ ์ž์ฒด๋Š” ์•„๋ฌด ์˜๋ฏธ์—†๋Š” ์Šค์นผ๋ผ ๊ฐ’์ผ ๋ฟ์ด์ง€๋งŒ ์ด ๋ณ€์ˆ˜๋ฅผ ๊ฐ์ฒด๋กœ ๋ž˜ํ•‘ํ•˜๋ฉด ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ด์ ์ด ๋งŽ์Šต๋‹ˆ๋‹ค.

 

๊ธฐ์กด ์ฝ”๋“œ

private static int sum(int[] numArray) {
    int result = 0;
    for(int i = 0; i < numArray.length; i++) {
        int num = numArray[i];
        if(num < 0) {
            throw new RuntimeException();
        }
        result += num;
    }
    return result;
}

์ˆ˜์ •๋œ ์ฝ”๋“œ

public class Positive {
    private int number;

    public Positive(int number) {
        if (number < 0) {
            throw new RuntimeException();
        }
        this.number = number;
    }

    public Positive add(Positive other) {
        return new Positive(this.number + other.number);
    }

    public int getNumber() {
        return number;
    }
}
private static Positive[] toPositives(int[] values) {
    Positive[] numbers = new Positive[values.length];
    for (int i = 0; i < values.length; i++) {
        numbers[i] = new Positive(values[i]);
    }
    return numbers;
}
private static int sum(Positive[] numbers) {
    Positive result = new Positive(0);
    for (Positive number : numbers) {
        result = result.add(number);
    }
    return result.getNumber();
}
  • ์›์‹œํƒ€์ž…์ธ int๋ฅผ Positive ๊ฐ์ฒด๋กœ ๋ž˜ํ•‘ํ•จ์œผ๋กœ์จ, ๋„๋ฉ”์ธ์—์„œ ๊ฐ’์„ ์Šค์Šค๋กœ๋ฅผ ๊ฒ€์ฆํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์€ ๋ž˜ํ•‘์€ ์ƒ์œ„ ํด๋ž˜์Šค์— ๊ณผ๋„ํ•œ ์ฑ…์ž„์„ ์ฃผ๋Š” ๊ฒƒ์„ ๋ง‰๊ณ  ์ถ”๊ฐ€์ ์ธ ์š”๊ตฌ์‚ฌํ•ญ์— ๋Œ€์‘ํ•˜๊ธฐ ํŽธ๋ฆฌํ•ด๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋Ÿฌํ•œ ํด๋ž˜์Šค ๋ถ„๋ฆฌ๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ์ฝ”๋“œ๋ฅผ ์œ ๋„ํ•˜๊ณ  SOLID์˜ SRP, OCP๋„ ๋งŒ์กฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋•์Šต๋‹ˆ๋‹ค.

 

 

>>>>>>>>>>> ์›์‹œ์ ์ธ ํƒ€์ž… ์‚ฌ์šฉ์„ ์ง€์–‘ํ•˜๊ณ , ๋ž˜ํ•‘ํ•˜์—ฌ ๊ฐ์ฒด๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ง€ํ–ฅํ•˜์ž.


4. ํ•œ ์ค„์— ์  ํ•˜๋‚˜๋งŒ ์ฐ๋Š”๋‹ค.

์ ์€ ์ž๋ฐ”์—์„œ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ‚ค์›Œ๋“œ์ž…๋‹ˆ๋‹ค. ์ ์„ ์ด์šฉํ•ด ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ, ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„๋ฅผ ๋”ฐ๋ผ ๋ฉ€๋ฆฌ ๋–จ์–ด์ง„ ๊ฐ์ฒด์—๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋Š” ์„ค๊ณ„๋ฅผ ์ง€์–‘ํ•˜๋ผ๋Š” ์›์น™์ž…๋‹ˆ๋‹ค. 

 

์ด์™€ ๊ฐ™์€ ์„ค๊ณ„๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ๊ฐ์ฒด๊ฐ„ ๊ฒฐํ•ฉ๋„๊ฐ€ ์ƒ๊ธฐ๊ฒŒ ๋˜๊ณ  ์บก์Šํ™”๊ฐ€ ๊นจ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

๊ธฐ์กด ์ฝ”๋“œ

if(user.getMoney().getValue() > 100_000L) {
    throw new IllegalArgumentException("์†Œ์ง€๊ธˆ์€ 100_000์›์„ ์ดˆ๊ณผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
}

์ด ์ฝ”๋“œ์—์„œ๋Š” User, Money ๋‘ ๊ฐ์ฒด์— ์˜์กดํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

์ˆ˜์ •๋œ ์ฝ”๋“œ

if(user.hasMoney(100_000L)) {
    throw new IllegalArgumentException("์†Œ์ง€๊ธˆ์€ 100_000์›์„ ์ดˆ๊ณผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
}
  • ์ด์™€ ๊ฐ™์ด ๋ฆฌํŽ™ํ† ๋งํ•˜๋ฉด User ๊ฐ์ฒด์—๊ฒŒ๋งŒ ์˜์กดํ•˜๊ฒŒ ํ•˜์—ฌ, ์ด ์ฝ”๋“œ์—์„œ getMoney๋ฅผ ์ง์ ‘ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋‹จ์ง€ User์—๊ฒŒ ๋ฌผ์–ด๋ณด๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ธฐ์กด ์ฝ”๋“œ

private boolean isEqualToPostWriter(Member receiver, Post post) {
    return post.getMember().getNickname().equals(receiver.getNickname());
}
  • ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์„œ๋น„์Šค ํด๋ž˜์Šค์—์„œ๋Š” post ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, member์—๋„ ์˜์กดํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ˆ˜์ •ํ•œ ์ฝ”๋“œ

public boolean isOwnerEqualToNickname(String nickname) {
    return this.getMember().getNickname().equals(nickname);
}

Post Entity์— ์œ„์™€ ๊ฐ™์ด ๋ฉ”์†Œ๋“œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์ฑ…์ž„์„ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

private boolean isEqualToPostWriter(Member receiver, Post post) {
    return post.isOwnerEqualToNickname(receiver.getNickname());
}

์ฑ…์ž„์„ ๋ถ„๋ฆฌํ•˜์—ฌ ์„œ๋น„์Šค ํด๋ž˜์Šค์—์„œ๋Š” post์—๋งŒ ์˜์กดํ•˜๊ฒŒ ํ•˜์—ฌ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

>>>>>>>>>>> ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ๋„ˆ๋ฌด ๋จผ ๊ฐ์ฒด๋ฅผ ๋ถˆ๋Ÿฌ์™€์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ง€์–‘ํ•˜๋Š” ์Šต๊ด€์„ ๊ฐ€์ง€์ž.


5. ์ค„์—ฌ์“ฐ์ง€ ์•Š๋Š”๋‹ค. (์ถ•์•ฝ ๊ธˆ์ง€)

 

๋งŒ์•ฝ ํด๋ž˜์Šค๋‚˜ ๋ฉ”์„œ๋“œ์— ๋ถ™์ผ ์ ๋‹นํ•œ ์ด๋ฆ„์„ ์ฐพ์ง€ ๋ชปํ•œ๋‹ค๋ฉด ๋ญ”๊ฐ€ ์ž˜๋ชป๋˜์—ˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค.

์ฆ‰ ํด๋ž˜์Šค๋‚˜ ๋ฉ”์„œ๋“œ์— ๋ช…ํ™•ํ•œ ์ด๋ฆ„์„ ๋ถ™์ผ ์ˆ˜ ์žˆ์œผ๋ ค๋ฉด ๊ทธ ์—ญํ• ๊ณผ ์ฑ…์ž„์ด ๋‹จ์ˆœํ•ด์•ผ ํ•œ๋‹ค. 

 

ํด๋ž˜์Šค, ๋ฉ”์†Œ๋“œ, ๋ณ€์ˆ˜ ๋ช…๋ช…์‹œ ์ถ•์•ฝ์„ ํ•˜์ง€ ๋ง์ž๋Š” ๊ทœ์น™์ž…๋‹ˆ๋‹ค.

 

๊ฐ์ฒด์ง€ํ–ฅ ์„ธ๊ณ„์—์„œ๋Š” ํด๋ž˜์Šค๋ช…์ด๋‚˜ ํ•„๋“œ๋ช…, ๋ฉ”์†Œ๋“œ๋ช…์„ ์ถ•์•ฝํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. 

์ถ•์•ฝํ•˜๋ ค๋Š” ์ด์œ ๋Š” ๋ฉ”์†Œ๋“œ์˜ ์ด๋ฆ„์ด ๊ธธ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์•„๋งˆ ๊ทธ๋ ‡๋‹ค๋ฉด ๊ทธ ๋ฉ”์†Œ๋“œ๋Š” ๋งŽ์€ ์ฑ…์ž„์„ ์•ˆ๊ณ  ์žˆ์„ ํ™•๋ฅ ์ด ๋†’์Šต๋‹ˆ๋‹ค.

์ฑ…์ž„์„ ๋ถ„๋ฆฌํ•˜๋Š” ์Šต๊ด€์„ ๊ฐ€์ง‘์‹œ๋‹ค.

 

 

๊ธฐ์กด ์ฝ”๋“œ

 

public void example() {
        Customer customer = new Customer();
        customer.modifyNameAndAge("๋ณ€๊ฒฝํ›„์ด๋ฆ„", 20);
}

์ˆ˜์ •๋œ ์ฝ”๋“œ

public void example() {
    Customer customer = new Customer();
    customer.modifyName("๋ณ€๊ฒฝํ›„์ด๋ฆ„");
    customer.modifyAge(20);
}

 

>>>>>>>>>>> ์ฑ…์ž„์„ ๋ถ„๋ฆฌํ•œ๋‹ค๋ฉด, ์ด๋ฆ„์„ ๊ตณ์ด ์ถ•์•ฝํ•˜๋ ค๊ณ  ํ•˜์ง€ ์•Š์•„๋„ ์ด๋ฆ„์ด ๊น”๋”ํ•ด์ง„๋‹ค. ์ฑ…์ž„์„ ๋ถ„๋ฆฌํ•˜๋Š” ์Šต๊ด€์„ ๊ฐ€์ง€์ž.


6. ๋ชจ๋“  Entity๋Š” ์ž‘๊ฒŒ ์œ ์ง€ํ•œ๋‹ค.

์—”ํ‹ฐํ‹ฐ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ํ•˜๋‚˜์˜ ๋ชฉ์ ์„ ์—ผ๋‘ํ•˜๊ณ  ์„ค๊ณ„ํ•˜๋ผ๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. SOLID ์›์น™์ค‘ ๋‹จ์ผ ์„ค๊ณ„ ์›์น™์ธ SRP์™€ ์—ฐ๊ณ„๋˜๋Š” ๊ทœ์น™์ž…๋‹ˆ๋‹ค.

ํด๋ž˜์Šค์˜ ํฌ๊ธฐ๋ฅผ ์ค„์—ฌ ๋ถ„๋ฆฌํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด, ์ž‘์€ ์—ญํ• ์„ ํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

 

ํ•˜๋‚˜์˜ Class๋Š” 50์ค„์„ ๋„˜๊ธฐ์ง€ ์•Š๊ธฐ๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ตฌํ˜„์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๊ฒ ์ง€๋งŒ, ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๊ฐ€ 100 line์„ ๋„˜์–ด๊ฐ„๋‹ค๋ฉด ๋ถ„๋ช… ๋ถ„๋ฆฌํ•ด๋‚ผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ํ•˜๋‚˜์˜ ํŒจํ‚ค์ง€์—๋Š” 10๊ฐœ ์ด์ƒ์˜ ํŒŒ์ผ์ด ๋‹ด๊ธฐ์ง€ ์•Š๊ธฐ๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ํด๋ž˜์Šค ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํŒจํ‚ค์ง€๋„ ํด๋ž˜์Šค์ฒ˜๋Ÿผ ์‘์ง‘๋ ฅ ์žˆ๊ณ  ๋‹จ์ผํ•œ ๋ชฉํ‘œ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€๋ฅผ ์ž‘๊ฒŒ ์œ ์ง€ํ•จ์œผ๋กœ ํŒจํ‚ค์ง€ ์ž์ฒด๋กœ ์ •์ฒด์„ฑ์„ ์ง€๋‹ ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

 

>>>>>>>>>>> ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋Š” 50 line ์ด์ƒ, ํ•˜๋‚˜์˜ ํŒจํ‚ค์ง€๋Š” 10๊ฐœ ์ด์ƒ์˜ ํŒŒ์ผ์ด ๋ฌถ์ด์ง€ ์•Š๋„๋ก ํ•˜์ž. ํด๋ž˜์Šค ๋ถ„๋ฆฌ๋ฅผ ๋‘๋ ค์›Œํ•˜์ง€ ๋ง์ž.


7. 3๊ฐœ ์ด์ƒ์˜ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง„ ํด๋ž˜์Šค๋ฅผ ์“ฐ์ง€ ์•Š๋Š”๋‹ค.

ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ ์ œํ•œํ•˜๋ผ๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋Š” ์›์‹œ(primitive)ํƒ€์ž…์ด๋‚˜ ์ปฌ๋ ‰์…˜๊ณผ ๊ฐ™์ด ๊ธฐ๋ณธ ๋˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐํ˜•์˜ ๋ณ€์ˆ˜๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

 

๋„๋ฉ”์ธ ์š”์†Œ๋“ค์„ ์–ด๋–ป๊ฒŒ ๋ฌถ๊ณ  ๊ตฌ์„ฑํ•  ๊ฒƒ์ธ์ง€ ๊ทธ ์„ค๊ณ„์— ๋Œ€ํ•ด ์ถฉ๋ถ„ํžˆ ๊ณ ๋ฏผํ•˜์—ฌ ํด๋ž˜์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ , ๋ฆฌํŒฉํ† ๋ง ํ•˜๋ผ๋Š” ๊ทœ์น™์ž…๋‹ˆ๋‹ค. 

์ด ์ง€์นจ์€ 3๋ฒˆ ๊ทœ์น™๊ณผ๋„ ํ†ตํ•˜๋Š” ๊ทœ์น™์œผ๋กœ, ์›์‹œ๊ฐ’์„ ๊ฐ์ฒด๋กœ ํฌ์žฅํ•˜์—ฌ ๋„๋ฉ”์ธ์  ์˜๋ฏธ๋ฅผ ๋ถ€์—ฌํ•˜๋ผ๋Š” ๊ฐ€์ด๋“œ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

๊ธฐ์กด ์ฝ”๋“œ

class Name {
    String firstName;
    String lastName;
    // ... ์„ฑ๊ณผ ์ด๋ฆ„์— ๋Œ€ํ•œ ๊ธฐ๋Šฅ
}

์ˆ˜์ •๋œ ์ฝ”๋“œ

public class Name {
    FirstName firstName;
    LastName lastName;
}

class FirstName {
    String name;
    // ... ์ด๋ฆ„์— ๋Œ€ํ•œ ๊ธฐ๋Šฅ
}

class LastName {
    String name;
    // ... ์„ฑ์— ๋Œ€ํ•œ ๊ธฐ๋Šฅ
}

์ด ํšจ๊ณผ๋กœ 6๋ฒˆ ๊ทœ์น™์„ ์ง€ํ‚ค๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ํšจ๊ณผ๋„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

>>>>>>>>>>> ํด๋ž˜์Šค๋Š” ๋ถ„๋ฅ˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ตœ๋Œ€ํ•œ ๋ถ„๋ฅ˜ํ•˜์ž.


8. ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜์ž.

์ปฌ๋ ‰์…˜์„ Wrappingํ•˜๋ฉด์„œ Collection ์™ธ ๋‹ค๋ฅธ ํ•„๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์€ ํด๋ž˜์Šค๋ฅผ ์ผ๊ธ‰์ปฌ๋ ‰์…˜์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

public class Store {
    private Set<Brand> brands; // ์ปฌ๋ ‰์…˜

    public Store(List<Brand> brands) {
        validSize(brands);
        this.brands = brands;
    }

    private void validSize(List<Brand> brands) {
        if(brands.size() >= 10) {
            throw new IllegalArgumentException("๋ธŒ๋žœ๋“œ๋Š” 10๊ฐœ ์ดˆ๊ณผ๋กœ ์ž…์ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
        }
    }
}

Store์™€ ๊ฐ™์ด ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด, ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ํด๋ž˜์Šค Brand์—์„œ ๊ฒ€์ฆํ•˜์ง€ ์•Š๊ณ  ์œ„์™€ ๊ฐ™์ด ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜ Store์—์„œ ์ž์œจ์ ์œผ๋กœ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด 

Set<Brand> brands; -> Store store; ๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•œ๋ฐ, ํด๋ž˜์Šค ํƒ€์ž…์„ ๋ช…์‹œํ•ด์คŒ์œผ๋กœ์จ, ๋น„์ฆˆ๋‹ˆ์Šค์  ์˜๋ฏธ๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์„ ๋ฟ๋”๋Ÿฌ, ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ์— Set์ด ์•„๋‹Œ Store๋กœ ๋ช…์‹œํ•จ์œผ๋กœ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋กœ ์ œ์•ฝ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋”์šฑ ๋ช…ํ™•ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค์  ํ‘œํ˜„์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

>>>>>>>>>>  ์ผ๊ธ‰์ปฌ๋ ‰์…˜์€ '๋ณต์ˆ˜ํ˜• ํด๋ž˜์Šค' ๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์ข‹์€ ๋ฐฉ๋ฒ•์„ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ผ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ง‘ํ•ฉ์„ ์ด๋ฃจ๋ฉด์„œ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š”  ๋น„์ฆˆ๋‹ˆ์Šค์  ์˜๋ฏธ์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ•ด๋ณด๋ฉด ๋”์šฑ ๋‹ค์ฑ„๋กœ์šด ์„ค๊ณ„๋ฅผ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.


9. setter, getter, property๋ฅผ ์“ฐ์ง€ ์•Š๋Š”๋‹ค.

Entity์— getter/setter/property ์‚ฌ์šฉ์„ ์ง€์–‘ํ•ด ๊ฐ์ฒด ์ƒํƒœ ๋…ธ์ถœ์„ ์ตœ์†Œํ™” ํ•˜๋ผ๋Š” ๊ทœ์น™์ž…๋‹ˆ๋‹ค.

 

์ฆ‰, ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํ•ต์‹ฌ ๊ฐœ๋… ์ค‘ ์บก์Šํ™”๋ฅผ ์ง€ํ‚ค๋ฉด์„œ ๊ฐ์ฒด์— ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด ์Šค์Šค๋กœ ์ƒํƒœ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•˜๋ผ๋Š” ์˜๋ฏธ๋กœ ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ ‘๊ทผ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ดœ์ฐฎ์ง€๋งŒ, ๊ทธ ์ƒํƒœ๋ฅผ ๊ฐ์ฒด ๋ฐ”๊นฅ์—์„œ ๋ณ€๊ฒฝํ•˜๋ฉด ์•ˆ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•œ ๊ฐ์ฒด์˜ ์ƒํƒœ์— ๋Œ€ํ•œ ๊ฒฐ์ •์€ ๋ฐ˜๋“œ์‹œ ๊ฐ์ฒด ์•ˆ์—์„œ ์ด๋ฃจ์–ด์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

์ฃผ์˜ : ์ด ์ง€์นจ์€ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์„ ๋ชฉ์ ์œผ๋กœ ํ•˜๋Š” DTO๋‚˜ ํ”„๋กœ์„ธ์Šค ์ฒ˜๋ฆฌ๋ฅผ ๋ชฉ์ ์œผ๋กœ ํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ, ์„œ๋น„์Šค ๋นˆ ํด๋ž˜์Šค๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

๊ธฐ์กด ์ฝ”๋“œ

 

public class VipMemberService {

    private static final BigDecimal VIP_DEPOSIT_AMOUNT = new BigDecimal("1000000000");

    public void saveBenefit(Member member) {
        if (VIP_DEPOSIT_AMOUNT.compareTo(member.getTotalDepositAmount()) > 0) {
            throw new IllegalStateException("VIP ๊ณ ๊ฐ์ด ์•„๋‹™๋‹ˆ๋‹ค.");
        }
        // ...
    }
}
  •  ์œ„ ์ฝ”๋“œ์˜ ๋ฌธ์ œ
    • Member ํด๋ž˜์Šค๊ฐ€ ๊ฐ€์ง„ ์ •๋ณด๋ฅผ ์ง์ ‘ ๊บผ๋‚ด ํŒ๋‹จ์„ ์œ„ํ•œ ๊ทผ๊ฑฐ๋กœ ์‚ฌ์šฉ๋จ.
    • ์ฝ”๋“œ๋ฅผ ์ด๋ ‡๊ฒŒ ๊ตฌํ˜„ํ•  ๊ฒฝ์šฐ, VIP ํŒ๋ณ„ ๊ธฐ์ค€์ด DepositAmount์ด ์•„๋‹Œ ๋‹ค๋ฅธ ํ”„๋กœํผํ‹ฐ๋กœ ๋ณ€๊ฒฝ๋˜๋ฉด ์„œ๋น„์Šค ๊ณ„์ธต์—์„œ member.getTotalDepositAmount() ๋ถ€๋ถ„์„ ์ „๋ถ€ ๋‹ค ๋ณ€๊ฒฝ์ฃผ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
    • ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Member ํด๋ž˜์Šค์˜ ์ •๋ณด๋ฅผ ๊บผ๋‚ด ๋น„๊ตํ•˜๋Š” ๊ฒƒ ์™ธ์— ์–ด๋–ค ๋น„์ฆˆ๋‹ˆ์Šค์  ์˜๋ฏธ๋ฅผ ํ‘œํ˜„ํ•˜์ง€ ๋ชปํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. (๊ฐ€๋…์„ฑ์ด ๋‚ฎ์•„์ง„๋‹ค.)

 

์ˆ˜์ •ํ•œ ์ฝ”๋“œ

public class VipMemberService {

    public void saveBenefit(Member member) {
        if (!member.isVip()) {
            throw new IllegalStateException("VIP ๊ณ ๊ฐ์ด ์•„๋‹™๋‹ˆ๋‹ค.");
        }
        // ...
    }
}
  • getter๋ฅผ ์ œ๊ฑฐํ•œ ์ฝ”๋“œ.
  • ์กฐ๊ฑด๋ฌธ์˜ ๋ฌธ์žฅ์„ ๊ตณ์ด ํ•ด์„ํ•  ํ•„์š”๊ฐ€ ์—†์–ด์กŒ๊ณ , ์ฝ”๋“œ๊ฐ€ ์ง๊ด€์ ์œผ๋กœ ๋ณ€๊ฒฝ๋จ.

๊ฐ์ฒด์˜ ์ •๋ณด๋Š” ์ด๋ ‡๊ฒŒ ๊ฐ์ฒด์—์„œ ์ง์ ‘ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๊ตฌํ˜„ํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ์กฐ๊ฑด๋ฌธ์˜ ํ™œ์šฉ์—์„œ ์ด์™€ ๊ฐ™์€ ์‹ค์ˆ˜๊ฐ€ ๋งŽ์€๋ฐ, ์กฐ๊ฑด๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๋ณธ๋ž˜์˜ ๋ชฉ์ ์— ์ง‘์ค‘ํ•œ๋‹ค๋ฉด, ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์กฐ๊ฑด๋ฌธ์˜ ํŒ๋ณ„ ๊ธฐ์ค€์ด ํด๋ž˜์Šค์˜ ๋‚ด๋ถ€๋กœ ์ด๋™ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

>>>>>>>>>>> getter, setter๋ฅผ ์ง€์–‘ํ•˜๊ณ  ๊ฐ์ฒด์˜ ์ƒํƒœ๋Š” ๊ฐ์ฒด ๋‚ด๋ถ€์—์„œ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์ง€ํ–ฅํ•˜์ž.


 

<์ฐธ๊ณ  ์ž๋ฃŒ>

 

 

๋” ๋‚˜์€ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ํ–ฅํ•œ 9๋‹จ๊ณ„: ๊ฐ์ฒด์ง€ํ–ฅ ์ƒํ™œ ์ฒด์กฐ(1)

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

developerfarm.wordpress.com

 

 

๊ฐ์ฒด์ง€ํ–ฅ ์ƒํ™œ์ฒด์กฐ ์›์น™ (Object Calisthenics)

๋ฐ•์žฌ์„ฑ ๋‹˜์˜ ๊ฐ•์˜๋ฅผ ๋“ค์œผ๋ฉด์„œ ์ข‹์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ ํŒ์„ ๋ฐฐ์šฐ๊ณ  ์žˆ๋‹ค. ๊ทธ ์ค‘ ์ˆ˜์—… ์ดˆ๊ธฐ๋ถ€ํ„ฐ ๋“ฑ์žฅํ•˜๋Š” ์ด ์žฌ๋ฏธ์žˆ๋‹ค. ์ด ์šฉ์–ด๋Š” ๋งˆํ‹ด ํŒŒ์šธ๋Ÿฌ์˜ ์ฑ… ์ค‘ 6์žฅ์˜ ์ œ๋ชฉ์ด๋‹ค. 6์žฅ ์„œ๋‘์— ์ด๋Ÿฐ

devwooks.tistory.com

 

๊ฐ์ฒด์ง€ํ–ฅ ์ƒํ™œ ์ฒด์กฐ ์›์น™ 9๊ฐ€์ง€ ์ •๋ฆฌ!

์ตœ๊ทผ์— ์šฐ์•„ํ•œํ˜•์ œ๋“ค์—์„œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ๊ฐ์ฒด์ง€ํ–ฅ ์ƒํ™œ ์ฒด์กฐ ์›์น™๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ๋‹ค๋Š” ์–˜๊ธฐ๋ฅผ ์ฒ˜์Œ ์ ‘ํ–ˆ๋‹ค. ๊ฐ์ฒด์ง€ํ–ฅ ์ƒํ™œ ์ฒด์กฐ ์›์น™์— ๋Œ€ํ•ด ๊ด€์‹ฌ์„ ๊ฐ€์ง€๊ณ  ์ฐพ์•„๋ดค๊ณ , ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์‚ฌ์‹ค๊ณผ ์˜คํ•ด๋ผ๋Š”

jaehoney.tistory.com

 

 

[๊ฐ์ฒด์ง€ํ–ฅ ์ƒํ™œ์ฒด์กฐ ์›์น™] ๊ทœ์น™ 8. ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜์„ ์“ด๋‹ค

์ผ๊ธ‰ ์ปฌ๋ ‰์…˜ ์ปฌ๋ ‰์…˜์€ wrapping ํ•˜๋ฉด์„œ ์ปฌ๋ ‰์…˜ ์™ธ์˜ ๋‹ค๋ฅธ ํ•„๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์€ ํด๋ž˜์Šค๋ฅผ ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜ ์ด๋ผ๊ณ  ํ•œ๋‹ค. ์ด๋ฒˆ ์—ฌ๋Ÿ๋ฒˆ์งธ ์ง€์นจ์—์„œ๋Š” ๋„๋ฉ”์ธ ํด๋ž˜์Šค๋ฅผ ์ปฌ๋ ‰์…˜์œผ๋กœ ๊ฐ์‹ธ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ

limdingdong.tistory.com

 

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

Study Repository

rlaehddnd0422

ํ™œ๋™ํ•˜๊ธฐ