Java

[JAVA] 4. Static의 쓰임새와 Static 블록

히비스 2021. 4. 29. 15:52
  • Static은 객체를 생성하지 않아도 메소드를 호출할 수 있는 마법의 메소드.

 

------------------------------------------------------------------------

ex)

public class ReferenceStatic {

    public static void main(String args[]) {

        ReferenceStatic.staticMethod();    //객체 생성 없이 바로 메소드 호출

    }

 

    public static void staticMethod() {     //static 메소드 선언

        System.out.println("This is a staticMethod.");

    }

}

------------------------------------------------------------------------

 

  • 왜 모든 메소드에 static을 선언하지 않았을까?

static 메소드는 클래스 변수만 사용할 수 있다는 단점이 있음.

그렇다고 모든 변수에 static을 선언하게 되면

클래스 내 모든 객체에서 하나의 값만 바라보기 때문에...

큰 문제가 일어날 수 있다.

 

static String name;    // 클래스 변수 선언

public StaticVariable() {}    //생성자 생성

public StaticVariable(String name) {

    this.name = name;

}

 

StaticVariable variable1 = new StaticVariable("KMK");

System.out.println(variable1.name);

 

StaticVariable variable2 = new StaticVariable("JYJ");

System.out.println(variable1.name);

 

결과 : KMK

          JYJ

이유 : name이라는 변수는 다른 객체를 생성해도 첫 번째 이름 그대로이다.

 

 

 

  • Static 블록

- 객체는 여러 개를 생성하지만, 한 번만 호출되어야 하는 코드가 있다면 "static 블록"을 사용.

- 객체가 생성되기 전에 한 번만 호출.

- 클래스 내에 선언 O

- 메소드 내에 선언 X

- 클래스 초기화할 때 꼭 수행되어야 할 작업이 있을 경우 유용하게 사용됨.

 

static {

     // 딱 한번만 수행되는 코드

}

 

------------------------------------------------------------------------

ex)

//StaticBlock 선언

public class StaticBlock {

    static int data = 1;

    public StaticBlock() {

         System.out.println("StaticBlock Constructor.");

    }

     static {

         System.out.println("*** First static block. ***");

         data=3;

     }

     static {

         System.out.println("*** Second static block. ***");

         data=5;

     }

     public static int getData() {

          return data;

     }

}

 

// makeStaticBlock 메소드를 호출해보자.

public void makeStaticBlock() {

     System.out.println("Creating block1");

     StaticBlock block1 = new StaticBlock();

     System.out.println("Creating block1");

     System.out.println("-------------------");

     System.out.println("Creating block2");

     StaticBlock block2 = new StaticBlock();

     System.out.println("Creating block2");

}

 

//결과를 확인해보자.

Creating block1

***First static block.***

***Second static block.***

StaticBlock Constructor.

Creating block1

-------------------

Creating block2

StaticBlock Constructor.

Creating block2

------------------------------------------------------------------------

 

이처럼 static 블록은 생성자가 불리지 않더라도, 클래스에 대한 참조가 발생하자마자 호출됨.

 

 

 

 

 

 

*** 자바의 신(이상민 저)을 공부한 내용 중에 기억해야 할 개념들을 정리해 놓은 글 입니다.***