IT/JAVA

static

iamhyeon 2024. 9. 24. 17:56

< 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

 

https://github.com/gyoogle/tech-interview-for-developer/blob/master/Design%20Pattern/Singleton%20Pattern.md

 

 

 

'IT > JAVA' 카테고리의 다른 글

Helper  (0) 2024.09.26
패키지와 라이브러리  (0) 2024.09.25
예외처리  (0) 2024.09.25
인터페이스  (0) 2024.09.24
입출력  (0) 2024.09.10