객체를 생성하지 않고 사용할 수 있는 필드와 메소드
항상 값이 변하지 않는 경우라면 static 사용시 메모리 할당을 딱 한번만 하게 되어 메모리의 이점을 얻을 수 있다.
static 으로 설정하면 같은 곳의 메모리 주소만을 바라보기 때문에 static 변수의 값을 공유하게 된다
-> 객체마다 가지고 있어야 할 데이터라면 인스턴스 필드로 선언
-> 객체마다 가지고 있을 필요가 없는 공용 데이터라면 정적 필드로 선언
-> 인스턴스 필드를 포함하고 있으면 인스턴스 메소드 선언
-> 인스턴스 필드를 포함하고 있지 않으면 정적 메소드 선언
static 메소드
메서드 앞에 static 키워드를 붙이면 객체 생성없이 클래스를 통해 메서드를 직접 호출할 수 있다.
스태틱 메서드 안에서는 객체변수 접근이 불가능 하다.
다른 변수가 static 변수이면 스태틱 메서드(static method)에서 접근이 가능하다.
클래스.필드;
클래스.메소드( 매개값, ... );
public class Calculator {
static double pi = 3.14159;
static int plus(int x, int y);
static int minus(int x, int y);
}
double result1 = 10 * 10 * Calculator.pi;
int result2 = Calculator.plus(10, 5);
int result3 = Calculator.minus(10, 5);
싱글톤은 단 하나의 객체만을 생성하게 강제하는 패턴.
프로그램에 불필요한 객체가 여러개 생성되는 것을 방지.
싱글톤 패턴을 사용하는 이유
공유 리소스에 대한 중복 생성을 방지하여 메모리를 절약
하나의 인스턴스를 통해 데이터나 서비스에 대한 일관성을 유지
전역 변수를 사용하지 않고도 객체 인스턴스에 접근 가능
public class Singleton {
// 정적 필드
private static Singleton instance;
// private 생성자
private Singleton() { }
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
외부에서 객체를 얻는 유일한 방법은 getInstance( ) 메소드를 호출하는 것
클래스 변수1 = 클래스.getInstance( );
클래스 변수2 = 클래스.getInstance( );
// 컴파일 에러
Singleton obj1 = new Singleton();
Singleton obj2 = new Singleton();
------------------------------------
Singleton obj1 = Singleton.getInstance();
Singleton obj2 = Singleton.getInstance();
-> obj1과 obj2는 같은 Singleton 객체