항상 값이 일정할 때 static
을 통해 메모리의 이점을 얻을 수 있다.
static
을 사용하면 변수의 값을 공유한다.
(static
사용시 같은 곳의 메모리 주소만 바라보기에 static
변수값 공유)
* "이"씨 집안을 나타내는 HouseLee 클래스의 성 공유하기(static)
class HouseLee{
static String lastname = "이"; // static통해 lastname 변수 공유
}
public class Sample{
public static void main(String[] args){
HouseLee lee1 = new HouseLee();
HouseLee lee2 = new HouseLee();
}
}
이처럼 lastname 변수에 static
키워드 붙이면 자바는 메모리 할당을 한번만 하게되어 메모리 사용에 이점이 있다.
만약 lastname의 값이 고정되기를 원한다면 static 키워드 앞에
final
키워드를 붙이면 된다.
* 웹사이트 방문마다 조회수 증가시키는 Counter 클래스 생성
class Counter{
static int count=0;
counter(){
count++;
System.out.println(count);
}
}
public class Sample{
public sttaic void main(String[] args){
Counter c1 = new Counter();
Counter c2 = new Counter();
}
}
static
키워드가 메소드 앞에 붙으면 스태틱 메소드가 된다.
예
class Couter{
static int count = 0;
Counter(){
count++;
System.out.println(count);;
}
public static int getCount(){ // static 메소드 추가
return count;
}
}
public class Sample{
public static void main(String[] args){
Counter c1 = new Counter();
Counter c2 = new Counter();
System.out.println(Counter.getCount()); // 스태틱 메서드는 클래스를 이용해 호출
}
}
getCount()
메소드에 static 키워드 생성을 통해 Counter.getCount()
처럼 객체 생성 없이 클래스를 통해 메서드를 직접 호출할 수 있다.
스태틱 메소드내에서 객체변수 접근이 불가능하다. 그러나 위 예에서는 count 변수가 static 변수이므로 스태틱 메소드에서 접근이 가능하다.
왜 count가 스태틱 변수인가?
class Counter에서static int count
로 선언했기 때문.
스태틱 메소드는 유티리성 메소드 작성시 많이 사용된다.
예를 들어 "오늘의 날짜 구하기", "숫자에 콤마 추가하기"등 메소드 작성 시 클래스 메소드를 사용하는 것이 유리하다.
* "날짜"를 구하는 Util 클래스의 예이다.
import java.text.SimpleDateFormat;
import java.util.Date;
class Util{
public static String getCurrentDate(String fmt){ // 스태틱 메소드
SimpleDateFormat sdf = new SimpleDateForamt(fmt);
return sdf.format(new Date());
}
}
public class Sample{
public static void main(String[] args){
System.out.println(Util.getCurrentDate("yyyyMMdd")); // 오늘 날짜 출력
}
}
예
class Singleton{
private Singleton(){ // private 생성자
}
}
public class Sample{
public static void main(String[] args){
Singleton singleton = new Singleton(); // 컴파일 오류 발생
위 클래스는 Singleton 클래스의 생성자에 private
키워드로 다른 클래스에서 Singleton 클래스로 생성자 접근을 막았으므로 컴파일 에러 발생. (new
로 생성 불가)
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.geInstance();
System.out.println(singleton1 == singleton2); // true 출력
}
}