싱글톤 패턴 (Singleton Pattern)
싱글톤 패턴은 클래스의 인스턴스를 단 하나만 생성하도록 보장하는 디자인 패턴입니다.
주로 공유 자원을 관리하거나, 글로벌 상태를 유지해야 하는 경우에 사용됩니다.
- 메모리 절약: 하나의 인스턴스만 생성되므로 불필요한 메모리 사용을 방지.
- 글로벌 접근: 애플리케이션 어디에서든 동일한 객체를 참조 가능.
- 일관성 유지: 여러 인스턴스가 생성될 경우 발생할 수 있는 데이터 불일치 방지.
싱글톤 패턴 구현 방법
1. 정적 변수로 유일한 인스턴스 생성
- 클래스 내부에 static 변수로 인스턴스를 저장합니다.
- static은 클래스당 하나만 존재하므로 유일성을 보장합니다.
private static SingleTon instance;
2. 생성자를 private으로 제한
- 외부에서 new 키워드를 사용해 객체를 생성하지 못하게 합니다.
private SingleTon() {}
3. 정적 메서드로 인스턴스 반환
- getInstance() 메서드를 통해 인스턴스를 반환합니다.
- 이미 인스턴스가 생성되어 있으면 기존 인스턴스를 반환, 없으면 새로 생성.
public static SingleTon getInstance() {
if (instance == null) {
instance = new SingleTon();
}
return instance;
}
싱글톤 코드 예제
SingleTon.java
package design_patten;
public class SingleTon {
// 유일한 인스턴스를 저장하는 정적 변수
private static SingleTon instance;
// 생성자를 private으로 선언 (외부에서 호출 불가)
private SingleTon() {}
// 정적 메서드를 통해 인스턴스를 반환
public static SingleTon getInstance() {
if (instance == null) {
instance = new SingleTon();
}
return instance;
}
}
MainTest.java
package design_patten;
public class MainTest {
public static void main(String[] args) {
SingleTon singleTon1 = SingleTon.getInstance();
SingleTon singleTon2 = SingleTon.getInstance();
// 두 객체 비교
System.out.println(singleTon1);
System.out.println(singleTon2);
if (singleTon1 == singleTon2) {
System.out.println("같은 객체가 맞아요!");
}
}
}
실행 결과
design_patten.SingleTon@1b6d3586
design_patten.SingleTon@1b6d3586
같은 객체가 맞아요!
어댑터 패턴 (Adapter Pattern)
어댑터 패턴은 호환되지 않는 두 객체를 연결하는 역할을 합니다.
쉽게 말해, 110v 전압을 220v 콘센트에 꽂을 수 있도록 변환해주는 중간 다리 역할을 한다고 생각하면 됩니다.
- 클라이언트(Client): 서비스를 사용하려는 코드입니다.
- 서비스(Service): 기존 클래스 또는 객체로, 클라이언트와 인터페이스가 맞지 않습니다.
- 어댑터(Adapter): 클라이언트와 서비스 간의 인터페이스를 맞춰주는 중재자 역할을 합니다.
어댑터 패턴 코드 구현
1. 인터페이스 정의
interface IElectronic220v {
void connect();
}
interface IElectronic110v {
void connect();
}
2. 기존 클래스
- 110v 전압 기기
class HairDryer implements IElectronic110v {
@Override
public void connect() {
System.out.println("헤어드라이어 연결하기 (110v)");
}
}
- 220v 전압 기기
class AirConditioner implements IElectronic220v {
@Override
public void connect() {
System.out.println("에어컨 연결하기 (220v)");
}
}
3. 어댑터 클래스
- 110v 기기를 220v 인터페이스로 변환
public class ElectronicAdapter implements IElectronic220v {
private IElectronic110v electronic110v;
public ElectronicAdapter(IElectronic110v electronic110v) {
this.electronic110v = electronic110v;
}
@Override
public void connect() {
System.out.println("어댑터를 통해 110v 기기를 220v 콘센트에 연결합니다.");
electronic110v.connect();
}
}
4. 클라이언트 코드
public class MyHouse {
public static void homeConnect(IElectronic220v iElectronic220v) {
iElectronic220v.connect();
}
public static void main(String[] args) {
HairDryer hairDryer = new HairDryer(); // 110v 기기
AirConditioner airConditioner = new AirConditioner(); // 220v 기기
ElectronicAdapter adapterHairDryer = new ElectronicAdapter(hairDryer);
// 어댑터를 사용하여 110v 기기를 220v 콘센트에 연결
homeConnect(adapterHairDryer);
homeConnect(airConditioner);
}
}
어댑터 패턴 실행 결과
어댑터를 통해 110v 기기를 220v 콘센트에 연결합니다.
헤어드라이어 연결하기 (110v)
에어컨 연결하기 (220v)
싱글톤과 어댑터 패턴의 차이점
- 싱글톤 패턴: 객체의 유일성을 보장합니다.
- 어댑터 패턴: 호환되지 않는 인터페이스를 변환해줍니다.
정리
- 싱글톤 패턴은 단일 객체만 생성하여 효율적 자원 관리와 일관성 유지를 보장합니다.
- 어댑터 패턴은 서로 다른 인터페이스를 가진 객체를 유연하게 연결합니다.
- 두 패턴 모두 코드의 유지보수성과 확장성을 높이는 데 중요한 역할을 합니다.