08-Static



정적멤버 static

프로그램 내에서 사용되어야 할 하나의 동일값이 있고, 프로그램이 종료될 때까지 이 값이 삭제되면 안될 경우 static을 사용한다.

static은 객체가 생성되기 이전 메모리를 저장하고, 단 하나의 메모리를 공유한다. 즉 매번 생성자를 호출할 필요도 없으며, 데이터도 생성시 단 한 번만 저장된다.

생성자 이전에 저장되기 때문에, 순서상 다음의 내용이 따라온다.

  • 호출시 객체가 필요 없다.
  • 내부에 인스턴스 필드나 인스턴스 메소드를 사용할 수 없다.
  • this 키워드도 사용이 불가능하다.


package day4;

class Person{
  
	String name;
	int age;
	static final String nation="대한민국"; // 공유가 수정되지 않게 하기 위해서. 
}


public class StaticTest {

	public static void main(String[] args) {
		
		Person p1 = new Person();
		p1.name = "박민국";
	  p1.age = 20;
	     
	    System.out.println(p1.name+":"+p1.age+":"+Person.nation );

	  Person p2 = new Person();
		p2.name = "김대한";
	  p2.age = 30; 
	  //p2.nation = "대한민국";
	  System.out.println(p2.name+":"+p2.age+":"+Person.nation );
	  
	}

}
final

final 필드는 초기값이 저장되면 이것이 최종의 값이 되어 프로그램 실행 중에 변경이 불가능하다.

이러한 static은 초기화 이후 값을 변경시키지 못하는 final과 함께 쓰이는 경우가 많다.



singleton

싱글톤은 딱 하나의 객체만 사용하도록 해주는 것이다. 생성자는 private으로 설계하고, static에는 자신의 변수 하나를 선언한다. 게터 메소드를 이용해, 자기 자신의 객체를 리턴하게 만든다.

다른 클래스에서 호출 시 유일한 통로가 되고, 공유되지 않는다.

class A{
		private A(){
		System.out.println("A생성자 호출");
	} //다른 클래스에서 생성자를 호출할 수 없는 것 
		
		private static A a1 = new A();

	static A getInstance(){
		return a1; // 객체가 생성되기 이전 메모리 저장 유지 /스테틱에서는 스테틱만 사용가 
	}
	
}

public class SingletonTest {

	public static void main(String[] args) {
		//A라는 객체는 이 프로그램이 끝날때까지 강제적으로 딱 한 번만 생성되게 할 것 
	   A.getInstance();
	   A.getInstance();
	   A.getInstance();
	   
	   //A타입 객체의 생성 통로를 A.getInstance(); 딱 하나 지정한 것 
	   //스태틱은 최초의 그것 하나만 만들어서 공유한다. 최초의 하나 만들어졌으면, 그 이후는 공유하는 것으로 생각.
	   //그러므로 단 하나만 호출됨. 왜냐? 앞에 private은 공유를 해당 class안에만 사용가능.
	     
	}

}