[JAVA] static 변수와 메서드 /static 응용- 싱글톤 패턴

GyeongEun Kim·2021년 6월 15일
0
post-custom-banner

static 변수

static변수는 정적변수 라고도 하며, 어떤 변수를 여러 클래스에서 공통으로 사용할 때 이용한다. 클래스 내부에 선언하며, static예약어를 사용한다.

static int serialNum;`

static 변수는 인스턴스가 생성될 때마다 새로 생성되는 변수가 아니다. 프로그램이 실행되어 메모리에 적재됐을 때 한 번 메모리 공간이 할당된다. 그리고 이 값은 모든 인스턴스가 공유한다.

static 변수는 인스턴스 생성과는 별개이므로 인스턴스보다 먼저 생성된다. 그러므로 인스턴스가 아닌 클래스 이름으로도 참조하여 사용할 수 있다. 그래서 자바에서는 static변수를 클래스 변수라고도 한다.

static 메서드

일반 멤버 변수를 위한 메서드가 존재하듯이 static 변수를 위한 메서드도 있다. 이를 static 메서드 또는 클래스 메서드 라고 한다.

주의할 점 ! static 메서드 내부에서는 인스턴스 변수를 사용할 수 없다.

아래 예제를 보면 getSerialNum()의 두번째 줄에서 에러가 발생한다.

public class Student2 {
    private static int serialNum = 1000;
    //static 변수
    int studentID;
    String studentName;
    int grade;
    String address;
  
    
    public static int getSerialNum() { //static 메서드
    	int i=10; //지역변수이기 때문에 사용 가능
    	studentName = "총총"; //인스턴스 변수이기 때문에 사용 불가
    	return serialNum; //static 변수이기 때문에 사용 가능
	}
    }

오류가 발생하는 이유는 studentName은 Student2클래스의 멤버변수로, 인스턴스가 생성될 때 만들어지는 인스턴스 변수이기 때문이다!


싱글톤 패턴(Singleton Pattern)

싱글톤 패턴이란, 디자인 패턴의 종류 중 하나로 static을 응용하여 프로그램 전반에서 사용하는 인스턴스를 하나만 구현하는 방식이다.

다음은 싱글톤 패턴을 구현하는 예제이다.

1. 생성자를 private으로 만들기

디폴트 생성자의 접근제어자는 항상 public이므로 이를 private로 변경해야 한다. 접근제어자가 public이면 외부에서 인스턴스를 맘대로 생성할 여지가 있기 때문이다.

public class Company {
	private Company() {} //생성자
    }

2. 클래스 내부에 static으로 유일한 인스턴스 생성하기

이제 접근제어자가 private이므로 외부에서 인스턴스를 생성할 수 없다. 하지만 사용할 인스턴스가 하나 필요하므로 여기서 유일한 인스턴스를 생성한다. 또, 이 인스턴스를 private로 선언해야 외부에서 함부로 접근하려는 시도를 막을 수 있다.

public class Company {
	private static Company instance = new Company(); //유일하게 생성한 인스턴스
    
 	private Company() {} //생성자
    
    }

3. 외부에서 참조할 수 있는 public 메서드 만들기

private로 선언한 유일한 인스턴스를 외부에서 사용할 수 있게 하려면 public 메서드를 선언해야 한다. 인스턴스를 반환하는 메서드는 반드시 static으로 선언해야 한다. 왜냐하면 getInstance()메서드는 인스턴스 생성과 관계 없이 호출할 수 있어야 하기 때문이다.

public class Company {
	private static Company instance = new Company(); //유일하게 생성한 인스턴스
 	private Company() {} //생성자
    
    	public static Company getInstance() {
    	if (instance == null) {
    		instance = new Company();
   		 }
    	return instance;
    	}
  }

4. 실제 사용하는 코드 만들기

이제 외부 클래스에서 유일하게 생성된 인스턴스를 가져와 사용하면 된다

Company myCompany = Company.getInstance();
profile
내가 보려고 쓰는 글
post-custom-banner

0개의 댓글