Java

[자바] 정적 멤버와 static,싱글톤(singleton)

lala9663 2022. 9. 26. 13:27

정적(Static) : 고정된 이란 뜻인 static은 클래스에 고정된 멤버로

객체를 생성하지 않고 사용할 수 있는 필드와 메소드를 말한다.

정적 멤버는 객체에 속한 멤버가 아니라 클래스에 소속된 멤버이기 때문에
클래스 맴버라고도 한다.

1. 정적 멤버 선언


정적 필드, 정적 메소드를 선언하는 방법은 필드와 메소드 선언 시 static 키워드를 추가적으로 붙이면 된다,

public class 클래스 {
    //정적 필드
    static 타입 필드 [= 초기값]

    //정적 메소드
    static 리턴타입 메소드( 매개변수선언1, . . . ) { . . .  } 

정적 필드와 정적 메소드는 클래스에 고정된 멤버이기 때문에. 클래스 로더가 클래스를 로딩해서
메소드 메모리 영역에 적재할 때, 클래스별로 관리된다.
따라서 클래스의 로딩이 끝나면 바로 사용할 수 있다.

2. 정적 멤버 사용


클래스가 메모리로 로딩되면 정적 멤버를 바로 사용할 수 있다.

클래스 이름과 함께 . 연산자로 접근할 수 있다.

ex) 사용예시
Calculator

public class Calculator {
    static double pi = 3.14159;

    static int plus(int x, int y) {
        return x + y;
    }

    static int minus(int x, int y) {
        return x - y;
    }
}    

CalculatorTest

public class CalculatorExample {
    public static void main(String[] args) {
        double result1 = 10 * 10 * Calculator.pi;
        int result2 = Calculator.plus(10, 5);
        int result3 = Calculator.minus(10, 5);

        System.out.println("result1 : "+ result1);
        System.out.println("result2 : "+ result2);
        System.out.println("result3 : "+ result3);
    }
}

싱글톤 패턴


디자인 패턴 중 가장 많이 사용하는 패턴의 종류로 여러 클래스가 하나의 공통 변수를 중재할 때 많이 사용된다. 싱글턴의 가장 큰 특징은 메모리상에 하나의 인스턴스 만을 갖는 것이다.

즉, 싱들톤 패턴은 '하나'의 인스턴스만 생성하여 사용하고 공유하는 디자인 패턴이다.

Singleton Pattern

A class 의 값을 B class 가 필요로 한다면, Main class 에서 A class 의 값을 get 하고 B class 에 set 해야한다. 이때, 반드시 Main을 거치지 않고 (Main 몰래) 값을 전달하고 받는 패턴이 Singletone Pattern 이다.

Main class 가 아닌 Singletone class를 만들어서 값을 주고 받는다. Singletone class 의 멤버는 다른 클래스들에 의해 공유되어야 하기 때문에, 여러개의 객체가 생성되면 안된다. 그렇기 때문에 Singletone class 객체는 여러개가 생성되지 않고 딱 하나의 인스턴스만 생성되어 heap 메모리에 생성되고 나머지 클래스들이 이를 공유한다. Singletone이 중재자가 되어, 하나의 인스턴스를 사용해 값을 주고 받는다.

참고블로그 : https://qkrrudtjr954.github.io/design%20pattern/2017/11/24/singletone-pattern.html

Singleton.java

class Singleton{
  private static Singleton instance = null;

  private Singleton{
    // default constructor
  }

  public static Singleton getInstance(){
    if(instance == null){
      instance = new Singleton();
    }
    return instance;
  }
}

위는 싱글톤의 기본 클래스이다. instance(객체) 는 static 으로 선언되어 객체화 없이 접근이 가능하다. 하지만 private이기 때문에 외부에서 new로 선언할 수 없다.

Sington 객체 접근

Singletone 객체는 Singletone class 내부에 선언된 getInstance() 메소드로만 접근할 수 있다. 메소드 getInstance()를 사용해서 생성된 인스턴스가 없다면 인스턴스를 생성해서 리턴하고, 이미 생성된 인스턴스가 있다면 멤버 인스턴스를 리턴한다.

위와 같은 방법을 통해 메모리에는 단 하나의 Singletone 객체만 생성되고 사용되며, 객체 내부의 멤버들이 여러 클래스에 의해 공유될 수 있다.