posted by 귀염둥이채원 2019. 2. 28. 20:44

static은 '정적인, 움직이지 않는다'라는 뜻이다.


# static 변수

* static 변수를 “정적 변수”라고도 한다.

* static 키워드를 이용하여 선언한 변수는 해당 클래스의 모든 객체들에 의해 공유된다.

* static으로 선언한 변수는 메모리할당이 한 번만 이루어진다. (메모리 효율적)

* 모든 객체의 공통으로 사용하는 데이터를 관리할때 사용한다.


멤버변수에 static 키워드가 붙으면 인스턴스화를 하지 않고 사용이 가능하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class B {
    static int count = 0;
    int cnt = 0;
 
    public B() {
        count++;
        cnt++;
        System.out.println("static B : "+count);
        System.out.println("B : "+cnt);
    }
 
    public static void main(String[] args) {
        B b1 = new B();
        B b2 = new B();
        B b3 = new B();
    }
}
cs

결과는 count=3, cnt=1이다.

count는 static 변수라 메모리가 공유되어 있어서 증가가 되지만

cnt는 b1, b2, b3가 각각 새로운 클래스 인스턴스화 되어 메모리 영역이 다르다.


# static 메소드

* static 메소드를 “정적 메소드” 라고도 한다.

* 정적 메소드는 객체가 생성되지 않는 상태에서 호출되는 메소드이다.

* 정적 메소드 안에서는 정적 변수와 지역 변수만 사용할 수 있다.

* 정적 메소드 안에서는 인스턴스 메소드를 호출하지 못한다.

* 정적 메소드는 this 키워드를 사용할 수 없다. this를 참조할 인스턴스가 없기 때문이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class E {
    int e=3;
    static int r =4;
 
    public static void e() {
        System.out.println("hello");
        //e=4;   (e는 인스턴스 변수이므로 클래스 인스턴스화를 해야 사용가능하다)
        new E().e=4;
        r =5//static 변수이므로 사용가능
    }
    public static void main(String[] args) {
        E.e();
    }
}
cs

static 변수는 static 메서드에서 사용가능하지만 

인스턴스 변수는 static 메서드에서 사용 불가능하다.


# static 키워드의 사용범위

1. 모든 인스턴스에 공통적으로 사용해야 할 경우 static을 붙인다.

인스턴스를 생성하면, 서로 독립적이기 때문에 서로 다른 값을 유지하므로 각 인스턴스들이 공통값을 유지하기 위해서는 static을 사용한다.


2. static 키워드가 붙은 멤버변수나 메서드는 인스턴스(객체화)를 생성하지 않아도 사용할 수 있다.

static 변수와, 메서드는, 클래스가 메모리에 올라갈 때 자동으로 생성된다.


3. static이 붙은 메서드에서는 인스턴스 변수(not static)를 사용할 수 없다.


4. 메서드 내에서 인스턴스 변수를 사용하지 않는다면 static을 사용하는 것을 고려한다.

메서드 작업하면서 인스턴스 변수가 필요 하다면 static을 사용할 수 없지만, 인스턴트 변수가 필요 없다면 static을 사용한다. 

왜냐하면 메서드 호출시간이 짧기때문에 효율성이 좋아지기 때문이다.



# 참고사이트

https://mainia.tistory.com/83

https://dev-jangwon.github.io/java/2017/06/26/java-static/

https://includestdio.tistory.com/14

https://clairdelunes.tistory.com/43