(공감과 댓글 하나는 글쓴이에게 큰 힘이 됩니다.)

 

변수나 메소드에 static이라는 예약어가 붙으면 각각 클래스 변수와 클래스 메소드가 된다. 인스턴스가 생성될 때만 사용 가능한 인스턴스 변수, 인스턴스 메소드와는 다르게 클래스가 정의만 되어도 접근해서 사용이 가능하다.

 

 

■ static 변수(클래스 변수)

- 딱 한번만 정의되어 모든 인스턴스에서 공유되는 변수이다. 프로그램이 실행될 때 생성돼서 프로그램이 종료될 때 GC(Garbage Collector)에 의해 소멸된다. 인스턴스의 생성 여부에 상관없이 메모리에 올라가므로 클래스 변수라고도 하며, 클래스의 이름으로 접근할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Employee {
    public static int employeeCount;
        
    public Employee() {
        ++employeeCount;
    }
}
 
public class Main {
    public static void main(String[] args) {
        Employee e1 = new Employee();
        System.out.println(e1.employeeCount); // 1
        System.out.println(Employee.employeeCount); // 1
        
        Employee e2 = new Employee();
        System.out.println(e1.employeeCount); // 2
        System.out.println(Employee.employeeCount); // 2
    }
}
cs

Line 2 : static 변수 employeeCount 선언

Line 4 ~ Line 6 : 디폴트 생성자 (static 변수 employeeCount의 값을 1 증가)

Line 11 : 인스턴스 생성

Line 12 : 참조 변수를 이용한 employeeCount 출력

Line 13 : 클래스를 이용한 employeeCount 출력

Line 16 : 참조 변수를 이용한 employeeCount 출력

Line 17 : 클래스를 이용한 employeeCount 출력

 

■ static 메소드(클래스 메소드)

- static 변수와 동일한 방식으로 호출하게 되며, static 메소드가 삽입된 클래스의 모든 인스턴스로부터 접근이 가능하다. static 메소드 안에서는 인스턴스 변수의 사용이 불가능하다. (static 메소드는 프로그램의 시작과 동시에 메모리에 올라가는데, 인스턴스 변수는 인스턴스가 생성됐을 때 메모리에 올라가므로 참조가 불가능)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Employee {
    private static int employeeCount;
    private int temp;
 
    public static int getEmployeeCount() {
        return employeeCount;
    }
 
    public static void setEmployeeCount() {
        // temp = 1;
        ++employeeCount;
    }
}
 
public class Main {
    public static void main(String[] args) {
        System.out.println(Employee.getEmployeeCount()); // 0
        Employee.setEmployeeCount();
        System.out.println(Employee.getEmployeeCount()); // 1
    }
}
cs

Line 2 : static 변수 employeeCount를 private으로 선언 (getter, setter를 통한 접근만 가능)

Line 3 : 멤버 변수 temp 선언

Line 5 : static 변수 employeeCount의 값을 얻어오기 위한 get 메소드

Line 9 : static 변수 employeeCount의 값을 설정하기 위한 set 메소드

Line 10 : static 변수와 static 메소드는 인스턴스의 생성에 상관없이 메모리에 올라가는데, 인스턴스 변수인 temp는 인스턴스가 생성되는 경우에 메모리에 올라간다. static 메소드를 메모리에 올리기 전에 인스턴스의 생성이 불가능하기 때문에 해당 부분은 에러가 발생한다.

Line 17 : static 메소드를 호출 employeeCount의 값 출력

Line 18 : static 메소드를 호출하여 employeeCount의 값 1 증가

Line 17 : static 메소드를 호출 employeeCount의 값 출력

'Java' 카테고리의 다른 글

자바(Java) 다차원 배열  (0) 2020.07.04
자바(Java) 배열(Array)  (0) 2020.07.04
자바(Java) this 예약어  (0) 2020.07.03
자바(Java) 접근 제어자  (0) 2020.06.30
자바(Java) 생성자(Constructor)  (0) 2020.06.30

+ Recent posts