static , final , final static의 차이의 정리
Static
객체 생성 없이 사용할 수 있는 필드와 메소드를 생성하고자 할때 활용한다.
사용하기 위해신 필드나 메소드 선언시 앞에 static 키워드를 붙인다
private static int number = 100;
여기에 number를 1씩 증가시키는 ++number를 사용하면 static이기 때문에 호출될때마다 101 , 102 ... 로 올라간다
만약 static이 아니라면 증가메소드가 실행할때 올라가고 다시 값을 바꾸지 않는 이상 100으로 돌아가게 된다.
( ++number 는 전치연산자이기때문에 1을 증가시키고 출력된다.
number++는 후치연산자이므로 출력된 후에 1을 증가시키게 된다. )
static의 특징은 인스턴스 필드 , 메소드 , this 키워드를 사용불가하다.
인스턴스 성질은 객체 생성 후 사용할 수 있기 때문에 정적 메소드는 사용할 수 없기 때문이다.
Final
Final을 붙인 해당 변수는 최종적인 값이므로 , 수정이 불가능하다
선언할 시 동시에 값을 넣을 수 있고 , 생성자에 의해 값을 줄 수도 있다.
final int time = 21;
Static final
고정 + 최종적인 의 의미
상수를 선언하고자 할때 사용한다.
예를 들어
static final double PI = 3.141592;
상수 pi 값은 고정되어 있으므로 불변의 값을 가진다.
해당값은 객체마다 저장될 필요가 없고 ( Static의 성질) + 여러 값을 가질 수 없다 ( Final ) 의 특징
private final static DateTimeFormatter DTF = DateTimeFormatter.ofPattern("yy/MM/dd hh:mm:ss");
public BoardDTO () {
this.bno = "B"+number++;
this.postDate = DTF.format(LocalDateTime.now());
}
DTF의 값을 yy/MM/dd hh:mm:ss의 값으로 포맷하고 ,
BoardDTO가 생성될때 LocalDateTime.now()로 현재시간이 들어가게 된다.
현재시간은 변경할 필요도 , 변경할 수 없기 때문에 Final Static이 붙는 것이다.