본문 바로가기
자바

객체지향 프로그래밍 정리 2. static 변수

by 호놀롤루 2022. 3. 31.

1. 개요

static : 데이터 영역 메모리에서 여러 인스턴스들이 공유하는 변수

 

사용 예로는

  • 학생마다 새로운 학번 생성
  • 카드 회사에서 카드를 새로 발급할 때마다 새로운 카드 번호를 부여
  • 회사에 사원이 입사할 때마다 새로운 사번 부여

등이 있다.

 

2. 활용

2-1. static 개념 설명

static int serialNumber;

인스턴스가 생성될 때 만들어지는 변수가 아닌, 처음 프로그램이 메모리에 로딩될 때 메모리를 할당
하드디스크에 프로그램이 있고, 그 프로그램을 구동하면 프로그램이 메모리에 올라가게 된다.
이 상태를 프로세스라 하는데 2가지 영역을 가지게 된다. code, data 영역이 있는데 data영역엔 static
(상수), literal이 올라가고, code : instruction set (명령어 집합)이 들어가게 된다.

인스턴스가 생성될 때마다 heap메모리(동적 메모리)에 인스턴스가 올라가고, 인스턴스가 사라지면 GC에
의해 삭제된다. 하지만 static변수는 메모리 위치가 다르니 프로그램 시작시에 data영역에 로딩되고,
프로그램이 종료되고, 메모리에서 unLoad되는 순간 사라진다.


클래스 변수, 정적 변수라고도 한다 (인스턴스 변수와 반대)

 

인스턴스 생성과 관계없이 사용할 수 있으니 클래스 명으로 접근한다.

 

 

2-2. static 변수 코드 설명

public class Employee {

    public static int serialNumber = 1000;

    private int Id;
    private String name;
    private String department;

    public int getId() {
        return Id;
    }

    public void setId(int id) {
        Id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDepartment() {
        return department;
    }

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

 

public class test {
    public static void main(String[] args) {
        System.out.println(Employee.serialNumber);
    }
}

결과 : 1000

위에서 설명했던 것처럼 Employee 클래스의 객체를 생성하지 않았는데 static 변수에 접근할 수 있다.

 

그리고 다른 예를 보면

public class test {
    public static void main(String[] args) {
        Employee kim = new Employee();

        Employee im = new Employee();

        System.out.println(im.serialNumber);
        System.out.println(kim.serialNumber);

        im.serialNumber++;
        System.out.println(kim.serialNumber);
    }
}

결과 : 1000

1000

1001

static 변수는 모두가 같이 접근할 수 있으니 im의 serialNumber를 1 증가시켰는데 kim의 serialNumber도

변화한 것을 볼 수 있다.

 

메모리 영역의 관점에서 본다면 

data 메모리 영역에 serialNumber 가 있고, 스택 메모리 영역에는 kim, im이라는 참조 변수(지역변수)가 있다.

heap 메모리 영역에는 im과 kim의 실제 인스턴스가 존재하고, 스택 메모리 영역에 있는 kim, im이 data 메모리

영역에 있는 static 변수를 참조한다.

 

다시 한번 간단하게 정리하면

data 영역 : 프로그램 시작할 때 static, literal 등이 올라가는 자리

stack 메모리 영역 : 지역변수, function 등이 동작할 때 사용하는 자리 (for, if 등의 function에서 사용되는
변수는 지역변수가 되니 stack 메모리 영역에 적재)

heap 메모리 영역 : 인스턴스 등이 올라가는 동적 메모리, 삭제되면 GC가 수거해 감

 

2-3. static 변수 활용

public class Employee {

    public static int serialNumber = 1000;

    private int Id;
    private String name;
    private String department;

    public Employee() {
        Id = serialNumber++;
    }

    public int getId() {
        return Id;
    }

    public void setId(int id) {
        Id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDepartment() {
        return department;
    }

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

위의 코드를 보면 constructor(생성자)에서 Employee를 생성할 때마다, static변수인 SerialNumber를
집어넣고, 증가시키는 모습을 볼 수 있다. 아직은 시험단계니 대충 했지만 이렇게 사용할 경우 private static

변수로 사용하는 게 현명하다.

 

댓글