Java

Static, Final, SingleTon Pattern

운덩하는 개발자 2022. 9. 1.
반응형

- static :변수에 static 키워드를 붙이면 자바는 메모리 할당(컴파일 할 때)을 딱 한번만 하게 되어 메모리 사용에 이점,

             static 으로 설정하면 같은 곳의 메모리 주소만을 바라보기 때문에 static 변수의 값을 공유함

 

- final : 재할당 할 수 없도록 만든다. 상속을하거나 초기화 이후 다시 초기화 불가능

 

- Static Method : 클래스안에서 static 메서드를 선언하면 다른 클래스에서 객체생성없이 class.staticmethod();로 바로 호출가능.

 

Java에서 static 키워드를 사용한다는 것은 메모리에 할당되어 프로그램이 종료될 때가 되서야 할당이 종료되는것

 

일반적으로 우리가 만든 Class는 Static 영엑에 생성되고, new 연산을 통해 생성한 객체는 Heap 영역에 생성.

객체의 생성시 할당된 Heap영역의 메모리는 Garbage Collector를 통해 수시로 관리 받음.

하지만 Static 키워드를 통해 Static영역에 할당된 메모리는 모든 객체가 공유하는 메모리라는 장점을 지님,

Garbage Collector의 관리 영역 밖에 존재하므로 Static를 자주 사용하면 프로그램의 종료시까지 메모리가 할당된 채로 존재하므로 자주 사용시 시스템의 퍼포먼스에 악영향

 

[ Static 변수 특징]

 - Static 변수는 클래스 변수

 - 객체를 생성하지 않고도 Static 자원에 접근이 가능 

 

Static 변수와 메소드는 Static 메모리 영역에 존재하므로 객체가 생성되기 이전에 이미 할당 되어 있다.

그래서 new로 객체를 생성하지 않고도 바로 접근 가능.

 

final 메서드 : 상속 시 해당 메서드 재정의 불가

final 클래스 : 해당 클래스를 상속할 수 없음. 즉, 상속 계층 구조에서 마지막 클래스가 됨.

 

static final : 상수를 만들 때 사용. 클래스에 존재하는 단 하나의 상수라는 뜻

           

Singleton Pattern(싱글톤 패턴)

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

 

class Singleton {
    private Singleton() {
    }
}

public class Sample {
    public static void main(String[] args) {
        Singleton singleton = new Singleton();  // 컴파일 오류가 발생한다.
    }
}

위와 같은 코드를 작성하면 컴파일 에러가 발생.

Singleton 클래스의 생성자에 private로 접근 제한을 했기 때문.

이렇게 생성자를 private로 만들어버리면 다른 클래스에서 Singleton 클래스를 new를 이용하여 생성 불가능.

 

new로 많은 객체를 생성하면 싱글톤의 정의에 어긋나기에 private로 new의 사용을 제한.

 

 

class Singleton {
    private Singleton() {
    }

    public static Singleton getInstance() {
        return new Singleton();  // 같은 클래스이므로 생성자 호출이 가능하다.
    }
}

public class Sample {
    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 Sample {
    public static void main(String[] args) {
        Singleton singleton1 = Singleton.getInstance();
        Singleton singleton2 = Singleton.getInstance();
        System.out.println(singleton1 == singleton2);  // true 출력
    }
}

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

 

<getInstance 메소드의 동작원리>

 

최초 getInstance가 호출 되면 one이 null이므로 new에 의해서 객체가 생성이 된다. 이렇게 한번 생성이 되면 one은 static 변수이기 때문에 그 이후로는 null이 아니게 된다. 그런 후에 다시 getInstance 메소드가 호출되면 이제 one은 null이 아니므로 이미 만들어진 싱글톤 객체인 one을 항상 리턴한다.

main 메소드에서 getInstance를 두번 호출하여 각각 얻은 객체가 같은 객체인지 조사 해 보았다. 역시 예상대로 "true"가 출력되어 같은 객체임을 확인 할 수 있다.

싱글톤 패턴은 static에 대한 이해만 있다면 참 알기쉬운 패턴 중 하나이다.

 

반응형

'Java' 카테고리의 다른 글

Java : 상속(Inheritance)  (0) 2022.08.08

댓글