์ค๋ ์ฃผ์ ์ฌํญ (5/24, ์์์ผ)
- Git ํน๊ฐ
- Java ๋ฌธ๋ฒ ํ์ต
- ๊ฐ์ฒด์งํฅ (SOLID)
- ์ถ์ ํด๋์ค vs ์ธํฐํ์ด์ค
์์ผ๋ก๋ ๋ง์ ๋์์ด ๋ ๊ฒ ๊ฐ์์ ๊ธ์ ๋ฐ๋ก ์ ๋ฆฌํด๋์๋ค.
๐ฑ [Git] Pull request ์ฐ์ต
์๋์ ํด๋์ค ๋ค์ด์ด๊ทธ๋จ๊ณผ ์กฐ๊ฑด์ ์ฐธ๊ณ ํ์ฌ ๊ธฐ๋ฅ์ ๊ตฌํํด๋ณด์.
[ํด๋์ค ๋ค์ด์ด๊ทธ๋จ]
[์กฐ๊ฑด]
- ๊ณ์ฐ๊ธฐ๋ ๋ง์ , ๋บ์ , ๋๋์ , ๊ณฑ์ ์ฐ์ฐ์ ์ํํ๋ค.
calculate()
๋ฉ์๋๋String
ํ์ ์operator
๋งค๊ฐ๋ณ์๋ฅผ ํตํด ์ฐ์ฐ์ ๋งค๊ฐ๊ฐ์ ๋ฐ๋๋ค.int
ํ์ ์firstNumber
,secondNumber
๋งค๊ฐ๋ณ์๋ฅผ ํตํด ํผ์ฐ์ฐ์ ๊ฐ์ ๋ฐ๋๋ค.- ์ ๋ฌ๋ฐ์ ํผ์ฐ์ฐ์, ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฐ์ฐ์ ์ํํ๋ค.
Calculate.java
public class Calculator {
/* ๊ณ์ฐ ๋ฉ์๋ */
double calculate(String operator, int firstNumber, int secondNumber) {
double result = 0;
// operator๋ฅผ ํตํด ๋์ด์ค๋ ์ฐ์ฐ์๋ฅผ ๋น๊ตํด
// ๊ทธ์ ๋ง๋ ์ฐ์ฐ์ ์คํํ๋ค.
switch(operator) {
case "+":
result = firstNumber + secondNumber;
break;
case "-":
result = firstNumber - secondNumber;
break;
case "/":
result = firstNumber / secondNumber;
break;
case "*":
result = firstNumber * secondNumber;
break;
}
return result;
}
}
Main.java
public class Main {
public static void main(String[] args) {
Calculator cal = new Calculator();
// cal.calculate(String, int, int)
System.out.println("add: " + cal.calculate("+", 10, 10));
System.out.println("sub: " + cal.calculate("-", 7, 10));
System.out.println("div: " + cal.calculate("/", 5, 2));
System.out.println("mul: " + cal.calculate("*", 7, 9));
}
}
add: 20.0
sub: -3.0
div: 2.0
mul: 63.0
[ํด๋์ค ๋ค์ด์ด๊ทธ๋จ]
[์กฐ๊ฑด]
- ๋ง์ , ๋บ์ , ๋๋์ , ๊ณฑ์ ์ฐ์ฐ์ ์ํํ ํด๋์ค๋ค์ ๋ง๋ ๋ค.
- ๋ง๋ ํ
Calculator
ํด๋์ค์ ๊ด๊ณ๋ฅผ ๋งบ๋๋ค. (Is-a, Has-a ๋ฑ)- ํ์ํ๋ค๋ฉด
Calculator
ํด๋์ค์ ๋ด๋ถ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๋ค.
~~~Operation.java
: ์ฐ์ฐ ํด๋์ค๋ฉ์๋๋ฅผ ๋ณต์ฌํด์ ์ค๊ฐ ์ฐ์ฐ์๋ง ๋ฐ๊ฟ ๋ฉ์๋๋ฅผ ์์ฑํ๋ค. ์ฐ์ฐ์๋ง ๋ค๋ฅด๊ณ , ์์ ์ ๋ฐ๋ณต๋๊ธฐ ๋๋ฌธ์ ๋นํจ์จ์ ์ผ๋ก ๋ณด์ธ๋ค.
/* AddOperation.java */
public double operate(int firstNumber, int secondNumber) {
return firstNumber + secondNumber;
}
/* SubstractOperation.java */
public double operate(int firstNumber, int secondNumber) {
return firstNumber - secondNumber;
}
/* DivideOperation.java */
public double operate(int firstNumber, int secondNumber) {
return firstNumber / secondNumber;
}
/* MultiplyOperation.java */
public double operate(int firstNumber, int secondNumber) {
return firstNumber * secondNumber;
}
Calculate.java
public class Calculator {
/* ๋ง์
*/
public AddOperation addOperation = new AddOperation();
/* ๋บ์
*/
public SubstractOperation substractOperation = new SubstractOperation();
/* ๋๋์
*/
public DivideOperation divideOperation = new DivideOperation();
/* ๊ณฑ์
*/
public MultiplyOperation multiplyOperation = new MultiplyOperation();
/* ๊ณ์ฐ ๋ฉ์๋ */
double calculate(String operator, int firstNumber, int secondNumber) {
double result = 0;
// operator๋ฅผ ํตํด ๋์ด์ค๋ ์ฐ์ฐ์๋ฅผ ๋น๊ตํด
// ๊ทธ์ ๋ง๋ ์ฐ์ฐ ํด๋์ค์ operate() ํจ์๋ฅผ ํธ์ถํ๋ค.
switch(operator) {
case "+":
// result = firstNumber + secondNumber;
result = addOperation.operate(firstNumber, secondNumber);
break;
case "-":
// result = firstNumber - secondNumber;
result = substractOperation.operate(firstNumber, secondNumber);
break;
case "/":
// result = firstNumber / secondNumber;
result = divideOperation.operate(firstNumber, secondNumber);
break;
case "*":
// result = firstNumber * secondNumber;
result = multiplyOperation.operate(firstNumber, secondNumber);
break;
}
return result;
}
}
Main.java
public class Main {
public static void main(String[] args) {
// Calculator ๊ฐ์ฒด ์์ฑ
Calculator cal = new Calculator();
// cal.calculate(String, int, int)
System.out.println("add: " + cal.calculate("+", 10, 10));
System.out.println("sub: " + cal.calculate("-", 7, 10));
System.out.println("div: " + cal.calculate("/", 5, 2));
System.out.println("mul: " + cal.calculate("*", 7, 9));
}
}
add: 20.0
sub: -3.0
div: 2.0
mul: 63.0
Step 1
๊ณผ ๋น๊ตํ์ฌ ์ด๋ ํ ์ ์ด ๊ฐ์ ๋์๋์ง ์ค์ค๋ก ์๊ฐํด ๋ด
๋๋ค.๐ก hint. ํด๋์ค์ ์ฑ ์ (๋จ์ผ์ฑ ์์์น)
[A] ๊ธฐ์กด 'Step 1'์์๋ Calculator
ํด๋์ค์ calculate()
๋ฉ์๋๊ฐ ์ฐ์ฐ์ ๋น๊ต์ ์ฐ์ฐ ์์
์ ๋ชจ๋ ๋งก์๋ค. ์ด๋ ํ๋์ ํด๋์ค๋ ํ๋์ ์ฑ
์๋ง์ ์ ธ์ผํ๋ค
๋ ๊ฐ์ฒด์งํฅ ๋จ์ผ์ฑ
์์์น์ ์๋ฐฐ๋๋ค.
'Step 2'๋ก ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๋ฉด์๋ ๊ฐ ์ฐ์ฐ ํด๋์ค๋ค์ด ๋ง์
, ๋บ์
, ๋๋์
, ๊ณฑ์
์ค ํ๊ฐ์ง ์ฉ ์ํ์ ํ๊ณ ์๊ณ , calculate()
๋ฉ์๋๋ ์ฐ์ฐ์ ๋น๊ต๋ง์ ๋ด๋นํ๊ณ ์๋ค.
[ํด๋์ค ๋ค์ด์ด๊ทธ๋จ]
[์กฐ๊ฑด]
- Step 2์์ ๋ง๋ ์ฐ์ฐ ํด๋์ค๋ค์ ์ถ์ ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ถ์ํํ๋ค.
- ์ถ์ํํ ํ,
Calculator
ํด๋์ค์ ๋ด๋ถ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๋ค.Calculator
์calculate()
๋ฉ์๋์ ๋งค๊ฐ๋ณ์๊ฐ ๋ณ๊ฒฝ๋์์์ ํ์ธ.
AbstractOperation.java
: ์ถ์ ํด๋์ค์๊ฐ ์ถ์ ํด๋์ค๋ฅผ ์ธํฐํ์ด์ค๋ผ๊ณ ์์๋ค์ด์ ^^;; ๋์ค์ ์ดํด๊ฐ ๊ผฌ์ด๋ ๋ฐ๋์ ์ด์ํ ๊ณณ์์ ์๊ฐ์ ๋ฒ๋ ธ๋ค. abstract
์ interface
๋ฅผ ์์ผ๋ก๋ ํท๊ฐ๋ฆฌ์ง ๋ง์! ๋ฌผ๋ก interface
๋ฅผ ์ฌ์ฉํ์ด๋ ๋ฌธ์ ์์ด ๊ตฌํ๋์ ๊ฒ์ด๋ค.
public abstract class AbstractOperation {
// ๋ด์ฉ์ ๊ตฌํํ์ง ์์๋ ๊ด์ฐฎ๋ค.
public abstract double operate(int firstNumber, int secondNumber);
}
~~~Operation.java
: ์ฐ์ฐ ํด๋์ค์์ AbstractOperation
ํด๋์ค๋ฅผ ์์ ๋ฐ๋๋ค. ๊ฐ ํด๋์ค ๋ด๋ถ์ ๋ฉ์๋๋ Step 2์ ๋์ผํ๋ค.
/* AddOperation.java */
public class AddOperation extends AbstractOperation { }
/* SubstractOperation.java */
public class SubstractOperation extends AbstractOperation { }
/* DivideOperation.java */
public class DivideOperation extends AbstractOperation { }
/* MultiplyOperation.java */
public class MultiplyOperation extends AbstractOperation { }
Calculate.java
// ์ถ์ ํด๋์ค๋ฅผ ์ ์ธํด ํ์ ํด๋์ค๋ก๋ถํฐ์ ํ๋ณํ์ ์ด์ฉํ ๊ฒ์ด๋ค.
AbstractOperation operation;
// setter()๋ฅผ ์ฌ์ฉํด ์ฐ์ฐ์๋ฅผ ์ค์ ํ๋ค.
public void setOperation(AbstractOperation operation) {
this.operation = operation;
}
// calculate() ๋ฉ์๋์ ๋งค๊ฐ๋ณ์์์
// ์ฐ์ฐ์๋ฅผ ๋ฐ์์ค๋ String ๋ณ์๊ฐ ์ฌ๋ผ์ ธ
// ์ด ๋ฉ์๋๋ ์ฐ์ฐ์ ํธ์ถํ๋ ์ผ๋ง์ ํ๊ฒ ๋์๋ค.
double calculate(int firstNumber, int secondNumber) {
return operation.operate(firstNumber, secondNumber);
}
Main.java
public static void main(String[] args) {
// ์ฐ์ฐ์ ์ฌ์ฉํ ์ฐ์ฐ์ (๋ง์
)
AbstractOperation addOperation = new AddOperation();
// Calculator ๊ฐ์ฒด ์์ฑ
Calculator cal = new Calculator();
// Calculator์ ์ฐ์ฐ์ ์ค์
cal.setOperation(addOperation);
// ๊ฒฐ๊ณผ ์ถ๋ ฅ
System.out.println("add: " + cal.calculate(10, 10));
// ์ฐ์ฐ์ ์ฌ์ฉํ ์ฐ์ฐ์ (๊ณฑ์
)
AbstractOperation multiflyOperation = new MultiplyOperation();
// Calculator์ ์ฐ์ฐ์ ์ค์
cal.setOperation(multiflyOperation);
// ๊ฒฐ๊ณผ ์ถ๋ ฅ
System.out.println("mul: " + cal.calculate(7, 9));
}
add: 20.0
mul: 63.0
Step 2
์ ๋น๊ตํด์ ์ด๋ ํ ์ ์ด ๊ฐ์ ๋์๋์ง ์ค์ค๋ก ์๊ฐํด ๋ด
๋๋ค.๐ก hint. ํด๋์ค ๊ฐ์ ๊ฒฐํฉ๋, ์์กด์ฑ (์์กด์ฑ์ญ์ ์์น)
[A] ๊ธฐ์กด 'Step 2'์์๋ ๊ฐ ํด๋์ค๊ฐ ๊ฐ์ง๋ ์ฑ
์(์ํ)์ ๋ถ๋ดํ๋ ๊ฒ์ ์ฑ๊ณตํ์๋ค. ํ์ง๋ง Step 2๋ฅผ ๋ค์ ๋ณด๋ฉด, Calculate
ํด๋์ค์ ์ฐ์ฐ ํด๋์ค ๊ฐ ๊ฒฐํฉ๋๊ฐ ๋์ ๊ฒ์ ๋ณผ ์ ์๋ค.
'Step 3'์์๋ ์ถ์ ํด๋์ค์ธ AbstractOperation
์ ๋ง๋ค์ด, ๋ค๋ฅธ ์ฐ์ฐ ํด๋์ค๋ค์ด ์ถ์ ํด๋์ค๋ฅผ ์์ ๋ฐ์ ์ ์๋๋ก ํ๋ค. ๊ทธ๋ฐ ๋ค์ Calculate
ํด๋์ค์ AbstractOperation
ํด๋์ค๊ฐ ํฌํจ ๊ด๊ณ๋ฅผ ๋งบ์ผ๋ฉด ๊ฒฐํฉ๋๊ฐ ๋ฎ์์ง๋ค. (์ถ์ ํด๋์ค๋ ํ์ ํด๋์ค๋ก์ ํ๋ณํ์ด ๊ฐ๋ฅํ๋ค)
๊ทธ๋ฆฌ๊ณ Caculate
ํด๋์ค๋ ๊ตฌ์ฒดํ๋(=๊ตฌํ๋ถ) ์ฐ์ฐ ํด๋์ค์ ๊ธฐ๋ฅ์ ์์กดํ๊ณ ์์๋ค. ์ด๋ ๊ฐ์ฒด์งํฅ ์์น ์ค, '๊ตฌ์ฒด์ ์ธ ๊ฒ์ด ์๋๋ผ ์ถ์ํ๋ ๊ฒ์ ์์กดํ๋ผ'๋ ์์กด์ฑ ์ญ์ ์ ์์น์ ์๋ฐฐ๋๋ค.
์์กด์ฑ ์ญ์ ์ ์์น(DIP)๋ฅผ ์งํค๋ ์ด์ ๋, ์์ ์ ์ฉ์ดํ๊ฒ ํ๊ธฐ ์ํจ์ด๋ค. ๊ตฌํ๋ถ ํด๋์ค(๊ตฌ์ฒดํ๋ ํด๋์ค)๋ ์ฝ๋ ๋ณํ์ ์ํฅ์ ํฌ๊ฒ ๋ฐ๊ธฐ ๋๋ฌธ์ ๊ทธ ํด๋์ค์ ์์กดํ๊ณ ์๋ ํด๋์ค๋ ์ํฅ์ ๋ฐ๊ฒ ๋๋ค.
ํ์ง๋ง ๊ตฌํ๋ถ์ ์์์ ์๋ ์ถ์ ํด๋์ค๋ ์ํฅ์ ๋ฐ์ ์ผ์ด ์ ๊ธฐ ๋๋ฌธ์, ์ถ์ ํด๋์ค์ ์์กดํ๋ ๊ฒ์ด ๊ตฌ์กฐ์ ๋ฐ๋์งํ๋ค๋ ๊ฒ์ด๋ค.
๊ธฐ์กด ์ฐ์ฐ ํด๋์ค๋ค ๋์ ์ถ์ ํด๋์ค๋ฅผ ํฌํจํ๊ณ , ์ฐ์ฐ์๋ ๋งค๊ฐ๋ณ์๊ฐ ์๋ setter (setOperation() ๋ฉ์๋)
๋ฅผ ํตํด ์ค์ ํ๋๋ก ํ๋ค. 'Step 3'์์๋ Main
์์ ์ฌ์ฉํ ์ฐ์ฐ์๋ฅผ ์์ฑํ๊ณ , Calculator
ํด๋์ค์ setter
๋ฅผ ํตํด ์ฐ์ฐ์๋ฅผ ์ ๋ฌํ๋ค. ์ฐ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ ๋๋ ์ฐ์ฐ์ด ํ์ํ firstNumber
์ secondNumber
๋ง Calculator.operate()
๋ฉ์๋๋ก ์ ๋ฌํด์ฃผ๋ฉด ๋๋ค.
Step 1โ2๋ก๋ถํฐ์ ๋ณํ์, Step 2โ3๋ก๋ถํฐ์ ๋ณํ๋ฅผ SOLID์ ์ฎ์ด์ ์ค๋ช ํ๋ ค๋ฉด ๋ฐ๋ก ๊ฐ์ฒด์งํฅ์์น์ ๋ํ ํ์ต์ด ํ์ํด์ ์๊ฐ์ด ์ค๋๊ฑธ๋ ธ๋ค.
ํ์ง๋ง ๋ฏธ๋ฃจ๋ฉด ๋ค์์ ๋ด๊ฐ ํด๋๋ฆฌ๋ ๋ณด์ฅ๋ ์์ ๊ฒ ๊ฐ๊ณ ... ๊ผญ ํ๊ณ ์ ๋ค๊ณ ์ถ์๊ธฐ ๋๋ฌธ์ ํ๊ณ ๋๋ ๊ธฐ๋ถ์ ์ข๋ค! (^โ^)
์ถ๊ฐ๋ก 'Step 3'์ ์ถ์ ํด๋์ค
์์ -> ์ธํฐํ์ด์ค
ํํ๋ก ๋ฐ๊พธ๋ ๊ฒ์ ์ด๋ ต์ง ์๋ค. ์๋์ฒ๋ผ๋ง ๋ฐ๊ฟ์ฃผ๋ฉด ๋!
public interface AbstractOperation {
public double operate(int firstNumber, int secondNumber);
}
// ๋ค๋ฅธ ์ฐ์ฐ ํด๋์ค๋ค๋ ์ด๋ ๊ฒ ํด์ฃผ๋ฉด ๋๋ค.
public class AddOperation implements AbstractOperation { /* ๋ฉ์๋๋ ๊ทธ๋๋ก */ }
๊ทธ๋ ๋ค๋ฉด ์ด๋ ๊ฒ ๋ณด๋ฉด ์ฐจ์ด๊ฐ ์๋๋ฐ, ๋์ ์ด๋ป๊ฒ ๊ตฌ๋ถํด์ ์ฐ๋ ๊ฑธ๊น? ๋, ์ ์ด ๊ณ์ฐ๊ธฐ ๋ฌธ์ ์์๋ ์ถ์ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ผ๊ณ ํ์๊น? ๊ฐ์ ์๋ฌธ์ ์ด ์๊ธด๋ค...
์ถ์ ํด๋์ค์ ์ธํฐํ์ด์ค๋ ์กด์ฌ ๋ชฉ์ ์ด ๋ค๋ฅด๋ค.
์ถ์ ํด๋์ค
์ ๋ชฉ์ ์ ๊ทธ ์ถ์ ํด๋์ค๋ฅผ ์์ ๋ฐ์์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ณ , ํ์ฅ์ํค๋๋ฐ ์๋ค. ๋ฐ๋ฉด, ์ธํฐํ์ด์ค
์ ๋ชฉ์ ์ ๋ช
์ํ ํจ์์ ๊ตฌํ์ ๊ฐ์ ํ๋๋ฐ ์๋ค. ๊ตฌํ์ ๊ฐ์ ํจ์ผ๋ก์จ ๊ตฌํ ๊ฐ์ฒด์ ๋์ผํ ๋์์ ๋ณด์ฅํ ์ ์๋ ๊ฒ์ด๋ค.
์ฆ, ์์์ ๋ฐ์์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ณ ํ์ฅ ์ํค๋ ค๋ฉด ์ถ์ ํด๋์ค๋ฅผ, ๋ช ์ํ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๊ฒ์ด ๋ชฉ์ ์ด๋ผ๋ฉด ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
๋ณด๋ ์๊ฐ์ ๋ฐ๋ผ ๊ตฌํ ์๊ตฌ์ฌํญ์ ์ฐจ์ด๊ฐ ์๊ธด ๊ฒ ๊ฐ๋ค. (์ถ์ธก) ์ ๋ฌธ๋จ์ ๋ฐ๋ฅด๋ฉด ์๋ง ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋๋ฐ์ ์ข ๋ ์ง์คํ ๊ฒ์ ์๋๊น? ๋๋ [์กฐ๊ฑด]์ ์ฒ์ ์ฝ์์ ๋, '๊ธฐ๋ฅ์ ๊ตฌํํ๋ค'์ ์ด์ ์ ๋๊ณ ์ฝ์ด์ ์ถ์ ํด๋์ค๋ฅผ ์ธํฐํ์ด์ค๋ก ์ค๋ ํ์๋ค.
์์ ํด๋์ค๊ฐ ๊ฐ์ ์ด๋ฆ์ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฒฝ์ฐ์๋, ์คํ ์์ ์ค์ ๋ก ์ด๋ค ๋ฉ์๋๊ฐ ์คํ๋ ์ง ๋ชจํธ์ฑ์ด ์๊ฒจ๋ฒ๋ฆฐ๋ค. Java๋ ์ด ๋ชจํธ์ฑ์ ๋ฏธ์ฐ์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ค์ค ์์์ ์ง์ํ์ง ์๋๋ค๊ณ ํ๋ค.
ํ์ง๋ง ์ธํฐํ์ด์ค๋ ์๋์ฒ๋ผ ์ฌ๋ฌ ์ธํฐํ์ด์ค๋ฅผ ๋ฐ์์์ ๊ตฌํํ ์ ์๋ค. (์ด๋ ์์์ด ์๋๋ค!!)
class Car implements vehicle, engine {}
์ ๋ฆฌ๋ฅผ ์์ฒญ ์๋ฒฝํ๊ฒ ํด์ฃผ์ จ๋ค์..
์ฝ๋ ์ ์ฅ์์๋ ๋๋ฌด ์ ์ ์ ์ฝํ๊ณ ์ด๋ค ๊ฑธ ๋ฐฐ์ฐ์ จ๋์ง ํ๋ฒ์ ์์์์ด์ !
์์ผ๋ก๋ ํ์ดํ ๋น ์ ์ ๋๋ค !!