static
static은 ‘정적인’, ‘고정된’ 이라는 의미를 갖는다. → 전역이라는 의미
객체 생성 없이 사용할 수 있는 필드와 메소드를 생성하고자 할 때 사용한다.
Static (Method) 영역
1.
JVM이 실행될 때 Class 가 로딩될 때 생성.
2.
Class의 정보, Static 변수(클래스 변수), 생성자(Constructor), 메소드(Method)와 같은 것들을 저장한다.
3.
Static 영역에 있는 것은 어디서든 접근 가능 하다.
4.
JVM이 종료 시(프로그램이 종료 시) 메모리에서 해제 된다. 즉 프로그램이 종료되기 전까진 메모리 상에 존재하게된다. 그렇기 때문에 어디서든 접근이 가능한 것이며, 무분별 하게 사용될 경우 메모리 부족 현상이 발생할 수 있다.
>>
static은 해당 메모리의 할당을 컴파일 단계에서 수행한다.
동적 데이터와 달리, static 데이터는 프로그램 실행 부터 종료까지 메모리의 수명이 유지된다.
→ Garbage Collector의 관리 영역 밖에서 동작한다.
public class Member {
static int age = 10;
}
>> 아래처럼 사용 가능
int memberAge = Member.age;
Java
복사
final
final은 ‘최종적인’ 이라는 의미를 갖는다.
final이 붙은 필드는 값이 저장되는 순간 최종적인 값이 된다. → 값의 수정이 불가능하다.
final 필드의 값을 저장하는 2가지 방법
1.
필드의 선언과 동시에 값을 초기화
2.
객체가 생성될 때 생성자를 통해 주입하는 방법
public class Shop{
final int closeTime = 21;
final int openTime;
public Shop(int openTime){
this.openTime = openTime;
}
}
Java
복사
closeTime은 한번 정한 시간으로 고정된다.
openTime은 객체가 생성자를 통해 생성될 때 설정할 수 있기 때문에,
openTime은 객체마다 다르게 설정이 가능하지만, closeTime은 고정되도록 설정할 수 있다.
static final
정적인 + 최종적인 의미를 갖는다. → 상수
final 키워드만으로 상수로 설정할 수 있다고 생각했지만,
final 필드를 생성자를 통해 값을 주입할 경우, 객체마다 다르게 값을 설정할 수 있기 때문에 완전한 상수로서 사용하긴 어렵다.
상수의 선언 방법
static final double PI = 3.141592;
Java
복사
static + final로 선언된 PI 값은 3.141592라는 불변의 값을 가진다.
해당 값은 객체마다 저장될 필요가 없으며(static의 성질) + 여러 값을 가질 수 없다(final의 특징).