Java/Java Concept

[Java] static 변수( 클래스 변수)

군우 2018. 1. 18. 15:38


인스턴스 변수는 인스턴스가 생성되었을 때 접근이 가능한 변수이기 때문에 인스턴스 변수라는 이름이 붙게 되었다.


클래스 변수는 클래스가 정의만 되어도 접근이 가능한 변수이기 때문에 클래스 변수라는 이름이 붙게 되었다.


static으로 선언된 변수는 변수가 선언된 클래스의 모든 인스턴스가 공유하는 변수이다!


1.인스턴스의 생성과 상관없이 초기화되는 변수

2.하나만 선언되는 변수이다.

3. public으로 선언되면 누구나 어디든 접근이 가능하다.


static 으로 선언된 변수는 메모리 공간에 하나만 존재하며, 어디서나 접근이 반응하다. 단 , 변수도 public으로 선언되어야 접근이 가능하다.



클래스 변수 (static 변수)에 접근하는 방법

클래스 내부에서 접근하는 방법과

외부에서 접근하는 방법.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package variable10;
 
class AccessWay
{
    static int num=0;
    
    AccessWay()
    {
        incrCnt();
    }
    public void incrCnt(){num++;} //방법1
}
 
class ClassVarAccess
{
    public static void main(String[] args)
    {
        AccessWay way=new AccessWay();
        way.num++; // 방법2
        AccessWay.num++; //방법3
        System.out.println("num="+AccessWay.num);
    }
}
cs


static으로 선언 되었기 때문에 참조변수인 way 말고, 클래스 명으로도만

접근이 가능해졌다.


static 변수의 초기화 시점은 인스턴스 생성이 아니고,

jvm에 의해서 클래스가 메모리 공간에 올라가는 순간이다.

그러므로 static변수를 생성자를 통해서 초기화하는 실수를 하면안된다.

왜냐하면, 인스턴스가 생성 될때마다 새로운 값을 대입하는 꼴이 된다.


인스턴스 간에 데이터 공유가 필요한 상황에서는 static 변수를 선언한다!

예) 생성되는 인스턴스의 수를 세어야 하는 상황,

예) 변경되지 않으면서, 참조의 용도인 경우 ,  static final 로 선언


static  메소드는 메소드내에서 static 변수나 static 메소드가 아닌, 그냥 인스턴스 변수나, 인스턴스 메소드의 접근이 안된다! 같은 클래스에 있더라도 접근이 안된다.

static 으로 선언되면 공유하게 되는데 

여러개의 인스턴스로 생성해서 static메소드에 접근했을 때, 안에 static변수가 아닌게 있으면 어느 인스터의 변수에 접근한 것인지 구분이가지 않는다.  그래서 

static 메소드 내에서는  static 변수나 static메소드만 접근이 가능하다.

static은 따로 있다생각해야겟다.