2021-9-13 점프 투 자바 정적변수와 메소드

정적 변수와 메소드 (static)

static 변수

public class HousePark  {
    static String lastname = "박";

    public static void main(String[] args) {
        HousePark pey = new HousePark();
        HousePark pes = new HousePark();
    }
}

위와 같이 lastname 변수에 static 키워드를 붙이면 자바는 메모리 할당을 딱 한번만 하게 되어 메모리 사용에 이점을 볼 수 있다.

또 하나는 변수의 값을 공유해야 할때 쓴다.

public class Counter  {
    static int count = 0;
    Counter() {
        this.count++;
        System.out.println(this.count);
    }

    public static void main(String[] args) {
        Counter c1 = new Counter();
        Counter c2 = new Counter();
    }
}

int count 앞에 static 키워드를 붙이니 count 값이 공유되어 방문자수가 증가된 결과값이 나온다.

static method

static이라는 키워드가 메소드 앞에 붙으면 이 메소드는 스테틱 메소드가 된다.

싱글톤 패턴 (singleton pattern)

단 하나의 객체만을 생성하게 강제하는 패턴

class Singleton {
    private Singleton() {
    }
}

public class SingletonTest {
    public static void main(String[] args) {
        Singleton singleton = new Singleton();
    }
}

위와 같은 코드는 컴파일 에러가 발생한다. Singleton 클라스의 생성자에 private 키워드로 외부 클래스에서 Singleton 생성자로의 접근을 막았기 때문.

그렇다면 Singletone 클래스의 객체는 어떻게 생성할까

class Singleton {
    private Singleton() {
    }

    public static Singleton getInstance() {
        return new Singleton();
    }
}

public class SingletonTest {
    public static void main(String[] args) {
        Singleton singleton = Singleton.getInstance();
    }
}

위와 같이 변경하면 getinstance 라는 static 메소드를 이용하여 Singleton 객체를 돌려 받을 수 있다. 하지만 getInstance를 호출 할 때마다 새로운 객체가 생성되기 때문에 싱글톤이 아니다.

class Singleton {
    private static Singleton one;
    private Singleton() {
    }

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

public class SingletonTest {
    public static void main(String[] args) {
        Singleton singleton1 = Singleton.getInstance();
        Singleton singleton2 = Singleton.getInstance();
        System.out.println(singleton1 == singleton2);
    }
}

Singleton 클래스에 one 이라는 static 변수를 두고 getInstance 메소드에서 one 값이 null 인 경우에만 객체를 생성하도록 하여 one 객체가 단 한번만 만들어지도록 했다.

getInstance 메소드가 계속 호출되어도 이미 만들어진 싱글톤 객체인 one 을 항상 리턴한다.

Written on September 13, 2021