< static >
- static : 정적 멤버변수
--> 현재 클래스에 대한 모든 객체가 공유하는 값
- static은 객체가 생성되지 않더라도 존재하는 값
- static 메서드는 객체가 생성되지 않더라도 활성화 돼있는 기능
- static 메서드에서는 일반 변수는 접근 불가
∵ static 기능이 활성화된 시점에는 객체가 생성돼있지 않을 수도 있기 때문에 일반 기능이 반드시 존재한다는 보장이 없다
- 특정 객체에 속해 있는 형태가 아니므로 객체 생성 전에도 클래스 이름을 통해 사용 가능
- 일반 클래스의 경우 객체 생성에 아무런 제약이 없기 때문에 각각의 메서드를 호출할 때마다 새로운 객체를 생성할 수 있다 -> 메모리 낭비
- 클래스에 멤버변수가 없다면 객체를 여러개 만들 필요 없다
- this 키워드 사용불가, 클래스이름으로 접근가능
- static이 붙으면 그 객체로부터 떨어진, 독립적인 것이라고 생각해야한다
< Singleton Pattern > 싱글톤 패턴
- 소프트웨어 디자인 패턴 중 하나로, 어떤 클래스의 인스턴스가 오직 하나만 생성되도록 보장하고, 그 인스턴스에 전역으로 접근할 수 있는 방법을 제공하는 패턴
- 주로 시스템 전체에서 하나의 객체만 필요할 때 사용된다
- 메서드만 갖고있는 객체를 만들 때 메모리를 효율적으로 쓰기 위한 패턴
- 기본적인 객체지향 클래식 디자인 패턴
- 어떤 클래스가 최초 한 번만 메모리를 할당(static)하고 해당 메모리에 인스턴스를 만들어 사용하는 패턴
- 인스턴스가 필요할 때, 똑같은 인스턴스를 만들지 않고 기존의 인스턴스를 활용하는 것
- 생성자가 여러번 호출돼도, 실제로 생성되는 객체는 하나이며 최초로 생성된 이후에 호출된 생성자는 이미 생성한 객체를 반환시키도록 만드는 것
- 객체를 생성할 때마다 메모리 영역을 할당받아야 한다. 하지만 한번의 new를 통해 객체를 생성한다면 메모리 낭비를 방지할 수 있다.
- 싱글톤으로 구현한 인스턴스는 '전역'이므로, 다른 클래스의 인스턴스들이 데이터를 공유할 수 있다
- 만약 싱글톤 인스턴스가 혼자 너무 많은 일을 하거나, 많은 데이터를 공유시키면 다른 클래스들 간의 결합도가 높아지게 되는데, 이때 개방-폐쇄 원칙이 위배된다
- 결합도가 높아지게 되면, 유지보수가 힘들고 테스트도 원활하게 진행할 수 없는 문제점이 발생한다.
- 멀티 스레드 환경에서 동기화 처리를 하지 않았을 때, 인스턴스가 2개가 생성되는 문제가 발생할 수 있다.
- 반드시 싱글톤이 필요한 상황이 아니면 지양하는 것이 좋다고 한다. (설계 자체에서 싱글톤 활용을 원활하게 할 자신이 있다면 괜찮다)
- 시스템 자원을 효율적으로 관리하고, 전역 상태를 공유하는데 적합하지만, 남용하면 코드의 테스트가 어려워지거나 유지보수가 복잡해질 수 있다
- 로그 관리 : 어플리케이션에서 로그를 기록하는 클래스는 하나의 인스턴스만 있어도 충분하기 때문에 싱글톤 패턴으로 구현하는 경우가 많다
- 설정 클래스 : 설정 값을 저장하고 관리하는 클래스가 시스템 전역에서 공유돼야 하는 경우, 싱글톤으로 구현하면 모든 곳에서 동일한 설정을 참조할 수 있다
- 데이터베이스 연결 관리 : 여러 개의 객체가 생성되는 것을 방지하고 동일한 연결을 유지하기 위해서
public class SingleTonPattern {
/** 은닉된 형태로 자기 자신에 대한 객체를 static 멤버변수로 선언 */
// -> static 은 공유자원이므로 이 클래스의 객체가 몇 개가 생성되더라도 단 하나만 존재하게 된다
private static SingleTonPattern current;
/** 불필요한 객체 생성 없이 static 객체를 할당하기 위한 static 메서드 */
public static SingleTonPattern getInstance() {
if (current == null) { // null : 선언O 할당X
current = new SingleTonPattern();
// 같은 클래스 안에서는 호출 가능하므로 이 소스 안에서 new를 사용하는 것은 허용됨
}
return current;
}
/** 외부에서 new 키워드를 통한 객체 생성을 금지하기 위해 생성자를 은닉 */
private SingleTonPattern() {
super();
// 부모 클래스가 명시적으로 지정되지 않았기 때문에 기본적으로 Object 클래스를 상속받는다
// 따라서 super()는 Object 클래스의 기본 생성자를 호출한다
// 여기서는 super()는 사실상 생략해도 무방하다
// 아래와 같이 작성해도 동일하게 동작한다
// 명시적으로 포함되어 있는 것은 코드의 명확성을 높이는 방법일 수 있다
}
}
< Visual Studio Code 코드조각에 싱글톤패턴 넣기! >
설정 > 코드조각 ( code snippet ) > java
java.json 에 아래 사이트에서 자동완성된 코드 넣고 저장
snippet generator
https://snippet-generator.app/?description=&tabtrigger=&snippet=&mode=vscode
Description : 설명 ( ex: Java Singleton Pattern )
Tab trigger : 코드의 단축어 ( ex: singleton )
${TM_FILENAME_BASE} : 클래스명 (파일명)
$1 : 입력커서 포커스
--> Java 파일에서 코드의 단축어를 치면 코드를 자동세팅 할 수 있다
code snippet
- 파일 확장자에 반응 (저장한 상태에서 사용가능)
refer to