static 은 변수나 메소드 키워드에 사용된다.
프로그램 실행시에 할당되고 종료시에 해제된다.
일반적으로 우리가 만든 class 는 Static 영역에 생성이되고 객체 생성시에 heap 영역에 할당이 된다.
static 키워드를 사용한 변수는 클래스가 메모리에 올라갈 때 자동으로 생성이 된다. 즉, 객체생성 없이 바로 사용가능하다.
GC가 관리하지 않는다. 따라서 남용할시에 시스템 퍼포먼스에 악영향을 줄 수 있다.
스태틱 메소드 안에서는 객체변수 접근이 불가능 하다.
package encapsualtion;
class LeeHouse{
private String name = "EasyAn";
public String address;
}
class WestHouse{
private String name = "Genius";
public String address;
}
class HanHouse{
private String name ="LongMin";
public String address;
}
public class staticExample {
public static void main(String[] args) {
WestHouse w = new WestHouse();
w.address = "인천시 어딘가";
WestHouse w2 = new WestHouse();
w.address = "서울시 어딘가";
}
}
영재형이 집을 하나 당첨되고 또 하나 당첨되었다
이때 영재형에 집 정보를 가지고있는 객체를 하나 더 생성하여 그 집에대한 주소를 넣어주었는다.
별 문제없는 코드지만 w 와 w2 객체가 가지고있는 name값이 같아야 하지만 서로 달라질수 있다.
이렇게 항상 변하지 않는경우라면 static 키워드를 사용해서 메모리의 이점을 가져올 수 있다.
package encapsualtion;
class LeeHouse{
public static String name = "EasyAn";
public String address;
}
class WestHouse{
public static String name = "Genius";
public String address;
}
class HanHouse{
public static String name ="LongMin";
public String address;
}
public class staticExample {
public static void main(String[] args) {
WestHouse w = new WestHouse();
WestHouse w2 = new WestHouse();
w.address = "인천시 어딘가";
w2.address = "서울시 어딘가";
}
}
이렇게 사용하면 name 필드는 메모리에 단 한번만 할당하기 때문에 메모리 사용 이점을 가져올 수 있다.
또한 static을 사용하면 같은 곳의 메모리 주소만을 바라보기 때문에 static 변수의 값을 공유할 수있다.
package encapsualtion;
class LeeHouse{
public static String name = "EasyAn";
public String address;
}
class WestHouse{
public static String name = "Genius";
public String address;
}
class HanHouse{
public static String name ="LongMin";
public String address;
}
public class staticExample {
public static void main(String[] args) {
WestHouse w = new WestHouse();
WestHouse w2 = new WestHouse();
w.address = "인천시 어딘가";
w2.address = "서울시 어딘가";
w.name = "MyeongRae";
System.out.println(w.name);
System.out.println(w2.name);
}
}
//////출력값
MyeongRae
MyeongRae
static을 응용한 디자인패턴중 싱글톤 패턴에 대해 알아보자.
package encapsualtion;
class EasyAn{
public String name = "EasyAn";
public String address = "서울시 어딘가";
public String phone = "010-1231-1234";
public String birthDay = "99xxxx";
}
class Genius{
public String name = "Genius";
public String address = "인천시 어딘가";
public String phone = "010-1231-1234";
public String birthDay = "90xxxx";
}
class LongMin{
public String name ="LongMin";
public String address = "서울시 어딘가";
public String phone = "010-1231-1234";
public String birthDay = "97xxxx";
}
public class staticExample {
public static void main(String[] args) {
EasyAn easyAn = new EasyAn();
}
}
new 키워드를 사용해 easyAn 이라는 객체를 만들어냈다. 이는 단 한명만 존재해야하는 사람을 여러명만들어 낼수있다는것 굉장히 큰 문제이다.
이때 우리는 싱글톤 패턴을 이용하여 new 키워드를 제한하고 하나의 객체만 사용하도록 제한할 수 있다.
package encapsualtion;
class LongMin{
private static LongMin hanLongMin;
private LongMin() {
}
public static LongMin getInstance() {
if(hanLongMin == null) {
hanLongMin = new LongMin();
}
return hanLongMin;
}
public String name ="LongMin";
public String address = "서울시 어딘가";
public String phone = "010-1231-1234";
public String birthDay = "97xxxx";
}
public class staticExample {
public static void main(String[] args) {
LongMin h1 = LongMin.getInstance();
LongMin h2 = LongMin.getInstance();
}
}
순서대로 살펴보자 먼저 생성자를 private 접근제한자로 지정해주면서 new keyword를 사용할 수 없게 만들었다.
그 이후 필드에 hanLongMin이라는 변수를 static 메모리에 할당하였다.
getInstance() 를 사용할 때 hanLongMin 변수에 할당된것이 없으면 생성자를 통해 객체를 Heap 에 할당했고 이후에 hanLongMin 이라는 객체를 반환한다.
따라서 LongMin class 사용하기 위해서는 getInstance를 사용할 수 밖에 없다.