★인터페이스
☞ 구현된 메소드가 없고, 상수형 변수만 가능. 메소드의 접근 한정자는 항상 public 이어야 한다. 인터페이스를 implements 해서 class를 만들 수 있다.
1. 스트래티지 패턴 (구성을 사용하라)
☞ 수퍼클래스에 메소드가 추가되면서 일부 서브클래스에 적합하지 않은 행동이 추가되버린 문제가 발생되었음!!(고무오리가 날아다녀~)
- 서브클래스에서 코드가 중복된다.
- 실행시에 특징을 바꾸기 힘들다.
- 모든 메소드의 행동을 알기 힘들다.
- 코드를 변경했을 때 다른 메소드한테 원치 않은 영향을 끼칠 수 있다.
알고리즘군을 정의하고 각각을 캡슐화하여 교환해서 사용할 수 있도록 만든다. 스트래티지을 활용하면 알고리즘을 사용하는 클라이언트와는 독립적으로 알고리즘을 변경할 수 있다.
2. 옵저버 패턴 (느슨한 결합~)
☞ 인터페이스가 아닌 구체적인 구현을 바탕으로 코딩을 해서 새로운 항목이 추가될 때마다 코드를 변경해야 하는 문제발생!!(기상센터)
- 실행중에 항목을 추가/제거할 수 없다.
- 바뀌는 부분을 캡슐화하지 않음.
한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들한테 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다(one-to-many)의존성을 정의한다.
2가지 방식이 있다. 객체가 데이터를 보내는 방식(푸쉬 방식) 옵저버들이 데이터를 가져가는 방식(풀 방식)
JDK에서 java.util에 들어있는 Observer/Observable Swing에서도 이 패턴을 구현한 것을 제공한다.
3. 데코레이터 패턴 (추가요소를 동적으로 더할 수 있음)
☞ 클래스의 종류와 첨가하는 것들이 추가할 경우 엄청나게 구현을 통하여 디자인을 하면 엄청나게 많은 클래스와 메소드들이 존재하게 됨.
- 데코레이터는 자신이 장식하고 있는 객체에게 어떤 행동을 위임하는 것 외에 원하는 추가적인 작업을 수행할 수 있음.
- 객체에 추가적인 요건을 동적으로 첨가한다. 서브클래스를 만드는 것을 통해서 기능을 유연하게 확장할 수 있는 방법을 제공한다.
- 데코레이터의 형식이 그 데코레이터로 감싸는 형식과 같다!!
java.IO에서 사용하고 있다.
객체에 추가 요소를 동적으로 더할 수 있다. 데코레이터를 사용하면 서브클래스를 만드는 경우에 비해 훨씬 유연하게 기능을 확장할 수 있다.
클래스는 확장에 대해서는 열려 있어야 하지만 코드 변경에 대해서는 닫혀 있어야 함!
4. 팩토리 패턴(추상화된 것에 의존하도록 만들어라) - 의존성 뒤집기 원칙
☞ 객체 생성을 처리하는 클래스 -> 팩토리.
- 어떤 변수에도 구상 클래스에 대한 레퍼런스를 저장하지 말아라.
- 구상 클래스에서 유도된 클래스를 만들지 말아라.
- 베이스 클래스에 이미 구현되어 있던 메소드를 오버라이드 하지 말아라..
팩토리 메소드 패턴 : 객체를 생성하기 위한 인터페이스를 만든다. 어떤 클래스의 인스턴스를 만드지는 서브클래스에서 결정하도록 한다. 팩토리 메소드를 이용하면 인스턴스를 만드는 일을 서브클래스로 미룰 수 있다.
추상 팩토리 패턴 : 서로 연관된, 또는 의존적인 객체들로 이루어진 제품군을 생성하기 위한 인터페이스를 제공한다. 구상 클래스는 서브클래스에 의해 만들어진다.
5. 싱글턴 패턴
☞ 클래스 인스턴스가 하나만 만들어지도록 하고, 그 인스턴스에 대한 전역 접근을 제공함
1. private static Singleton uniqueInstance;
2. private static Singleton uniqueInstance = new Singleton();
3. private volatile static Singleton uniqueInstance;
public static Singleton getInstance(){
if( uniqueInstance == null){
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
public static synchronized Singleton getInstance(){
if( uniqueInstance == null){
return uniqueInstance;
}
public static Singleton getInstance(){
if( uniqueInstance == null){
synchronized(Singleton.class){
if( uniqueInstance == null){
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
6. 커맨드 패턴
☞ 요청 내역을 객체로 캡슐화하여 클라이언트를 서로 다른 요청 내역에 따라 매개변수화할 수 있다. 요청을 큐에 저장하거나 로그로 기록할 수도 있고 작업취소 기능을 지원할 수도 있다.( 요청을 하는 객체와 그 요청을 수행하는 객체를 분리시키고 싶을 때 사용)
7. 어댑터 패턴과 퍼사드 패턴
☞ 데코레이터 : 인터페이스는 바꾸지 않고 책임(기능)만 추가
어댑터 : 한 인터페이스를 다른 인터페이스로 변환! 인터페이스가 호환되지 않아 쓸 수 없었던 클래스들을 같이 사용할 수 있게 해 준다.
퍼사드 : 인터페이스를 간단하게 바꿈. 서브시스템에 있는 일련의 인터페이스에 대한 통합 인터페이스를 제공. 퍼사드 패턴에서는 서브시스템을 더 쉽게 사용할 수 있게 해 주는 고수준 인터페이스를 정의한다.(정말 친한 친구하고만 얘기하라)
8. 템플릿 메소드 패턴 (헐리우드 원칙 : 먼저 연락하지 말것!)
☞ 메소드에서 알고리즘의 골격을 정의한다. 알고리즘의 여러 단계 중 일부는 서브클래스에서 구현할 수 있다. 템플릿 메소드를 이용하면 알고리즘의 구조는 그대로 유지하면서 서브클래스에서 특정 단계를 재정의할 수 있다. (예 : 커피와 홍차 만드는 구조)
9. 이터레이터와 컴포지트 패턴(똑같은 인터페이스를 구현할 수 있게 해 준다면??)
☞ 이터레이터 패턴은 컬렉션 구현 방법을 노출시키지 않으면서도 그 집합체 안에 들어있느 모든 항목에 접근할 수 있게 해 주는 방법을 제공해 준다.
컴포지트 패턴을 이용하면 객체들을 트리 구조로 구성하여 부분과 전체를 나타내는 계층구조로 만들 수 있다. 이 패턴을 이용하면 클라이언트에서 개별 객체와 다른 객체들로 구성된 복합 객체를 똑같은 방법으로 다룰 수 있다.
10. 스테이트 패턴(스트래티지와 비슷)
☞ 스테이트 패턴을 이용하면 객체의 내부 상태가 바뀜에 따라서 객체의 행동을 바꿀 수 있다. 마치 객체의 클래스가 바뀌는 것과 같은 결과를 얻을 수 있다.
11. 프록시 패턴
☞ 어떤 객체에 대한 접근을 제어하기 위한 용도로 대리인이나 대변인에 해당하는 객체를 제공하는 패턴..
RMI;;
1. 원격 인터페이스 만들기
2. 서비스 구현 클래스 만들기
3. 스터브 및 스켈레톤 생성(스켈레톤은 버전에 따라서 생성안하기도 함)
4. rmiregistry 실행
5. 서비스 가동
원격 프록시 - 원격 객체에 대한 접근을 제어할 수 있다.
가상 프록시 - 생성하기 힘든 자원에 대한 접근을 제어할 수 있다.
보호 프록시 - 접근 권한이 필요한 자원에 대한 접근을 제어할 수 있다.
'공부' 카테고리의 다른 글
[미국] 트럼프 2기 행정부에 대해서... (3) | 2024.11.25 |
---|---|
[반도체] HBM에 대해서 (1) | 2024.11.23 |
[한국증시] 우리나라 주식시장은 왜 약할까?? (3) | 2024.11.13 |
생활영어 필수암기 300문장 (0) | 2013.11.29 |