문법 | 설명 |
---|---|
static | 객체마다 가질 필요가 없는 공용으로 사용하는 필드 혹은 인스턴스 필드를 포함하지 않는 메소드 |
final | 한 번 값이 정해지고 나면 값을 바꿀 수 없는 필드 |
static final | 모든 영역에서 고정된 값으로 사용하는 상수, 생성 즉시 값을 넣어줘야 한다. |
static은 "고정된"
을 의미하며 "전역"이라고 이해하면 쉽다, 객체 생성 없이 사용할 수 있는 필드와 메소드를 생성하고자할 때 사용한다.
필드나 메소드를 객체마다 다르게 가져야 한다면 인스턴스로 생성하면 되고
공용 데이터에 해당하거나 인스턴스 필드를 포함하지 않는 메소드를 선언하고자 할 때 이용한다.
인스턴스란? 객체를 소프트웨어에 실체화한 것
사용하기 위해선 클래스 내에서 필드나 메소드 선언 시 static 키워드를 붙여주기만 하면 된다.
public class PlusClass{
static int field1 = 15;
static int plusMethod(int x, int y){ return x+y; }
}
다음과 같이 선언하고
int ans1 = PlusClass.plusMethod(15,2);
int ans2 = PlusClass.field1 + 2;
다음과 같이 바로 "클래스이름.필드" 로 사용할 수 있다.
또한, 정적 메소드는 객체 참조 없이 바로 사용할 수 있는 특징 때문에
인스턴스 필드나 메소드, 그리고 this 키워드를 사용할 수 없다.
public class PlusClass{
static int field1 = 15;
int field2;
void method1(){}
static void method2(){}
static int plusMethod(int x, int y){
this.field2 = 10; // <-- x
this.method1(); // <-- x
field1 = 10; // <-- o
method2(); // <-- o
}
}
또한 static은 메소드 영역에 저장되기 때문에 시스템 종료 시 까지 계속 메모리에 남게 된다.
final은 "최종적인"
이라는 의미
즉 해당 변수는 값이 저장되면 최종적인 값이 되므로, 수정이 불가능하다는 의미이다.
final 필드에 값을 저장하는 방법은
선언과 동시에 값을 저장하는 방법과, 선언 후 나중에 저장하는 방법이 있다.
public class Shop{
// Shop 인스턴스는 closeTime을 바꿀 수 없고, 통일됨
final int closeTime = 21;
// Shop 인스턴스는 openTime을 각자 설정할 수 있고,
// 한번 설정하면 바꿀 수 없음
final int openTime;
public Shop(int openTime){
this.openTime = openTime;
}
}
static + final = "고정된 + 최종적인"
의 의미로, 상수를 선언하고자 할 때 사용된다.
상수란, fixed로 변하지 않는 값을 뜻하는데
위의 예시에서, closeTime은 21로 변하지 않지만, openTime은 객체마다 다를 수 있음을 보였으므로 final 자체만으로는 상수를 의미할 수 없다.
static final은 아래와 같은 형태로 선언할 수 있다.
static final double PI = 3.141592;