static 변수
- 값이 변하지 않는 경우라면 static 사용 시 메모리의 이점을 얻을 수 있다.
public class HousePark {
// 변경 전: String lastname = "박";
static String lastname = "박";
public static void main(String[] args) {
HousePark pey = new HousePark();
HousePark pes = new HousePark();
}
}
- lastname 변수에 static 키워드를 붙인다.
- 자바는 메모리 할당을 딱 한번만 하게 되어 메모리 사용에 이점을 볼 수 있게된다.
- 만약 lastname 값이 변경되지 않기를 바란다면 static 키워드 앞에 final이라는 키워드를 붙인다.
- final 키워드는 한 번 설정되면 그 값을 변경하지 못하게 하는 기능이 있다.
- 변경하려고 하면 예외가 발생한다.
- static의 공유의 개념
- static 으로 설정하면 같은 곳의 메모리 주소만을 바라보기 때문에 static 변수의 값을 공유하게 된다.
public class Counter {
// 변경 전: int count = 0;
static int count = 0;
Counter() {
this.count++;
System.out.println(this.count);
}
public static void main(String[] args) {
Counter c1 = new Counter();
Counter c2 = new Counter();
}
}
/*
변경 전 출력 결과
1
1
변경 후 출력 결과
1
2
*/
- 위의 예시처럼 static 키워드는 공유하기 위한 용도로 자주 쓰인다.
static method
- static이라는 키워드가 메소드 앞에 붙은 것
public class Counter {
static int count = 0;
Counter() {
this.count++;
}
public static int getCount() {
return count;
}
public static void main(String[] args) {
Counter c1 = new Counter();
Counter c2 = new Counter();
System.out.println(Counter.getCount());
}
}
// 출력 결과: 2
- main 메소드에서 getCount() 메소드는 Counter.getCount() 와 같이 클래스를 통해 호출할 수 있게 된다.
- static 메소드 안에서는 인스턴스 변수 접근이 불가능하다.
- count는 static 변수이기 때문에 static 메소드에서 접근이 가능하다.
Singleton Pattern
- 디자인 패턴 중 하나로, 단 하나의 객체만을 생성하게 강제하는 패턴이다.
- 즉, 클래스를 통해 생성할 수 있는 객체는 한 개만 되도록 만든다.
class Singleton {
private static Singleton one;
private Singleton() {
}
public static Singleton getInstance() {
if(one==null) {
one = new Singleton();
}
return one;
}
}
public class SingletonTest {
public static void main(String[] args) {
Singleton singleton1 = Singleton.getInstance();
Singleton singleton2 = Singleton.getInstance();
System.out.println(singleton1 == singleton2);
}
}
// 출력 결과: true
- Singleton 클래스에 one 이라는 static 변수를 둔다.
- getInstance 메소드에서 one 값이 null 인 경우에만 객체를 생성하도록 한다.
- getInstance 메소드의 동작 원리
- 최초 getInstance가 호출되면 one이 null이므로 new에 의해서 객체가 생성이 된다.
- 이렇게 한 번 생성되면 one은 static 변수이기 때문에 그 이후로는 null이 아니게 된다.
- 이후에 다시 getInstance 메소드가 호출되면 이제 one은 null이 아니므로 이미 만들어진 singleton 객체인 one을 항상 리턴하게 된다.
- main에서 최초로 호출된 singleton1 과 이후 호출된 singleton2 가 같은지 출력한다.
- 결과가 true이므로 같은 객체임을 확인한다.
댓글