뭐.. 그냥 코드 짤때는 상관없습니다 final이 붙나 안붙나 사람이 신경쓸것은 별로 없죠.
윗분말대로 협업할때 빛을 바란다던가 그밖에 장점들이 있습니다.(가독성 향상 등)
하지만 컴파일할때 차이가 납니다. final붙으면 상수로 바뀌거든요.
그러면 이제 상수와 변수의 차이를 생각해보시면됩니다!
자바의 final이나 C의 const 키워드는 상수값을 지정할 때 보통 static키워드와 같이 사용합니다.
유일한 값이라는거죠.. 이는 컴파일시에 미리 생성되는거라고 보시면 됩니다.
컴파일러와 전처리기의 차이라고 보면 되죠.
간단히 예를 들면 게임에서 사용되는 레벨링정보를 표현해야 하는데
이는 유일한 값이 되겠죠. 그럼 레벨링에 대한 데이터를 묶은 'Level' 이라는 클래스를 만듭니다.
이 클래스안에 각 레벨에 해당하는 데이터를 정의합니다.
public static final int LEVEL_1 = 1;
public static final int LEVEL_2 = 2;
public static final int LEVEL_3 = 3;
......
......
이렇게 데이터가 정의된 클래스의 변수는 전부
public static final 이라는 키워드가 붙은걸 알 수 있습니다.
이것은 즉, '객체를 따로 생성하지 않고 어디서나 참조할 수 있는 유일한 상수값' 이라는게 됩니다...
final 키워드는 이것외에도 메서드오버라이드, 메서드콜백 등등에서도 쓰입니다...
주로 알아보기 쉬울때 써요..
예를들어 setVisibility(View.VISIBLE) 이것두 View.VISIBLE 이라고 쓰면 바로 알수있잖아요.
근데 View에 VISIBLE 이 static final int VISIBLE = 1; 이고 static final int GONE = 0; static final int INVISIBLE = 2; 뭐 이런식으로 되어있잖아요.
setVisibility(1) 이런식으로 써도 상관없지만 이걸 사용자도 알아보기 쉽게 쓰게해주려고 변수명으로 바꿔주는거죠ㅎ
여기서 만일 View.VISIBLE = 10; 이라고 님 클래스에서 선언하면 어떻게 될까요?
만일 final이 아니라면 VIew.VISIBLE 값이 10으로 바뀝니다ㅎ
public static은 아무클래스에서나 바꿀수 있거든요? 근데 사용자에 의해서 바뀌면 안되잖아요ㅎㅎ
그래서 final이라고 못바꾸게 못박아버리는거에요ㅎㅎ
private도 그렇고 extends하면 부모 클래스를 맘대로 사용하거나 사용못하게하거나 변수나 메서드 사용 범위에 대한 설정이지 메모리의 이득이나 그런건 없어요ㅎㅎ
interface라던가 getter, setter들이 다 그렇죠~
난 종료할 때 띄우는 다이얼로그의 id를 10으로 정했는데, 같이 일하는 사람이 그 변수에 값을 넣어버리는 코드를 작성했다면 어떨까요?
협업자는 그 변수가 상수인지 모릅니다.