모르지 않다는 것은 아는것과 다르다.

Java

Static 변수와 Static 메서드

채마스 2022. 2. 26. 00:14

Static 변수란?

  • 여러 인스턴스에서 공통으로 사용하는 변수이다.
  • 여러 인스턴스가 공유하는 기준 값이 필요한 경우 주로 사용된다.

  • static 변수는 인스턴스가 생성될때 메모리에 올라가는 것이니라 프로그램이 프로세스가 돼서 메모리에 적재 될때 Data영역에 위치하게 되고, 프로그램이 끝나서 메모리에서 언로드 되는 순간 소멸한다. (인스턴스가 생성될때는 Heap영역에 위치한다.)
  • 인스턴스 생성과 상관 없이 사용 가능하므로 클래스 이름으로 직접 참조할 수 있다. (ex> Employee.serialNum)
  • 예시는 아래와 같다.
public class Employee{
    public static int serialNum = 1000;

    private int id;
    private String name;
    private String department;

    public Employee(){
        serialNum ++;
        id = serialNum;
    }
}
public class test {
    public static void main(String[] args){

        Employee member1 = new Employee();
        Employee member2 = new Employee();

    }
}
  • 위와 같이 인스턴스들이 공통으로 가져야 할 serialNum은 static 변수로 선언해서 인스턴스들의 기준값으로 사용할 수 있다.
  • 또한 위와 같은 코드는 아래와 같이 메모리 영역에 할당된다.





Static 메서드

  • 클래스 메서드 라고도 한다.
public class Employee{
    public static int serialNum = 1000;

    private int id;
    private String name;
    private String department;

    public Employee(){
        serialNum ++;
        id = serialNum;
    }

    public static int getSerialNum(){
        return serialNum; // static 변수는 사용가능
    }

    public static int getName(){
        return name; // 오류 발생
    }
}
  • static 메서드는 인스턴스 생성과 무관하게 클래스 이름으로 호출 될 수 있음
  • 인스턴스 생성 전에 호출 될 수 있으므로 static 메서드 내부에서는 인스턴스 변수를 사용할 수 없음 -> static 메서드는 인스턴스 생성과는 상관없이 사용할 수 있는데 인스턴스 변수를 사용하게 된다면, 이미 생성도 되지않은 인스턴스의 변수를 사용하는 격이 된다.






Static 응용 -> 싱글톤 패턴

  • 싱글톤 패턴이란? -> 프로그램에서 인스턴스가 단 한 개만 생성되어야 하는 경우 사용하는 디자인 패턴이다.
  • static 변수, 메서드를 활용하여 구현 할 수 있다.
  • 예시는 아래와 같다.
public class Company{
    private static Company instance = new Company();

    private Company(){

    }

    public static Company getInstance(){
        return instance;
    }
}
  • 위와 같이 작성한 코드를 싱글톤 패턴이라고 할 수 있다.
public class test {
    public static void main(String[] args){

        Company company1 = Company.getInstance();
        Company company2 = Company.getInstance();

        // 두 값 모두 같은 주소값을 출력한다.
        System.out.println(company1);
        System.out.println(company2);

    }
}
  • 위의 코드처럼 인스턴스를 생성하지 않고 이미 인스턴스를 사용할 수 있다. -> static이기 때문에 이미 Data영역에 적재되었기 때문이다.
  • 또한 프로그램에서 유일한 인스턴스기 때문에 주소값도 동일한 것을 확인할 수 있다.

'Java' 카테고리의 다른 글

String,StringBuilder,StringBuffer  (0) 2022.02.26
Stream  (0) 2022.02.26
Optional  (0) 2022.02.26
Object 클래스  (0) 2022.02.26
Exception  (0) 2022.02.26