๊ฐ์ฒด ๊ฐ์ ๊ฒฐํฉ๋์ ๋คํ์ฑ
11/29 11:10 ~ 12:30 (์ฝ 1์๊ฐ 20๋ถ ์งํ)
โญ ์ค์ ํค์๋ โญ
- ๊ฐ์ฒด ๊ฐ์ ๊ฒฐํฉ๋
- ๋คํ์ฑ
- DI ์์กด์ฑ ์ฃผ์
- IoC ์ ์ด์ ์ญ์
- ๊ฐ์ฒด ์งํฅ 4๊ฐ์ง ํน์ง
1. ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํ ๋คํ์ฑ
์๋๋ฆฌ์ค 1 - ์๋์ฐจ ์ฃผํ ํ๋ก๊ทธ๋จ
์๋ฌด : ์๋์ฐจ๋ฅผ ์ฃผํ์ํค๋ ํ๋ก๊ทธ๋จ์ ๋ง๋์ธ์.
senario1.directBinding ํจํค์ง์ Car, GasEngine, ElectricEngine, Main ํด๋์ค ์์ฑ
package senario1.directBinding;
public class Car {
// 1. ์์ฑ
private GasEngine engine;
// 2. ์์ฑ์
public Car(){
this.engine = new GasEngine();
}
public void drive() {
System.out.println("์๋์ฐจ๊ฐ ์ฃผํ๋ฉ๋๋ค.");
this.engine.run();
}
}
package senario1.directBinding;
public class GasEngine {
// 1. ์์ฑ
// 2. ์์ฑ์
// 3. ๊ธฐ๋ฅ
public void run() {
System.out.println("๊ฐ์ค ์์ง์ด ๋์ํฉ๋๋ค.");
}
}
package senario1.directBinding;
public class Main {
public static void main(String[] args) {
Car carA = new Car();
carA.drive();
}
}
โ๏ธ ๊ฐ๊ฒฐํฉ
๊ฐ์ฒด ๊ฐ์ ์์กด์ฑ์ด ๋์ ๋ ๊ฒฐํฉ๋๊ฐ ๊ฐํ๋ค.
์๋๋ฆฌ์ค 1 - ์๋ก์ด ์๊ตฌ์ฌํญ
์๋ก์ด ์์ง(ElectricEngine)์ด ๊ฐ๋ฐ๋์์ต๋๋ค. ์๋์ฐจ๊ฐ ์๋ก ๊ฐ๋ฐ๋ ์์ง์ ์ฌ์ฉํ์ธ ํด์ฃผ์ธ์.
package senario1.directBinding;
public class Car {
// 1. ์์ฑ
private GasEngine engine;
private ElectircEngine electircEngine; // ์์
// 2. ์์ฑ์
public Car(){
this.engine = new GasEngine();
this.electircEngine = new ElectircEngine(); // ์์
}
public void drive() {
System.out.println("์๋์ฐจ๊ฐ ์ฃผํ๋ฉ๋๋ค.");
this.engine.run();
}
public void driveWithElectricEngine() { // ์์
System.out.println("์๋์ฐจ๊ฐ ์ฃผํ๋ฉ๋๋ค.");
this.electircEngine.run();
}
}
package senario1.directBinding;
public class ElectircEngine {
// 3. ๊ธฐ๋ฅ
public void run() {
System.out.println("์ ๊ธฐ ์์ง์ด ๋์ํฉ๋๋ค.");
}
}
package senario1.directBinding;
public class Main {
public static void main(String[] args) {
Car carA = new Car();
//carA.drive();
carA.driveWithElectricEngine();
}
}
์ฝ๋๋ฅผ ์์ฑํ์ง๋ง ์ด๋ ๊ฒ ์์ฑํ ์ฝ๋๋ ๊ฐํ ๊ฒฐํฉ๋(๊ฐ๊ฒฐํฉ)๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
์ฝ๋๊ฐ ๊ฐ๊ฒฐํฉ์ด๋ผ๋ฉด ์ ์ง๋ณด์์ ์ข์ง ์๋ค..
์๋๋ฆฌ์ค 1 - ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํ ํด๊ฒฐ ๋ฐฉ๋ฒ
senario1.looseCoupling ํจํค์ง์ Engine ์ธํฐํ์ด์ค์ Car, GasEngine, ElectricEngine, Main ํด๋์ค ์์ฑ
package senario1.looseCoupling;
public interface Engine {
void run();
}
package senario1.looseCoupling;
public class GasEngine implements Engine{
@Override
public void run() {
System.out.println("๊ฐ์ค ์์ง์ด ๋์ํฉ๋๋ค.");
}
}
package senario1.looseCoupling;
public class ElectricEngine implements Engine{
@Override
public void run() {
System.out.println("์ ๊ธฐ ์์ง์ด ๋์ํฉ๋๋ค.");
}
}
package senario1.looseCoupling;
public class Car {
// ์์ฑ
private Engine engine;
// ์์ฑ์
public Car(Engine engine) {
this.engine = engine;
}
// ๊ธฐ๋ฅ
public void drive() {
this.engine.run();
}
}
package senario1.looseCoupling;
public class Main {
public static void main(String[] args) {
GasEngine gasEngine = new GasEngine();
ElectricEngine electricEngine = new ElectricEngine();
Car gasCar = new Car(electricEngine);
gasCar.drive();
}
}
์๋ก์ด ์์ง ๊ฐ์ฒด๊ฐ ์๊ธด๋ค๊ณ ํด๋ ์๋์ฐจ ๊ฐ์ฒด๋ ๋ณ๊ฒฝ์์ ์์ ๋ก์์ง๋ค.
2. ๋คํ์ฑ
ํ๋์ ๊ฐ์ฒด๊ฐ ์ฌ๋ฌ ๊ฐ์ง ํ์ฑ๋ฅผ ๊ฐ์ง ์ ์๋ ๊ฒ์ด๋ค.
์ด๋ฌํ ํน์ง์ ์ ํ์ฉํ๋ฉด ๊ฐ์ฒด ๊ฐ์ ๋์จํ ๊ฒฐํฉ๋๋ฅผ ๊ตฌํํ ์ ์๋ค.
3. ์์กด์ฑ์ฃผ์ (DI : Dependency Injection)
๊ฐ์ฒด์ ํ์ํ ๊ฐ์ฒด๋ฅผ ์ฃผ์ ํด ์ฃผ๋ ๊ฒ์ ์์กด์ฑ ์ฃผ์ ์ด๋ผ๊ณ ํ๋ค.
public class Main {
public static void main(String[] args) {
GasEngine gasEngine = new GasEngine();
Car gasCar = new Car(gasEngine); // ์์กด์ฑ ์ฃผ์
! Car ๊ฐ์ฒด์ Engine ํ์
์ ๊ฐ์ฒด๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ Engine์ ์ธ์คํด์คํํด์ ๋ฃ์ด์ค๋ค!
...
}
}
public class Car {
...
public Car(Engine engine) {
this.engine = engine;
}
...
}
4. ์ ์ด์ ์ญ์ (IoC : Inversion of Control)
ํ๋ก๊ทธ๋จ ์คํ ํ๋ฆ์ ์ ์ด๊ถ์ ์ 3์ ์ฃผ์ฒด(์ธ๋ถ)๋ก ๋๊ฒจ์ฃผ๋ ๊ฒ์ด๋ค.
IoC๋ ๊ฐ์ฒด ์์ฑ, ์์กด์ฑ ๊ด๋ฆฌ๋ฅผ ์ธ๋ถ์์ ๊ด๋ฆฌํ๋๋ก ํ์ฌ ๊ฐ์ฒด ๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๋ ์ค๊ณ ์์น์ด๋ค.
์คํ๋ง์์๋ IoC ์ปจํ
์ด๋๊ฐ ์ด ์ญํ ์ ํ๋ค.
- ๊ฐ์ฒด ์์ฑ์ ๋ํ ์ฑ ์์ ์ธ๋ถ๋ก ์ ๊ฐ
- ์ด๋ค ์์ง์ ๊ตฌํํ ์ง ๊ฒฐ์ ์ ์ธ๋ถ๋ก ์ ๊ฐ
public class Main {
public static void main(String[] args) {
ElectricEngine electricEngine = new ElectricEngine(); // ๊ฐ์ฒด ์์ฑ์ ๋ํ ์ฑ
์์ ์ธ๋ถ๋ก ์ ๊ฐ.
GasEngine gasEngine = new GasEngine();
Car electricCar = new Car(electricEngine); // ์ด๋ค ์์ง์ ๊ตฌํํ ์ง ์ฑ
์์ ์ธ๋ถ๋ก ์ ๊ฐ.
Car gasCar = new Car(gasEngine);
electricCar.drive();
gasCar.drive();
}
}
5. ์์์ ํ์ฉํ ๋คํ์ฑ
์๋๋ฆฌ์ค 2 - ์๋์ฐจ ๋ถํ ๊ฒ์ ํ๋ก๊ทธ๋จ
์๋์ฐจ ๋ถํ์ ๊ฒ์ํ ์ ์๋ ํ๋ก๊ทธ๋จ์ ๋ง๋์ธ์.
package senario2.directBinding;
/**
* ๋ธ๋ ์ดํฌ ๊ฐ์ฒด
*/
public class Brake {
private String name; // ๋ธ๋ ์ดํฌ ์ด๋ฆ
private boolean isInspected; // ๊ฒ์ ์ฌ๋ถ(true/false)
public Brake(String name) {
this.name = name;
this.isInspected = false;
}
// ๊ฒํฐ
public boolean getIsInspected() {
return this.isInspected;
}
// ์ธํฐ
public void setInInspected(boolean isInspected) {
this.isInspected = isInspected;
}
}
package senario2.directBinding;
/**
* ๋ธ๋ ์ดํฌ ๊ฒ์ ์ญํ ๋ด๋น ๊ฐ์ฒด
*/
public class InspectService {
// ๊ธฐ๋ฅ
public void inspect(Brake brake) {
System.out.println("๊ฒ์๋ฅผ ์์ํฉ๋๋ค.");
System.out.println(brake.getIsInspected()); // false
brake.setInInspected(true);
System.out.println("๋ณ๊ฒฝ๋์์ต๋๋ค -> " + brake.getIsInspected()); // true
}
}
package senario2.directBinding;
public class Main {
public static void main(String[] args) {
Brake brake = new Brake("๋์คํฌ ๋ธ๋ ์ดํฌ");
InspectService inspectService = new InspectService();
inspectService.inspect(brake);
}
}
์๋ก์ด ๋ถํ(Sensor)์ด ์ถ๊ฐ๋๋ค๋ฉด..?
public class Main {
public static void main(String[] args) {
Brake brakeA = new Brake("๋์คํฌ ๋ธ๋ ์ดํฌ");
Sensor sensor = new Sensor("์ถฉ๋๋ฐฉ์ง");
InspectService inspectService = new InspectService();
inspectService.inspect(brakeA);
inspectService.inspect(sensor); // ์๋ฌ๋ฐ์
}
}
์๋๋ฆฌ์ค 2 - ์์์ ํ์ฉํ ํด๊ฒฐ
package senario2.looseCoupling;
/**
* ์๋์ฐจ ๋ถํ(๋ถ๋ชจํด๋์ค)
* ๊ฒ์๋ง ๋ฐ์์ผ ํด!
*/
public abstract class CarPart {
// ์์ฑ
private boolean isInspected;
// ์์ฑ์
public CarPart(boolean isInspected) {
this.isInspected = isInspected;
}
// ๊ธฐ๋ฅ
public void inspect() {
System.out.println("๊ฒ์๋ฅผ ์งํํฉ๋๋ค.");
this.isInspected = true;
System.out.println(" -> " + this.isInspected );
}
}
package senario2.looseCoupling;
public class Brake extends CarPart{
private String name;
public Brake(String name) {
super(false);
this.name = name;
}
public void stop() {
System.out.println("๋ฉ์ถ ์ ์๋ค.");
}
}
package senario2.looseCoupling;
public class InspectService {
// ๊ธฐ๋ฅ
public void inspect(CarPart carPart) {
carPart.inspect();
}
}
package senario2.looseCoupling;
public class Main {
public static void main(String[] args) {
Brake brake = new Brake("๋์คํฌ ๋ธ๋ ์ดํฌ");
InspectService inspectService = new InspectService();
inspectService.inspect(brake);
}
}
์ถ์ํ
๊ฐ์ฒด ๋ณธ์ง์ ์ง์คํ ์ ์๊ฒ ๋ณธ์ง ์ธ์ ์ ๋ณด๋ฅผ ์จ๊ธฐ๋ ๊ฒ์ด๋ค.
์ธํฐํ์ด์ค vs ์์
ํน์ง | ์ธํฐํ์ด์ค | ์์ |
์ฝ๋ ์ฌ์ฌ์ฉ์ฑ | โ ๊ตฌํ์ฒด์์ ๊ฐ์ ๊ตฌํ ํ์ | โ๏ธ ๋ถ๋ชจํด๋์ค ๊ฒ์ ๊ทธ๋๋ก ์ฌ์ฉ๊ฐ๋ฅ |
๊ตฌํ ๊ฐ์ ์ฑ | โ๏ธ ๋ชจ๋ ๋ฉ์๋ ๊ตฌํ ๊ฐ์ ๋ณด์ฅ | โ ํ์ํ ๊ฒ๋ง ์ฌ์ ์ |
๊ณ์ธต ํํ | โ ๋ถ์ ํฉ | โ๏ธ ์ ํฉ |
๋ค์ค ๊ตฌํ ๊ฐ๋ฅ | โ๏ธ implements ์ฌ๋ฌ ๊ฐ ๊ฐ๋ฅ | โ extends ์ฌ๋ฌ ๊ฐ ๋ถ๊ฐ๋ฅ |
6. ๊ฐ์ฒด ์งํฅ 4๊ฐ์ง ํน์ง (๋ฉด์ ๋จ๊ณจ ์ง๋ฌธ)โญโญโญโญโญ
์ถ์ํ
๋ถํ์ํ ๊ตฌํ์ ์จ๊ธฐ๊ณ ๊ฐ์ฒด์ ๋ณธ์ง์ ์ธ ๋ถ๋ถ์๋ง ์ง์คํ ์ ์๊ฒ ํ๋ ์ค๊ณ์ด๋ค.
- ๋ถ๋ชจ ํด๋์ค(CarPart)์์ ๊ฒ์์ ๊ด๋ จ๋ ๊ณตํต ์์ฑ๊ณผ ๋์์ ์ ์ํด์ ์์ ํด๋์ค(Brake ๋๋ ํ์ด์ด)๋ ๊ฒ์๋ฅผ ์ ๊ฒฝ ์ธ ํ์ ์์ด ์ค์ค๋ก ์ญํ (brake.stop( ))์ ์ง์คํ ์ ์๋ค.
์์
๋ถ๋ชจ ํด๋์ค์ ์์ฑ๊ณผ ๊ธฐ๋ฅ์ ์์ ํด๋์ค๊ฐ ๋ฌผ๋ ค๋ฐ๋ ๊ฒ์ด๋ค.
- ๋ถ๋ชจ ํด๋์ค์์ ์ ์๋ ์์ฑ(isInspected)๊ณผ ๋ฉ์๋(inspect( ))๋ฅผ ์์ ํด๋์ค์์ ๋ฌผ๋ ค๋ฐ์ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์๋ค.
์บก์ํ
์ธ๋ถ์์ ์ ๊ทผ์ ์ ์ดํ๋ ๊ฒ์ด๋ค. ๋ฐ์ดํฐ๋ฅผ ๋ณดํธํ๋ค.
- ํด๋์ค์์ ์ ๊ทผ ์ ์ด์(private, public)๋ฅผ ์ฌ์ฉํด์ ํ์ํ ์ ๋ณด๋ง ์ธ๋ถ๋ก ๋ ธ์ถํ๊ณ ๋ถํ์ํ ์ ๋ณด๋ ์ธ๋ถ๋ก๋ถํฐ ๊ฐ์ถ๊ณ ๋ณดํธํ ์ ์๋ ์ค๊ณ๋ฅผ ํ ์ ์๋ค.
๋คํ์ฑ
๊ฐ์ ํ์ ์ ์ฐธ์กฐ๋ณ์๊ฐ ์ฌ๋ฌ ๊ฐ์ง ํํ๋ฅผ ๊ฐ์ง ์ ์๋ ๊ฒ์ด๋ค.
- ์ธํฐํ์ด์ค์ ์์์ ํตํด ๋ค์ํ ํ์ ์ ๋ฐ์ ์ ์๋ ๊ตฌ์กฐ๋ฅผ ์ค๊ณํจ์ผ๋ก์จ ๊ฐ์ฒด ๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ ์ ์๋ค.
'Today I Learned(TIL) > ์ธ์ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Java ์ถ๊ฐ ๋ฏธ๋ ๊ณผ์ _๋คํ์ฑ, DI ์ฐ์ต (1) | 2024.12.02 |
---|---|
Java ์ธ์ _๋น๊ต๋ ๋ฌด์์ผ๊น? (๋๋ฑ์ฑ๊ณผ ๋์ผ์ฑ) (0) | 2024.11.22 |
Java ์ธ์ _๊ฐ์ฒด ํ์ฉ (1) | 2024.11.19 |
Java ํด๋์ค_์ดํดํ์ง ๋ชปํ๋ฉด ๋๊ฐ ์ ์๋ ๋ฐฉ.. (0) | 2024.11.19 |
๊น์ง QnA ์ธ์ (7) | 2024.11.16 |