ํ๋ก์ ํจํด์ด๋?
๋์ ๊ฐ์ฒด์ ์ ๊ทผํ ๋ ์ง์ ์ ๊ทผํ์ง ์๊ณ ๋์ ๊ฐ์ฒด๋ฅผ ๋ํํ๋ ๊ฐ์ฒด๋ฅผ ํตํด ๊ฐ์ ์ ์ผ๋ก ์ ๊ทผํ๋ ๋ฐฉ์์ด๋ค. ํ๋ก์์ ์ฌ์ ์ ์ธ ์๋ฏธ๋ ๋๋ฆฌ์ธ์ด๋ผ๋ ๋ป์ด๋ค. ์ฆ, ๋์ ๊ฐ์ฒด์ ๋๋ฆฌ์ธ์ ํตํด ์ ๊ทผํ๋ ํจํด์ด๋ผ๊ณ ์ดํดํ๋ฉด ๋ ๊ฒ์ด๋ค.
ํ๋ก์ ์๋ฒ๋ฅผ ์๊ฐํ๋ฉด ํด๋น ํจํด์ ํน์ง์ ์ดํดํ ์ ์์ ๊ฒ์ด๋ค.
ํ๋ก์ ์๋ฒ๋?
์๋ฒ์ ํด๋ผ์ด์ธํธ ์ฌ์ด์์ ํด๋ผ์ด์ธํธ๊ฐ ๋ค๋ฅธ ๋คํธ์ํฌ ์๋น์ค์ ๊ฐ์ ์ ์ผ๋ก ์ ์ํ ์ ์๊ฒ ํด์ฃผ๋ ์์คํ ์ด๋ค.
![](https://blog.kakaocdn.net/dn/cAhUDr/btshVCm1L5F/vQxakNk2ktqDToNa3QIXzk/img.png)
์ด์ ํ๋ก์ ํจํด์ ์ด๋ป๊ฒ ๊ตฌํํ๋์ง ํ์ธํด๋ณด์
public interface ISubject {
void action();
}
public class RealSubject implements ISubject {
@Override
public void action() {
System.out.println("์๋ณธ ๊ฐ์ฒด");
}
}
public class ProxySubject implements ISubject {
private RealSubject subject;
public ProxySubject(RealSubject subject) {
this.subject = subject;
}
@Override
public void action() {
subject.action();
System.out.println("ํ๋ก์ ๊ฐ์ฒด");
}
}
public class Main {
public static void main(String[] args) {
ISubject subject = new ProxySubject(new RealSubject());
subject.action();
}
}
์์ ์์ ์ฒ๋ผ ์๋ณธ ๊ฐ์ฒด(RealSubject)๊ฐ ์๊ณ , ํ๋ก์ ๊ฐ์ฒด(ProxySubject)๊ฐ ์๋ค. Main ํด๋์ค๋ฅผ ๋ณด๋ฉด ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๊ฒ์ ๋ณผ ์ ์๋ค. ํด๋น ์์ ๋ ๊ธฐ๋ณธ ํ๋ก์ ๊ตฌํ ์์ ์ด๋ค.
๊ฐ์ ํ๋ก์
public class VirtualProxy implements ISubject {
private RealSubject subject;
@Override
public void action() {
if (subject == null) {
subject = new RealSubject();
}
subject.action();
System.out.println("ํ๋ก์ ๊ฐ์ฒด");
}
}
public class Main {
public static void main(String[] args) {
ISubject subject = new VirtualProxy();
subject.action();
}
}
์์ ์์ ๋ ๊ฐ์ ํ๋ก์ ๊ตฌํ ์์ ์ด๋ค. action() ๋ฉ์๋๋ฅผ ๋ณด๋ฉด ๊ธฐ๋ณธ ํ๋ก์ ์์ ์ ๋ค๋ฅธ ๋ถ๋ถ์ด ์๋ ๊ฒ์ ๋ณผ ์๊ฐ ์๋๋ฐ, ํ๋ก์ ๊ฐ์ฒด์ ํด๋น ๋ฉ์๋ ํธ์ถ์ด ๋ฐ์ํ๋ฉด ์๋ณธ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ฐฉ์์ด๋ค.
ํด๋น ๋ฐฉ์์ ์ฌ์ฉ๋น๋๊ฐ ๋ฎ์ง๋ง ํญ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌ๋์ด ์๋ ๋ฌด๊ฑฐ์ด ์๋น์ค ๊ฐ์ฒด๊ฐ ์๋ ๊ฒฝ์ฐ ์ฌ์ฉ๋ ์ ์๋ค.
๋ณดํธ ํ๋ก์
public class ProtectionProxy implements ISubject {
private RealSubject subject;
boolean access;
public ProtectionProxy(RealSubject subject, boolean access) {
this.subject = subject;
this.access = access;
}
@Override
public void action() {
if (!access)
return;
subject.action();
System.out.println("ํ๋ก์ ๊ฐ์ฒด");
}
}
public class Main {
public static void main(String[] args) {
ISubject subject = new ProtectionProxy(new RealSubject(), false);
subject.action();
}
}
๋ณดํธ ํ๋ก์๋ ์ ๊ทผ ๊ถํ์ ๋ฐ๋ผ ์์์ ์ฌ์ฉํ๋๋ก ํ๋ ๋ฐฉ์์ด๋ค. ์์ ์์ ๋ฅผ ๋ณด๋ฉด access ๋ณ์๋ฅผ ํตํด์ action() ๋ฉ์๋๋ฅผ ์ํํ๋ ๊ฒ์ ๋ณผ ์๊ฐ ์๋ค.
ํน์ ํด๋ผ์ด์ธํธ๋ง ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ๋๋ค.
๋ก๊น ํ๋ก์
public class LoggingProxy implements ISubject {
private RealSubject subject;
public LoggingProxy(RealSubject subject) {
this.subject = subject;
}
@Override
public void action() {
System.out.println("๋ก๊น
์ํ");
subject.action();
System.out.println("๋ก๊น
์ํ");
}
}
public class Main {
public static void main(String[] args) {
ISubject subject = new LoggingProxy(new RealSubject());
subject.action();
}
}
๋ก๊น ํ๋ก์๋ ๋ง ๊ทธ๋๋ก ์๋ณธ ๊ฐ์ฒด ๋ฉ์๋์ ๋ก๊น ๊น์ง ์ถ๊ฐ๋ก ์์ ํ ๋ ์ฌ์ฉํ๋ ๋ฐฉ์์ด๋ค.
ํจํด ์ฌ์ฉ ์๊ธฐ
- ์ ๊ทผ์ ์ ์ดํ๊ฑฐ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ณ ์ถ์๋ฐ, ๊ธฐ์กด์ ๊ฐ์ฒด๋ฅผ ์์ ํ ์ ์๋ ์ํฉ์ผ ๋
- ์ ๊ทผ ์ ์ด, ๋ก๊น , ์บ์ฑ ๋ฑ ๊ธฐ์กด ๊ฐ์ฒด ๋ฉ์๋์ ์์ ์์ด ์ถ๊ฐํ๊ณ ์ถ์ ๋
ํ๋ก์ ํจํด์ ์ฅ์
- ๊ฐ๋ฐฉ ํ์ ์์น(OCP) ์ค์ - ๊ธฐ์กด ๋์ ๊ฐ์ฒด์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์๋ค.
- ๋จ์ผ ์ฑ ์ ์์น(SRP) ์ค์ - ์์ ์ ๊ธฐ๋ฅ์๋ง ์ง์คํ๊ณ , ๊ทธ ์ธ์ ๋ถ๊ฐ ๊ธฐ๋ฅ์ ํ๋ก์ ๊ฐ์ฒด์ ์์ํ์ฌ ๋ค์ค ์ฑ ์์ ํํผํ ์ ์๋ค.
- ์๋ ํ๋ ค๋ ๊ธฐ๋ฅ์ ์ํํ๋ฉฐ ๊ทธ ์ธ์ ๋ถ๊ฐ์ ์ธ ์์ (๋ณด์, ์บ์ฑ, ๋ก๊น ๋ฑ)์ ์ํํ๋๋ฐ ์ ์ฉํ๋ค.
ํ๋ก์ ํจํด์ ๋จ์
- ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ํ๋ก์ ๊ฐ์ฒด๋ฅผ ๊ฑฐ์ณ์ผ ํ๋ฏ๋ก, ๋น๋ฒํ ๊ฐ์ฒด ์์ฑ์ด ์๋ ๊ฒฝ์ฐ ์ฑ๋ฅ์ด ์ ํ๋ ์ ์๋ค.
- ํ๋ก์ ํด๋์ค์ ๋ค์ด๊ฐ๋ ์์์ด ๋ง๋ค๋ฉด ์ฑ๋ฅ์ด ์ ํ๋ ์ ์๋ค.
์ฐธ๊ณ
'๐๏ธ ๋์์ธ ํจํด' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ดํฐ๋ ์ดํฐ ํจํด(Iterator Pattern) (0) | 2023.05.29 |
---|