[JAVA #9] 여러 인스턴스에서 공통으로 사용하는 static 변수

HJoo·2022년 12월 20일
0

TodayStudy

목록 보기
11/111
post-thumbnail

static 변수란

  • 공통으로 사용하는 변수가 필요한 경우

    여러 인스턴스가 공유하는 기준 값이 필요한 경우
    ex) 학생마다 새로운 학번 생성
    카드 회사에서 카드를 새로 발급할 때마다 새로운 카드 번호를 부여
    회사에 사원이 입사할 때마다 새로운 사번이 필요

  • static 변수의 선언
    ex) public static int num

    인스턴스가 생성될 때 만들어지는 것이 아닌 처음 프로그램이 메모리에 로딩될 때 메모리를 할당
    클래스 변수, 정적 변수, 인스턴스 변수 라고도 한다

    • 프로그램을 구동하면 메모리에 프로그램이 올라간다
      메모리에 올라간 상태를 프로세스 상태라고 한다
      두 가지 영역
      -코드영역 : 명령어 집합이 들어가서 라인마다 실행된다
      -데이터영역 : 처음부터 메모리를 잡는 데이터들, 상수/리터럴/static변수, 프로그램이 다 끝나고 프로그램이 업로드 되는 순간 없어진다
      반면에 인스턴스가 생성될 때마다 사용하는 메모리인 heap메모리는 동적 메모리이고 인스턴스가 사라지는 순간 garbage collector가 메모리를 수거한다

회사 사번 예제

  • 인스턴스에서 참조해서 써도 되지만 클래스 자체가 생성될 때 같이 생성되기 때문에 클래스에서 참조해서 써라

Employee.java

public class Employee {
    private static int serialNum = 1000;
    private int employeeId;
    private String employeeName;
    private String department;

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

    public static int getSerialNum() {
        int num = 1;  //지역변수는 상관 없고
//        employeeName = "유현주"; 인스턴스 변수는 사용 불가 
        return serialNum;  //static 변수
    }

    public int getEmployeeId() {
        return employeeId;
    }

    public void setEmployeeId(int employeeId) {
        this.employeeId = employeeId;
    }

    public String getEmployeeName() {
        return employeeName;
    }

    public void setEmployeeName(String employeeName) {
        this.employeeName = employeeName;
    }

    public String getDepartment() {
        return department;
    }

    public void setDepartment(String department) {
        this.department = department;
    }
}

EmployeeTest.java

public class EmployeeTest {
    public static void main(String[] args) {
        Employee employeeYoo = new Employee();
        employeeYoo.setEmployeeName("유현주");

        System.out.println(employeeYoo.getSerialNum());

        Employee employeeKim = new Employee();
        employeeKim.setEmployeeName("김현주");

        System.out.println(employeeYoo.getEmployeeName() + "님의 사번은 " + employeeYoo.getEmployeeId());
        System.out.println(employeeKim.getEmployeeName() + "님의 사번은 " + employeeKim.getEmployeeId());

    }

}

static 메서드

  • static 메서드에서는 인스턴스 변수를 사용할 수 없다(멤버 변수를 사용할 수 없다)
    인스턴스 생성과 무관하게 호출될 수 있기 때문에

변수의 유효 범위와 메모리

  • static 변수는 프로그램이 메모리에 있는 동안 계속 그 영역을 차지하기 때문에 너무 큰 메모리를 할당하지 않아야함
  • 클래스 내부의 여러 메서드에서 사용하는 변수는 멤버 변수로 선언하는 것이 좋음
  • 멤버 변수가 너무 많으면 인스턴스 생성에 쓸 데 없는 메모리가 할당됨
  • 상황에 맞게 변수를 선택해야함

싱글톤 패턴

  • 프로그램에서 인스턴스가 단 한 개만 생성되어야 하는 경우 사용하는 패턴
  • static 변수, 메서드를 활용하여 구현할 수 있음
  1. 생성자는 private으로 선언
  2. 클래스 내부에 유일한 private 인스턴스 생성
  3. 외부에서 유일한 인스턴스를 참조할 수 있는 public 메서드 제공

Company.java

public class Company {

    private static Company instance = new Company();

    private Company(){

    }

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

}

CompanyTest.java

public class CompanyTest {
    public static void main(String[] args) {
        Company company1 = Company.getInstance(); //이미 생겨있어서 new 할 필요가 없음
        Company company2 = Company.getInstance();

        System.out.println(company1);
        System.out.println(company2);
    }
}

static/싱글톤 실습

  • 자동차 공장이 있습니다. 자동차 공장은 유일한 객체이고, 이 공장에서 생산되는 자동차는 제작될 때마다 고유의 번호가 부여됩니다.
    자동차 번호가 10001부터 시작되어 자동차가 생산될 때마다 10002, 10003 이렇게 번호가 붙도록 자동차 공장 클래스, 자동차 클래스를 구현하세요
    다음 CarFactoryTest.java 테스트 코드가 수행 되도록 합니다.
  • 공장 클래스 - Factory
  1. 공장 인스턴스를 static으로 생성, 생성자를 private으로
  2. createCar 메서드 만들기 - Car 클래스에서 생성자로 생성
  3. getInstance만들기
public class Factory {

    private static Factory instance = new Factory();

    private Factory(){

    }
    public Car createCar(){
        return new Car();
    }

    public static Factory getInstance(){
        if (instance == null){
            instance = new Factory();
        }
        return instance;
    }
}
  • 자동차 클래스 - Car
  1. 자동차 번호 생성
  2. 시리얼번호 static으로 생성
  3. 자동차 생성자 시리얼 번호 부여
public class Car {
    public int carNum;
    private static int serial = 10000;

    public Car(){
        serial++;
        this.carNum = serial;
    }

    public int getCarNum(){
        return this.carNum;
    }
}
profile
안녕하세요. Chat JooPT입니다.

0개의 댓글