์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- OpenAPI
- datepicker
- OOP
- FACTORY
- ์ด๋ ธํ ์ด์
- Python
- 2024-08-20
- uri
- ํ๋ IT&E
- ๊ฐ์ฒด์งํฅํ๋ก๊ทธ๋๋ฐ
- Android Studio
- fontstyle
- di
- udp
- ์ฑ์ฉํ์ ํ
- reflection
- URN
- Factory Method Pattern
- Dialog
- swagger
- tcp
- url
- IOC
- AndroidStudio
- Kotlin
- ๊ธฐ์ด100์
- 2024-08-21
- ์ฝ๋์
- http method
- menutab
dingdong coding
[ Object-Oriented Programming ] ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ ๋ณธ๋ฌธ
[ Object-Oriented Programming ] ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ
๐ถ ๊ฐ๋ฐ๊ฐ๋ฐ ๐พ 2022. 1. 24. 00:33๊ฐ์ฒด Object = ๋ฌผ์ฒด, ์์ฑ(property)๊ณผ ํ๋(method)๋ฅผ ๊ฐ๊ณ ์๋ ํ์ค์ธ๊ณ์ ์ฌ๋ฌผ or ๋ฌผ์ฒด or ๋์
๊ฐ์ฒด์งํฅํ๋ก๊ทธ๋๋ฐ ์ด๋? Object Oriented Programming
๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์ปดํจํฐ ํ๋ก๊ทธ๋จ์ ๋ช ๋ น์ด์ ๋ชฉ๋ก์ผ๋ก ๋ณด๋ ์๊ฐ์์ ๋ฒ์ด๋ ์ฌ๋ฌ ๊ฐ์ ๋ ๋ฆฝ๋ ๋จ์, ์ฆ "๊ฐ์ฒด"๋ค์ ๋ชจ์์ผ๋ก ํ์ ํ๊ณ ์ ํ๋ ๊ฒ์ด๋ค. ๊ฐ๊ฐ์ ๊ฐ์ฒด๋ ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ๊ณ , ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค.
์ค์ ์ธ๊ณ์ ์ฌ๋ฌผ์ ํ๋ก๊ทธ๋๋ฐ์ผ๋ก ์ฎ๊ฒจ์ ์ด๋ฅผ ๊ฐ์ฒด๋ก ๋ณด๊ณ ํด๋น ๊ฐ์ฒด์ ํน์ง๊ณผ ๊ธฐ๋ฅ์ ๋ชจ๋ธ๋งํ์ฌ ํ๋ก๊ทธ๋๋ฐํ๋ ๊ธฐ๋ฒ์ผ๋ก ์ ์ฐํ๊ณ ๋ณ๊ฒฝ์ด ์ฉ์ดํ๋ค. ( ์ฌ์ฌ์ฉ์ฑ ) ex) Java
= ์ปดํฌ๋ํธ๋ฅผ ์ฝ๊ณ ์ ์ฐํ๊ฒ ๋ณ๊ฒฝํ๋ฉด์ ๊ฐ๋ฐ์ด ๊ฐ๋ฅํจ
1. ๊ฐ์ฒด์งํฅํ๋ก๊ทธ๋๋ฐ์ ํน์ง
1) ๋คํ์ฑ Polymorphism
์๋ก ๋ค๋ฅธ ํด๋์ค์ ๊ฐ์ฒด๊ฐ ๊ฐ์ ๋ฉ์์ง๋ฅผ ๋ฐ์์ ๋ ๊ฐ์์ ๋ฐฉ์์ผ๋ก ๋์ํ๋ ๊ฒ์ผ๋ก ํํ ์์๋ก ์ฌ์ฉ๋๋ ์๋์ฐจ์ ๋น๋์ด ์ค๋ช ํด๋ณด์. ( ์์๊ณผ ์ฐ๊ณํ์ฌ ์ค๋ช )
์ฌ๊ธฐ drive method๋ฅผ ๊ฐ๊ณ ์๋ ํ๋์ ๋ถ๋ชจํด๋์ค์ธ Car์ด ์๋ค.
๊ทธ๋ฆฌ๊ณ Car class์ dirve method๋ฅผ ์์๋ฐ์ ์ฌ์ ์ํ(Override) ์์ class์ธ Bmv์ Kn class๊ฐ ์กด์ฌํ๋ค.
public abstract class Car{
public abstract void drive();
}
public class Bmv extends Car{
@Override
public void drive() {
System.out.println("Bureung~"); // Bmv ๋ถ๋ฆ ~
}
}
public class Kn extends Car{
@Override
public void drive() {
System.out.println("Boowaang~"); // Kn ๋ถ์ ~
}
}
๋ ์์ ํด๋์ค๋ ๋ถ๋ชจ์ method๋ฅผ ์์๋ฐ์ drive ๊ธฐ๋ฅ์ ์ํํ์ง๋ง ๋์ ๋ฐฉ์(๊ตฌํ๋ฐฉ๋ฒ)์ ๋ค๋ฅด๋ค.
์ฌ๊ธฐ์ ๋งํ๋ ๋คํ์ฑ์ด๋ drive๋ผ๋ ๋์ ์์ฒด๋ ๋ฐ๋์ง ์์ง๋ง ๋์ ๋ฐฉ์์ ๊ฐ ์์ ํด๋์ค๋ง๋ค ๋ค๋ฅด๊ฒ ๊ตฌํ์ด ๊ฐ๋ฅํ ๊ฒ์ ๋งํ๋ค.
Car c = new Bmv();
c.drive(); // ๋ถ๋ฆ~
๋คํ์ฑ์ ์ฌ์ฉํ๋ฉด ์ด๋ค ํด๋์ค ๊ฐ์ฒด๊ฐ ์ฐธ์กฐ๋๋์ง์ ๋ฌด๊ดํ๊ฒ ๊ฐ๋ฐํ ์ ์๋ค. ์ฆ, ์ฝ๋๋ฅผ ์ ์ฐํ๊ฒ ๋ณ๊ฒฝํ๊ฑฐ๋ ์๋ก์ด ํด๋์ค๊ฐ ์ถ๊ฐ(ํ์ฅ)๋๋๋ผ๋ ์ฝ๋๋ ์ํฅ์ ๋ฐ์ง ์๋๋ค.
ex) drive( )๋ผ๋ ๋ฉ์๋(๊ธฐ๋ฅ, ์ญํ )๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์์์ ํตํด ์๋ก์ด ์์ class๋ก ๊ตฌํ๋๋ค.
๋ฐ๋ผ์ ์ถ์ class Car( )์ dirve( ) method๋ ๋ณ๊ฒฝํ ํ์๊ฐ ์์ผ๋ฉฐ, User(Client)๋ Car( ) class๋ฅผ ์ฌ์ฉ ์ dirve( )์ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ๋ฐฉ๋ฒ์ ๋ชฐ๋ผ๋ dirve( )๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
Java์ ๋คํ์ฑ์ ๊ธฐ๋ฅ๊ณผ ๊ตฌํ์ด ๊ตฌ๋ถ๋๊ธฐ ๋๋ฌธ์ ์ฝ๋์ ์ ์ฐ์ฑ๊ณผ ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๋ ์ชฝ์ผ๋ก ๊ฐ์ฒด๋ฅผ ์ค๊ณํ ์ ์๋ค.
๊ทธ๋์ ๊ฐ์ฒด ์ค๊ณ ์ ์ญํ ๊ณผ ๊ตฌํ์ ๋ถ๋ฆฌํด์ผํ๋ฉฐ, ์ญํ (์ธํฐํ์ด์ค)๋ฅผ ๋จผ์ ๋ถ์ฌํด์ผํฉ๋๋ค. ๊ทธ ์ดํ ํด๋น ์ญํ ์ ์ํํ๋ ๊ตฌํ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๊ฒ์ด๋ค.
• ์ญํ : ์ธํฐํ์ด์ค
• ๊ตฌํ : ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค, ๊ตฌํ ๊ฐ์ฒด
์ฆ, ํด๋ผ์ด์ธํธ๋ ๊ตฌํ ๋์์ ๋ด๋ถ๊ตฌ์กฐ๋ฅผ ๋ชฐ๋ผ๋ ๋๋ฉฐ, ๋ด๋ถ๊ตฌ์กฐ๊ฐ ๋ณ๊ฒฝ๋์ด๋ ์ํฅ์ ๋ฐ์ง ์์ต๋๋ค. ๋ํ ๋์ ์์ฒด๋ฅผ ๋ณ๊ฒฝํด๋ ์ํฅ์ ๋ฐ์ง ์๋๋ค. ** Client ๋ณ๊ฒฝ ์์ด Server์ ๊ตฌํ ๊ธฐ๋ฅ์ ์ ์ฐํ๊ฒ ๋ณ๊ฒฝ ๊ฐ๋ฅ **
์ด์ ์์๋ณผ ๊ฐ์ฒด์งํฅ ์ค๊ณ์์น SOLID๋ ์ด ๋คํ์ฑ์ด๋ผ๋ ๊ฐ๋ ์์ ์ถ๋ฒํ๋ค๊ณ ๋ณผ ์์๋ค.
2. ๊ฐ์ฒด ์งํฅ ์ค๊ณ 5์์น SOLID
SRP ๋จ์ผ ์ฑ ์ ์์น (Single Responsibility principle)
๋ง ๊ทธ๋๋ก ๊ฐ์ฒด(ํด๋์ค)๋ ํ๋์ ์ฑ ์๋ง ๊ฐ์ ธ์ผํ๋ค๋ ์๋ฏธ์ด๋ค. ( ์ฑ ์์ด๋ ํด์ผํ๋ ๊ฒ์ ์ ํ ์ ์๋ ๊ฒ )
์ข์ ์ค๊ณ๋ ์์คํ ์ ์๋ก์ด ๋ณ๊ฒฝ ๋๋ ์๊ตฌ์ฌํญ์ด ์์ ๋ ๊ธฐ์กด ์ฝ๋๊ฐ ์ํฅ๋ฐ๋ ๋ถ๋ถ์ด ์ ์ด์ผ ํ๋ค.
ํ์ง๋ง ์ฑ ์์ด ๋ง์์ง์๋ก ํด๋์ค ๋ด๋ถ์์ ์ฝ๋๋ผ๋ฆฌ์ ๊ฒฐํฉ์ฑ์ด ๋์์ ธ ๋ค๋ฅธ ์ญํ ์ ์ํํ๋ ์ฝ๋๋ผ๋ฆฌ ๋ณํ๋ฅผ ์ผ์ผํฌ ์ ์์ผ๋ฉฐ ๋ฌธ์ ๋ฐ์ ์์๋ ํ ์คํธํด์ผํ๋ ๋ฒ์๊ฐ ๋์ด์ง๋ค. (์ฐํ์ด ์์ ๊ฐ์)
๋ฐ๋ผ์ ์ฑ ์๋ถ๋ฆฌ๋ฅผ ์ํด์ผํ๋ค.
OCP ๊ฐ๋ฐฉ ํ์ ์์น (Open/Closed principle)
๊ธฐ์กด์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉด์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์๋๋ก ์ค๊ณ๋์ด์ผ ํ๋ ๊ฒ์ ๋งํ๋ค. ( ์ฝ๋ ํ์ฅ์์๋ Open, ๋ณ๊ฒฝ์๋ Closed ) ๋ณํ๋ ๊ฒ๊ณผ ๋ณํ์ง ์๋ ๊ฒ์ ๊ตฌ๋ถํ์ฌ ๋ณ๊ฒฝ์ด ์๋๋ผ๋ ๊ธฐ์กด์ ํด๋์ค๊ฐ ์ํฅ์ ๋ฐ์ง ์๊ฒ ์ค๊ณํด์ผํ๋ค.
์ด๋ ์ธํฐํ์ด์ค์์ ๊ตฌ์ฒด์ ์ธ ์ถ๋ ฅ๋งค์ฒด๋ฅผ ์บก์ํ encapsulation ํ์ฌ ์ฒ๋ฆฌํด์ผํ๋ค.
public class MeteorologicalAdministration { // ๊ธฐ์์ฒญ
public void weatherNotification(){
if( getTemperature() > 5 ){
temperatureCheck(...)
...
}
}
private void temperatureCheck(){ ... } // ์จ๋์ฒดํฌ
private int getTemperature(){ return ... }; // ์จ๋
}
์์ ์ฝ๋๋ OCP๊ฐ ์ง์ผ์ง์ง ์๊ณ ์๋ค. ๋ฌด์์ด ๋ฌธ์ ์ผ๊น?
์จ๋์ฒดํฌ์ ์จ๋ ๋ฉ์๋๋ ๋ ์จ์ ๋ฐ๋ผ ๋ณํ ๊ฐ๋ฅ์ฑ์ด ์๋ค. ( ์จ๋๊ฐ ๋ช๋์ธ์ง์ ๋ฐ๋ผ์ ์ฒดํฌ๊ฒฐ๊ณผ๋ ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์.. )
์ด๋ ๊ธฐ์กด ์ฝ๋์ ์ํฅ์ ์ค ์ ์์ผ๋ฏ๋ก ํด๋น ๋ฉ์๋๋ ๋ถ๋ฆฌํด ์ค ํ์๊ฐ ์๋ค.
public interface Checker { //์ธํฐํ์ด์ค ์์ฑ
public default void temperatureCheck(){ }
public int getTemperature();
}
public class Temperature implements Checker{ //์จ๋ ์ ์ฉ ํด๋์ค
@Override
public void temperatureCheck() { // ์จ๋์ฒดํฌ
Checker.super.temperatureCheck();
}
@Override
public int getTemperature() { // ์จ๋
return 0;
}
}
์ด์ฒ๋ผ Checker ์ธํฐํ์ด์ค๋ฅผ ์์ฑํ๊ณ ์จ๋์ฒดํฌ๋ฅผ ํ๋ ํด๋์ค์ Checker๋ฅผ ๊ตฌํํ๋ค๋ฉด ๋ค๋ฅธ ๋ฉ์๋๊ฐ ์ถ๊ฐ๋๋๋ผ๋ ์ด๋ฅผ ์ด์ฉํ๋ ํด๋ผ์ด์ธํธ ํด๋์ค๋ ์ํฅ์ ๋ฐ์ง ์๋๋ค.
+ Spring์์๋ ๋คํ์ฑ์ ๊ธฐ๋ฐํ OCP ์์น์ ์งํค๊ธฐ ์ํด์ DI, Ioc์ ๋ํด ์์๋๋ฉด ์ข๋ค.
LSP ๋ฆฌ์ค์ฝํ ์นํ ์์น (Liskov subsitution principle)
๋ถ๋ชจํด๋์ค์ ์์ํด๋์ค ์ฌ์ด์ ํ์๊ฐ ์ผ๊ด์ฑ์ด ์์ด์ผ ํ๋ค. ( ํ์์ ์ผ๊ด์ฑ )
์ฆ, ์์ ํด๋์ค์ instance๊ฐ ๋ถ๋ชจ ํด๋์ค์ instance๋ฅผ ๋์ ํ ์ ์์ด์ผ ํ๋ค.
๋ฐ๋ผ์ ์ผ๊ด์ฑ์๋ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ํด์๋ ๋ถ๋ชจํด๋์ค์์ ์์๋ฐ์ ๋ฉ์๋๋ฅผ ์์ํด๋์ค์์ ์ค๋ฒ๋ผ์ด๋ํ์ง ๋ง์์ผํ๋ค. ( ์ฌ์ ์ํ์ง ์๊ณ ํ์ฅ๋ง ์ํํด์ผํ๋ค. )
ISP ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น (Interface segregation principle)
ํด๋ผ์ด์ธํธ์ ํนํ๋ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค. ์ฆ, ํด๋ผ์ด์ธํธ ๊ด์ ์์ ์ธํฐํ์ด์ค๊ฐ ํนํ๋๋๋ก ๋ถ๋ฆฌ์์ผ์ผํ๋ค.
( ํด๋ผ์ด์ธํธ ๊ด์ ์์ ํด๋ผ์ด์ธํธ ์์ ์ด ์ด์ฉํ์ง ์๋ ๊ธฐ๋ฅ์๋ ์ํฅ์ ๋ฐ์ผ๋ฉด ์๋๋ค. )
์ธํฐํ์ด์ค๊ฐ ๋ช ํํ ๋ถ๋ฆฌ๋๋ฉด ๋์ฒด ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋ค.
DIP ์์กด ๊ด๊ณ ์ญ์ ์์น (Dependency inversion principle)
์์กด๊ด๊ณ๋ฅผ ๋งบ์ ๋ ๋ณํ๊ฐ ์์ฃผ ์ผ์ด๋๋ ๊ฒ๋ณด๋ค ๋ณํ๊ฐ ๊ฑฐ์ ์๋ ๊ฒ์ ์์กดํด์ผํ๋ค.
= ์ถ์ํ(์ญํ )์ ์์กดํ๊ณ , ๊ตฌ์ฒดํ(๊ตฌํ)์ ์์กดํ๋ฉด ์๋๋ค.
์ฆ, ๊ณ ์์ค ๋ชจ๋(๋ณํ๊ฐ ๊ฑฐ์ X๊ฒ )์ด ์ ์์ค ๋ชจ๋(๊ณ ์์ค ๋ชจ๋์ ๊ตฌํํ๊ธฐ ์ํด ํ์ํ ํ์ ๊ธฐ๋ฅ์ ์ค์ ๊ตฌํ, ์ฝ๊ฒ ๋ณํ๋ ๊ฒ)์ ์์กดํด์๋ ์๋๋ค.
์ธํฐํ์ด์ค๋ ๋ณํ์ง ์๋๊ฒ, ๊ตฌํํ๋ ํด๋์ค๋ ๋ณํ๋ ๊ฒ์ผ๋ก ๊ตฌ๋ถํ๋ค.
๋ค์ ํ ๋ฒ ๊ฐ์กฐํ์๋ฉด ๋ณํ์ง ์๋ ์ธํฐํ์ด์ค์๋ง ์์กดํด์ผํ๊ณ ๋ณํ๊ฐ ์ฆ์ ๊ตฌํ ํด๋์ค์๋ ์์กดํ๋ฉด ์๋๋ค.
๊ตฌํํด๋์ค์ ์์กดํ๋ฉด DIP ์๋ฐ์ ์ํ๋ค.
์ด์ฒ๋ผ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํ๊ธฐ ์ํด์๋ ์ง์ผ์ผํ๋ ์ฌํญ๋ค์ด ๋ง๋ค.
ํ์ง๋ง ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํจ์ผ๋ก์จ ์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ์ฌ์ฌ์ฉ์ฑ ์ ์ฐ์ฑ์ด ๋์์ง๋ ๊ฒ์ ํ์คํ๋ค.
์ด๋ฌํ ์์น์ ์ ์งํฌ ์ ์๋ ํ๊ฒฝ์ ์ง์์ ํด์ฃผ๋ ๊ฒ์ด ๋ฐ๋ก ์คํ๋ง ํ๋ ์์ํฌ์ด๋ค.
๋๋ฌธ์ ์์ผ๋ก ์คํ๋ง์ ๋ํด ๋ ๊ตฌ์ฒด์ ์ผ๋ก ๊ณต๋ถํ ์๊ฐ์ด๋ค.
์ด์ ์ค๋์ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ๋ํด ๊ณต๋ถํด๋ณด์๋ค.
UML ํ๊ธฐ๋ฒ
P.S : ๋ถ์กฑํ ๋ถ๋ถ์ ๊ณ์ํด์ ์์ ํ๊ฒ ์ต๋๋ค. ๐ฅฐ
'๐ฐJAVA > Design Pattern' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Strategy Pattern (0) | 2022.07.06 |
---|---|
Factory Method Pattern (0) | 2022.07.05 |
Singleton Pattern (0) | 2022.06.21 |