티스토리 뷰

프로그래밍/Java

자바(java) - static 예약어

황금비비새 2013. 7. 9. 14:20



static 예약어는 메서드 멤버변수에 정의할 수 있으며 지역변수클래스에게는 정의 할 수 없다. 

(예외 - 내부클래스)


# static 메서드, 멤버변수 정의 형식

 [접근제한] static [반환형] 메서드명(자료형 인자1, 자료형 인자2, ...){}

 [접근제한] static [자료형] 변수명;


* [접근제한] 과 static 은 자리가 바뀌어도 상관 없다.


# static 변수(클래스 변수)

static으로 선언되었다면 객체를 생성하지 않고도 사용할 수 있다. 그리고 현재 static 변수를 가지는 클래스를 아무리 많이 생성한다 해도 static 변수는 오직 하나만 만들어진다. 그리고 그것은 모든 객체가 공유하는 변수가 된다.

- 사용법: 클래스명.변수


# static 메서드(클래스 메서드)

static 메서드 또한 static 변수와 마찬가지로 공유 차원에서 사용되는 것이며 한가지 주의 해야 할 점이 있다면 static 메서드 안에서는 static이 아닌 instance 변수(멤버변수)들을 참조할 수 없다.

- 사용법: 클래스명.클래스메서드()


# static 초기화(static Initializers)

  static {

             수행문1;

             ...;

 }

static 초기화는 JNI(Java Native Interface) 기술을 적용하기 위해 사용되기도 한다. JNI 라는 것은 Native 메서드를 통해 라이브러리를 읽어 오는 데 쓰이는 기술이다.


예를 들자면 자바는 자체에서 하드웨어를 제어 할 수 없다. 이런 이유로 하드웨어를 제어하는 다른 언어의 라이브러리를 이용하여 하드웨어를 제어하게 하는 기술이 바로 JNI다. 그리고 클래스 내부에서 꼭 필요한 static 변수(클래스 변수) 들의 초기화를, 지금 얘기하는 static 초기화로 미리 정의하는 방법도 있다. 이것은 static 변수(클래스 변수)에 잘못된 값으로 초기화되는 것을 막고 현재 클래스 내에 static 변수를 선언하게 하여 프로그램의 신뢰성을 높이는 데도 쓰인다. 


- static 초기화 예제

public class StaticTest4 {
    static{
        System.out.println("Static init1");
    }
    
    static String s = echo("string");
    
    static{
        System.out.println("Static init2");
    }
    
    static String echo(String s){
        System.out.println(s);
        return s;
    }
    
    public static void main(String[] args) {
        System.out.println("main");
        StaticTest4 st4 = new StaticTest4();
    }
}
// 결과 /////////////////////////////////////////////////////////////////////
/* ************************************************************************
Static init1
string
Static init2
main
************************************************************************** */


댓글