독학 시 정보를 찾기도, 이해하고 적용하기도 어려웠던 부분 중 하나라서 기대가 큰 부분이다
디자인 패턴
자주 사용하는 설계 패턴을 정형화해서 가장 최적의 방법으로 개발할 수 있도록 정해둔 설계 유형
- GoF'(Gang of Fours). Design Patterns: Elements of Reusable Object-Oriented Software. (1995) 에서 23개의 디자인 패턴을 정리했고 현재도 사용한다
- 장점: 개발자 간의 소통 용이, 소프트웨어 구조 파악 용이, 재사용을 통한 개발 시간 단축, 설계 변경의 유연성
- 단점: 객체지향 설계 및 구현에 대한 이해도 요구, 초기 투자(설계) 비용 높음
생성패턴
객체를 생성하는 것과 관련된 패턴으로 객체의 생성과 변경이 전체 시스템에 미치는 영향을 최소화 하고 코드의 유연성을 높인다
구조 패턴
프로그램 내 자료구조, 인터페이스 구조 등 프로그램 구조를 설계하는데 활용될 수 있다. 클래스, 객체들의 구성을 통해 더 큰 구조를 만들 수 있게한다. 큰 규모의 시스템에서는 많은 클래스들이 서로 의존성을 갖는데 이런 복잡한 구조를 개발하기 쉽고 유지 보수하기 좋게 만든다
행위 패턴
반복적으로 사용되는 객체들의 상호작용을 패턴화한 것. 클래스나 객체들이 상호 작용하는 방법과 책임을 분산하는 방법을 제공한다
싱글톤 패턴 (Singleton pattern)
어떠한 클래스(객체)가 1개만 존재할 때 사용한다. 주로 서로 자원을 공유할 때 사용하며, TCP Socket 통신에서 서버와 연결된 connect 객체에 주로 사용한다
- default 생성자를 private으로 설정하여 접근을 막는다
- getInstance 메소드를 통해 객체를 가지고 오거나 생성한다 (getInstance를 쓰는 객체는 singleton이라고 생각하면 됨)
(예시) 사무실의 프린터 - 여러명이 사용할 수 있지만 단 1대만 존재함
SocketClient.java
public class SocketClient {
private static SocketClient socketClient = null;
// default 생성자를 private로 생성하여 외부의 접근을 막는다
private SocketClient(){}
// static 으로 생성했기 때문에 외부에서 getInstance 메소드에 접근 가능
public static SocketClient getInstance(){
// null인 경우에는 객체가 없다는 뜻이므로 객체를 생성해야한다
if(socketClient == null){
socketClient = new SocketClient();
System.out.println("socket new instance");
}
// null인 경우에는 객체가 있다는 뜻이므로 객체를 반환한다
return socketClient;
}
public void connect(){
System.out.println("socket");
}
}
AAA.java, BBB.java
public class AAA {
private SocketClient socketClient;
public AAA(){
//SocketClient의 생성자를 private으로 막았기 때문에 new를 통한 객체 할당 불가
//this.socketClient = new SocketClient();
this.socketClient = SocketClient.getInstance();
}
public SocketClient getSocketClient() {
return socketClient;
}
public void setSocketClient(SocketClient socketClient) {
this.socketClient = socketClient;
}
}
// AAA 클래스와 클래스명만 다른 객체
public class BBB {
private SocketClient socketClient;
public BBB(){
this.socketClient = SocketClient.getInstance();
}
public SocketClient getSocketClient() {
return socketClient;
}
public void setSocketClient(SocketClient socketClient) {
this.socketClient = socketClient;
}
}
Main.java
public class Main {
public static void main(String[] args) {
AAA a = new AAA();
BBB b = new BBB();
SocketClient aClient = a.getSocketClient();
SocketClient bClient = b.getSocketClient();
System.out.println("두 개의 객체가 동일한가?");
System.out.println(a.getSocketClient().equals(b.getSocketClient()));
}
}