아이티클래스

static 제한자

2020. 3. 30. 14:55

static 제한자


static 제한자는 클래스 로딩(Loading)시 해당 메소드나 변수를 메모리에 로딩시키는 기능을 한다. 이렇게 메모리에 로딩된 메소드나 변수는 객체를 생성하지 않더라도 접근할 수 있게 된다. static 제한자로 선언되지 않은 변수는 객체가 생성될 때마다 해당 변수를 복사하여 사용하지만 static 제한자로 선언된 변수는 자바가상머신에 의해 미리 메모리에 로딩되기 때문에 여러 객체들이 공유하여 사용할 수 있게 된다.



//StaticEx2 클래스의 객체를 생성하고 있다.
class StaticEx2
{
    public static int a=0;
}

public class StaticEx1
{
    public static void main(String argv[])
    {
        //생성된 객체의 변수에 1 대입
        StaticEx2 s1 = new StaticEx2();
        s1.a=1;

        //생성된 객체의 변수에 2 대입
        StaticEx2 s2 = new StaticEx2();
        s2.a = 2;

        //과연 출력 값은 몇일까요?
        system.out.println("a=" + s1.a);
    }
}

a가 static 제한자로 선언되어 있지 않다면 1을 출력할 것이다. 하지만 a가 static 제한자로 선언되어 있기 때문에 2가 출력된다. 즉 static 제한자로 선언된 변수는 객체가 생성될 때마다 생성되는 것이 아니라 이미 메모리에 로딩된 static 변수를 각 객체가 공유하여 사용하게 된다.



static 제한자로 선언된 메소드는 하위 클래스(상속을 받은 클래스)에서 static 제한자가 없는 메소드로 재정의(overriding) 하거나 일반 메소드(static 제한자로 선언되지 않은 메소드)를 하위 클래스에서 static 제한자로 선언된 메소드로 재정의 할 경우에 에러를 발생시킨다.

static 멤버는 top-level(가장 외부) 클래스 또는 static 제한자로 선언된 내부(inner) 클래스에만 선언될 수 있다.


'Java' 카테고리의 다른 글

if-else문 , switch문  (0) 2020.03.31
산술 연산자(+, -, *, /, %)  (0) 2020.03.30
abstract 제한자  (0) 2020.03.30
접근 제한자  (0) 2020.03.29
식별자(Identifier)  (0) 2020.03.29

이 글을 공유합시다

facebook twitter googleplus kakaoTalk kakaostory naver band