자바

JAVA 자바 정적 멤버와 static - 정적 메서드와 블록 선언 시 주의할점, 싱글톤

알통몬_ 2017. 3. 12. 19:22
반응형


안녕하세요 알통몬입니다.

공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^

 

정적 메서드와 블록 선언 시 주의할 점

 정적 메서드와 정적 블록을 선언할 때 주의할 점은 객체가 없어도 실행된다는 특징 때문에,

이들 내부의 인스턴스 필드나, 인스턴스 메서드를 사용할 수 없습니다. 

 객체 자신의 참조인 this 키워드를 사용할 수 없습니다. 

그래서 아래 코드는 컴파일 오류가 발생합니다.

public class ClassName{

     //인스턴스 필드와 메서드

     int feild1;

     void method1() { ... }


    //정적 필드와 메서드

   static int feild2;

   void method2() { ... }


   //정적 블록

   static {

     feild1 = 10;  // (X) 컴파일 에러

     method1(); //  (X) 컴파일 에러

     feild2 = 10;  // (O)

     method2(); // (O)

  }


  //정적 메서드

  static void method3() {

     this.feild1 = 10;  // (X) 컴파일 에러

     this.method1(); //  (X) 컴파일 에러

     feild2 = 10;  // (O)

     method2(); // (O)

  }

}


정적 메서드와 정적 블록에서 인스턴스 멤버를 사용하고 싶다면 

아래와 같이 객체를 먼저 생성하고 참조 변수로 접근함.

  static void method3() {

     ClassName obj = new ClassName();

     obj.feild = 10;

     obj.method1();

  }


main()메서드도 동일한 규칙이 적용됩니다.

 main()메서드도 정적 메서드이므로 객체 생성 없이 인스턴스 필드와 인스턴스 메서드를  

main() 메서드에서 바로 사용할 수 없습니다.


예제)

public class Car {

int speed;

void run() {

System.out.println(speed + "으로 달립니다.");

}

public static void main(String[] args) {

Car myCar = new Car(); 

myCar.speed = 60;

myCar.run();

}

}


싱글톤(Singleton)

 http://blog.naver.com/rain483/220508219047


싱글톤 예제)

public class Singleton {

private static Singleton singleton = new Singleton();

private Singleton() {}

static Singleton getInstance() {

return singleton;

}

}


public class SingletonExample {

public static void main(String[] args) {

/*

Singleton obj1 = new Singleton();  //컴파일 에러

Singleton obj2 = new Singleton();  //컴파일 에러

*/

Singleton obj1 = Singleton.getInstance();

Singleton obj2 = Singleton.getInstance();

if(obj1 == obj2) {

System.out.println("같은 Singleton 객체 입니다.");

} else {

System.out.println("다른 Singleton 객체 입니다.");

}

}

}

반응형