static 키워드는 메모리 낭비를 줄이기 위해 필요하다.
class HouseOh {
String lastname = "오";
}
public class Houses {
public static void main(String[] args) {
HouseOh oh1 = new HouseOh();
HouseOh oh2 = new HouseOh();
}
}
위의 코드를 살펴보자.
오씨집안은 전부 그 성씨가 오씨일 것이다.
따라서 lastname이라는 변수는 정적으로 할당되어 더이상 변할 일이 없는 변수인 것이다.
메모리낭비를 줄일 수 있지 않을까.
class HouseOh {
static String lastname = "오";
}
변수 lastname의 선언에 static 키워드를 붙이면 자바는 메모리 할당을 딱 한번만 하게 되어 메모리를 적게 사용할 수 있다.
한번 설정되면 그 값을 변경할 수 없다. 변경시 오류
클래스의 lastname 값이 변경되지 않기를 바란다면 static 앞에 final을 붙인다.
static을 사용하면 값을 공유할 수 있다.
static으로 설정하면 같은 메모리 주소 만을 바라보기 때문에 static 변수의 값을 공유하게 되는 것이다.
static 메서드를 사용하면 클래스의 객체 생성없이도 클래스를 통해 직접 메서드를 호출 가능
주의할 점은 static 메서드 안에서는 일반 객체 변수 접근이 불가능하다. 오직 static 변수만 접근이 가능하다.
그렇다면 static 메서드를 써야만 하는 때는 언제인가.
코드의 중복을 줄이고 가독성 향상을 위해
static 메서드는 특정 클래스나 인스턴스에 종속되지않고 재사용이 가능하고 범용 기능을 제공하는 메서드를 의미한다.
단 하나의 객체만을 생성하게 강제하는 디자인 패턴
class Singleton {
private static Singleton one;
private Singleton() {
}
public static Singleton getInstance() {
if(one==null) {
one = new Singleton();
}
return one;
}
}
public class Sample {
public static void main(String[] args) {
Singleton singleton1 = Singleton.getInstance();
Singleton singleton2 = Singleton.getInstance();
System.out.println(singleton1 == singleton2); // true 출력
}
}
one 이라는 static 변수를 작성하고, 메서드에서 one 값이 null인 경우에만 객체를 생성하도록 하여 one 객체가 딱 한번만 만들어지게 한다.
if 문이 없는 경우에는 메서드를 호출할 때마다 새로운 객체가 생성되기 때문에 싱글톤이 아니다.
이 경우 메서드를 재호출하게 되면 이미 만들어진 싱글톤 객체인 one을 항상 리턴한다.
자바에서 static으로 정의된 변수나 메서드는 메모리 할당이 한번만 일어나는 변수나 메소드를 의미한다.
이러한 static의 성질을 이용하여 만든 디자인 패턴이 singleton 디자인 패턴이다.
둘다 메모리 낭비 를 줄인다는 목적을 가진다.