자바의 static 키워드에 대해서 알아보자. 흔한 단어는 아닌 것 같은데, static은 무슨 뜻인가? 

 

static 의 dictionary.com 의 정의는 아래와 같다.

 

1. pertaining to or characterized by a fixed or stationary condition.

  - 고정되거나 움직이지 않는 상태가 특징이거나 그런 상태와 관계가 있는

2. showing little or no change

  - 변화가 거의 없는

3. lacking movement, development, or vitality:
  - 움직임,진전, 생동감이 없는

 

IT에서는 보통은 '정적, 고정' 이라는 해석을 많이 봐왔다. static IP 하면 고정 아이피 주소를 말한다.

 

static (정적인) 과 대비되는 단어는 dynamic (다이나믹한) 이다. 컴퓨터언어에서 정적인 것의 큰 특징은 런타임(실행시간)에서 변경이 되느냐 안되느냐의 차이다. 보통 static 이라 붙은 변수들은 실행시간 중에 변경되지 않는다.

 

값은 변경이 가능해도 형태는 변경이 불가능하다. main 함수가 호출되서 프로그램이 종료될 때까지 static 영역에서 메모리가 해제되지 않는다. 즉 예측이 가능한 특성이 있다. 값도 변경하길 원하지 않으면 final 을 사용하면 된다. static 과 final 이 붙어다니는 것은 서로 변하지 않는 특성이 있기 때문이다.

 

자바 class에서 static 변수는 인스턴스와의 차이에 주목한다. 멤버변수의 인스턴스는 여러개 이지만 클래스의 static 은 하나만 있다. 인스턴스는 사용이 끝나면 GC가 처리하지만 static 은 프로그램이 끝날 때까지 메모리에서 해제하지 못한다.

 

그러니까 static 키워드는 적용되는 언어나 문맥에 따라 차이가 나서 헷갈리기 쉽다. 분명히 정적인 변수인데 완전히 변하지 않는 상수하고는 다르다.

 

 

자바에서 static 키워드는 멤버 변수와 메서드에 사용할 수 있다. class 에도 사용할 수 있지만 그건 다른 포스트에서 다룬다.

 

https://www.w3schools.com/java/ref_keyword_static.asp

 

Java static Keyword

Java static Keyword ❮ Java Keywords Example A static method means that it can be accessed without creating an object of the class, unlike public: public class MyClass {   // Static method   static void myStaticMethod() {     System.out.println("Stat

www.w3schools.com

자바에서 static(스태틱) 키워드는 접근 제어자는 아니지만 메서드와 멤버 변수앞에 쓰면 그것들은 객체를 생성하지 않아도 사용 가능하다. (인스턴스가 없어도 사용 가능하다) static 변수의 경우 클래스가 메모리에 로드될때 이미 생성이 되며 여러개가 아니라 하나만 있다. 인스턴스가 많아도 static 의 값은 하나이다. 그래서 클래스 변수라고도 한다.

 

static 변수/메서드는...

 

1) new 키워드로 인스턴스를 생성하지 않아도 사용할 수 있다.

 

2) 클래스의 모든 인스턴스는 하나의 클래스변수를 공유한다.

 

3) static 메서드에서는 static 변수만 사용가능하다. (일반 메서드에서는 static 변수 사용가능함)

 

static 관계

그림으로 그려놓으니까 꽤나 관계가 복잡하다. 그래서 static이 어려운가보다.

 

일반의 멤버 변수는 new 로 인스턴스를 만들어야 사용할 수 있다. 그러나 static 변수는 처음부터 사용이 가능하다. 인스턴스를 여러개 만들어도 static 변수의 값은 1개만 유지된다. 즉 모든 인스턴스에게 공유되고 있는 것이다. 그리고 static 변수는 프로그램이 끝날 때까지 메모리에서 해제되지 않는다. 자바의 가비지 콜렉터(쓰레기 수거인)가 static 변수는 건드리지 않는다. 프로그램 도중에 언제라도 사용될 수 있다고 보기 때문이다. 때문에 static (고정적인) 인 것이다.

 

한편 static 메서드는 new 키워드로 객체를 생성하지 않아도 사용가능하다. 대신 멤버 변수에는 접근할 수 없게 되어있다. 어찌 보면 당연한게 static 이 아니므로 값 자체를 유지할 메모리 공간도 없다. new 로 생성하면 그것은 인스턴스일 것이고. 같은 말인데 static 변수와 메서드는 new 로 메모리에 생성하지 않아도 사용가능하다.

 

<간단 예제>

static

default class B의 간단한 예제이다. 멤버변수 num1에 static을 붙이면 main( ) 에서 바로 사용가능하다. 클래스명인 B와도트연산자 . 뒤에 num1 로 사용한다. 클래스 이름을 사용하니까 클래스 변수이다. B.show( ) 메서드도 마찬가지로 바로 사용가능하다.

 

static 만으로 이루어진 클래스도 있다. JDK에서 제공하는 Math 클래스는 java.lang 패키지 안에 있어서 따로 import 하지 않아도 사용이 가능한 클래스이다. Math.PI = 3.1415 ...(파이) 나 Math.E (자연로그) 값이 static 변수(값을 고칠 수는 없다. final 변수)이고 Math.random( ) 같은 메서드도 static 이라 언제라도 사용가능하다.

 

https://docs.oracle.com/javase/8/docs/api/java/lang/Math.html

 

Math (Java Platform SE 8 )

Returns the value of the first argument raised to the power of the second argument. Special cases: If the second argument is positive or negative zero, then the result is 1.0. If the second argument is 1.0, then the result is the same as the first argument

docs.oracle.com

static 키워드에 대하여 알아봤다. 보다보면 똑같은 이야기의 반복이 많다. 말만 조금씩 바꿔서 돌고 도는 설명이긴 하다. 어떤 관점에서 보느냐에 달려있기 때문에... static 키워드를 입체적으로 바라볼 수 있다면 자바를 더 잘 알게 되지 않을까 그런 기대를 한다.

 

 

 

공유하기

facebook twitter kakaoTalk kakaostory naver band