티스토리 뷰

JAVA

static 정적메소드, 변수

H!GHR 2018. 11. 4. 22:01

Static 메소드

- Static 메소에서는 static 변수가 아닌 변수는 사용할 수 없다.

- Static 메소에서는 static 메소드가 아닌 메소드도 사용할 수 없다.

- 호출할 때는 클래스명을 사용해 호출한다. (아래 예제 기준으로 Chicken.정적메소드();)

> 레퍼런스 변수명( = new 클래스())로도 호출이 가능하지만 경고가 뜬다. (좋은 방법이 아니라는 얘기)

> 호출할 수 있다고 해서 참조하는 객체에 들어있는 인스턴스 변수를 사용한다거나 하는 것이 아니기 때문에


Static 변수

- 클래스가 처음 로딩될 때 초기화

- 인스턴스가 만들어질 때마다 초기화되지 않음.

1
2
3
4
5
6
7
8
9
public class Chicken {
 
    int chickenCount = 0;
    
    public int chicCnt() {
        return chickenCount++;
    }
 
}
cs

> 치킨이 0개인 치킨 클래스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Main {
 
    public static void main(String[] args) {
        Chicken c = new Chicken();
        Chicken k = new Chicken();
        
        for(int i=0; i<3; i++) {
            
            System.out.print("c = " + c.chicCnt() + " / ");
            System.out.println("k = " + k.chicCnt() + " / ");
 
        }
        
    }
}
cs

> 객체를 두 개 생성해서 각 객체마다 치킨이 몇 개 씩 생성하는지 확인해 보면??

c = 0 / k = 0 / 

c = 1 / k = 1 / 

c = 2 / k = 2 / 

> 각 객체마다 초기화가 되서 출력된다.


1
2
3
4
5
6
7
8
9
public class Chicken {
 
    static int chickenCount = 0;
    
    public int chicCnt() {
        return chickenCount++;
    }
 
}
cs

> 반면에 치킨이 0개인 클래스에서 치킨 카운트를 static 변수로 선언하면 그 결과는??

c = 0 / k = 1 / 

c = 2 / k = 3 / 

c = 4 / k = 5 / 

> 클래스가 처음 로딩될 때 초기화가 되서 인스턴스에 상관없이 값이 고정된다.

> 클래스의 새로운 인스턴스를 만들려고 할 때, or 클래스의 static 변수/메소드를 불러오려고 할 때 JVM에서 클래스를 불러온다.

> 클래스의 객체가 만들어지기 전에 static 변수 초기화 / static 메소드가 실행되기 전에 static 변수 초기화


댓글