이 카테고리는 국비지원 과정으로 [계룡건설] 빅데이터 기반 GreenTech SW개발자 과정에서 학습하는 내용을 정리하는 공간입니다.
Java 싱글톤 패턴 예제 정리
싱글톤 패턴이란?
싱글톤(Singleton) 패턴은 애플리케이션에서 단 하나의 객체만 생성되도록 보장하는 디자인 패턴이다. 주로 설정 정보, 데이터베이스 연결, 로깅 등에서 사용된다.
1. 싱글톤 클래스 구현
public class Singleton {
private static Singleton singleton = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return singleton;
}
}
- private static 변수로 단 하나의 인스턴스를 생성하고, 외부에서 접근할 수 없도록 private 생성자를 사용한다.
- getInstance() 메서드를 통해 유일한 객체를 반환한다.
사용 예시
Singleton obj1 = Singleton.getInstance();
Singleton obj2 = Singleton.getInstance();
if (obj1 == obj2) {
System.out.println("같은 싱글톤 객체");
} else {
System.out.println("다른 싱글톤 객체");
}
출력 결과:
같은 싱글톤 객체
obj1과 obj2가 같은 객체임을 확인할 수 있다.
2. 다른 클래스에서 싱글톤 패턴 활용
ShopService 클래스
class ShopService {
private static ShopService shopService = new ShopService();
private ShopService() {}
public static ShopService getInstance() {
return shopService;
}
}
- ShopService도 싱글톤 패턴을 활용하여 유일한 인스턴스를 제공한다.
사용 예시
ShopService service1 = ShopService.getInstance();
ShopService service2 = ShopService.getInstance();
if (service1 == service2) {
System.out.println("같은 ShopService 객체");
} else {
System.out.println("다른 ShopService 객체");
}
출력 결과:
같은 ShopService 객체
3. 로그인 서비스 예제
class MemberService {
boolean login(String id, String password) {
return "hong".equals(id) && "12345".equals(password);
}
void logout(String id) {
System.out.println(id + "님이 로그아웃 되었다.");
}
}
- login() 메서드는 id와 password가 일치할 경우 true를 반환한다.
- logout() 메서드는 로그아웃 메시지를 출력한다.
사용 예시
MemberService memberservice = new MemberService();
boolean result = memberservice.login("hong", "12345");
if (result) {
System.out.println("로그인 성공");
memberservice.logout("hong");
} else {
System.out.println("로그인 실패");
}
출력 결과:
로그인 성공
hong님이 로그아웃 되었다.
4. 다형성을 활용한 Printer 클래스
class Printer {
public void println(int a) { System.out.println(a); }
public void println(String a) { System.out.println(a); }
public void println(double a) { System.out.println(a); }
public void println(boolean a) { System.out.println(a); }
}
- println() 메서드를 오버로딩하여 다양한 데이터 타입을 출력할 수 있도록 구현했다.
사용 예시
Printer printer = new Printer();
printer.println(10);
printer.println(true);
printer.println(5.7);
printer.println("홍길동");
출력 결과:
10
true
5.7
홍길동
5. 은행 계좌 관리 시스템
Account 클래스
class Account {
private static Account account = new Account();
private int balance;
private static final int MIN_VALUE = 0;
private static final int MAX_VALUE = 1000000;
private Account() {}
public static Account getInstance() {
return account;
}
public void setBalance(int balance) {
if (balance >= MIN_VALUE && balance <= MAX_VALUE) {
this.balance = balance;
}
}
public int getBalance() {
return balance;
}
}
- getInstance()를 통해 단 하나의 Account 객체를 생성하고 관리한다.
- setBalance() 메서드는 유효한 범위 내에서 잔액을 설정한다.
BankApplication 클래스
class BankApplication {
public static void main(String[] args) {
Account account = Account.getInstance();
account.setBalance(10000);
System.out.println("현재 잔고: " + account.getBalance());
}
}
출력 결과:
현재 잔고: 10000
개선할 점
- 스레드 안전한 싱글톤 구현
- synchronized 키워드를 활용하거나 이른 초기화(Eager Initialization) 대신 지연 초기화(Lazy Initialization) 기법을 사용할 수 있음.
- volatile 키워드를 활용한 더블 체크 락킹(Double-Checked Locking) 방식 고려 가능.
- 로그인 서비스 개선
- id와 password 비교 시 == 연산자 대신 .equals() 메서드 사용.
- 예외 처리를 추가하여 안정성 향상 가능.
- Account 클래스 리팩토링
- static 변수를 인스턴스 변수로 변경하여 개별 계좌 관리 가능하도록 수정.
- balance 초기값 설정 및 입출금 기능 향상.
마무리
이 예제에서는 싱글톤 패턴을 활용하여 객체를 하나만 유지하는 방법을 학습했다. 또한, MemberService, Printer, Account 등의 클래스를 통해 객체 지향적인 설계를 적용해 보았다. 앞으로 개발할 때 싱글톤이 필요할 경우, 다양한 방식으로 최적화하여 사용할 수 있다.
'국비지원교육 > [계룡건설] 빅데이터 기반 GreenTech SW개발자' 카테고리의 다른 글
**[계룡건설] GreenTech SW개발자 - CSS 학습 노트 .1** (0) | 2025.02.17 |
---|---|
**[계룡건설] GreenTech SW개발자 - HTML 학습 노트 .3** (0) | 2025.02.17 |
**[계룡건설] GreenTech SW개발자 - HTML 학습 노트 .2** (0) | 2025.02.16 |
**[계룡건설] GreenTech SW개발자 - HTML 학습 노트 .1** (0) | 2025.02.16 |
**[계룡건설] GreenTech SW개발자 - JAVA 학습 노트 .4** (0) | 2025.02.04 |