Static과 Singleton 패턴은 Java에서 객체와 데이터를 효율적으로 관리하기 위한 중요한 개념입니다.
1. Static 개념 및 활용
Static은 객체마다 공유되는 동일한 값을 가지거나, 객체 생성 없이 클래스 레벨에서 직접 접근해야 할 때 사용하는 키워드입니다.
Static 멤버 변수
- Static 변수는 객체들이 공유하는 값입니다.
- 일반 변수는 각 객체마다 고유한 값을 가지지만, Static 변수는 클래스 레벨에서 생성되며 모든 객체가 동일한 값을 참조합니다.
public class Count {
public int a; // 일반 변수
public static int b; // 정적 변수
}
예제: Static 변수 사용
Count c1 = new Count();
c1.a++; // 객체별로 증가
c1.b++; // 모든 객체가 공유
Count c2 = new Count();
c2.a++;
c2.b++; // c1, c2 모두 같은 값을 공유
System.out.println("c1.b: " + c1.b); // Static 변수는 동일
System.out.println("c2.b: " + c2.b);
결론:
- Static 변수는 객체와 무관하게 클래스명.변수명으로도 접근 가능합니다.
- 객체 생성 없이도 사용할 수 있어 공유된 값을 관리하는 데 유용합니다.
Static 메소드
- Static 메소드는 정적 변수만 사용할 수 있습니다.
- 일반 변수는 객체를 생성한 후에만 접근할 수 있습니다.
public static int method2() {
b++; // Static 변수 접근 가능
Count c = new Count(); // 객체 생성 후
c.a = 10; // 일반 변수 접근
return b;
}
Static 메소드의 특징
- 클래스 레벨에서 호출 가능 (클래스명.메소드명).
- 정적 변수만 직접적으로 사용 가능.
- 객체 생성 후 일반 변수도 간접적으로 사용 가능.
Static 초기화 블록
- Static 변수의 초기화 작업을 수행하는 블록으로, 클래스가 메모리에 로드될 때 단 1회 실행됩니다.
static {
company = "LG";
System.out.println("Static 초기화 블록 실행");
}
2. Singleton 패턴
Singleton 패턴은 객체를 하나만 생성하도록 제한하는 디자인 패턴입니다.
Singleton 구현 단계
- 정적 멤버 변수로 클래스의 유일한 객체를 생성.
- **생성자에 private**를 붙여 외부에서 객체 생성을 막음.
- 정적 메소드로 객체를 반환.
public class Person {
// 1. 유일한 객체 생성
private static Person instance = new Person();
// 2. 생성자 private 선언
private Person() {}
// 3. 객체 반환 메소드
public static Person getInstance() {
return instance;
}
}
사용 예제
Person p1 = Person.getInstance();
Person p2 = Person.getInstance();
System.out.println(p1 == p2); // true (같은 객체를 참조)
Singleton의 장점
- 메모리 절약: 객체를 하나만 생성하므로 메모리 낭비를 줄임.
- 데이터 공유: 여러 곳에서 동일한 데이터를 사용할 수 있음.
- 글로벌 접근: 어디서든 동일한 인스턴스를 호출 가능.
Static vs Singleton
Static vs Singleton
특징 | Static | Singleton |
접근 방식 | 클래스명으로 직접 접근 | getInstance() 메소드로 접근 |
객체 생성 | 객체 생성 불필요 | 객체를 한 번만 생성 |
데이터 공유 | 모든 객체가 공유 | 하나의 인스턴스로 데이터 공유 |
수명 | 프로그램 종료 시까지 유지 | 인스턴스가 참조되지 않으면 GC 대상 |
요약
- Static: 클래스 단위로 동작하며, 객체 생성 없이 공유 데이터를 관리.
- Singleton: 특정 클래스의 객체를 하나만 생성해, 데이터의 일관성을 보장.
'Java' 카테고리의 다른 글
[JAVA] 인터페이스 (Interface) (0) | 2025.01.11 |
---|---|
[JAVA] Final , abstract(추상) (0) | 2025.01.11 |
[JAVA] 자바의 다형성(Polymorphism) 이해하기: 개념부터 예제까지 (0) | 2025.01.11 |
[JAVA] 접근제어자, 은닉 (0) | 2025.01.11 |
[JAVA] 오버라이딩(Overriding) , 오버로딩(overloading) , super 와this (0) | 2024.11.30 |