final은 자바에서 사용하는 키워드 중 하나로 한 번만 할당할 수 있는 엔티티를 정의할 때 사용한다. final로 선언된 변수가 할당되면 항상 같은 값을 가진다.
만약 final 변수가 객체를 참조하고 있다면, 그 객체의 상태가 바뀌어도 final 변수는 매번 동일 내용을 참조한다.
즉한 번 값을 넣어두면 절대 바뀌지 않는 녀석이다.
final의 경우, 3곳에서 사용할 수 있는데 클래스
, 메소드
, 변수
이다.
public final class MyFinalClass {...} // final 클래스 선언
public class ThisIsWrong extends MyFinalClass {...} // 상속 불가!
final 키워드를 클래스에 붙이면 상속 불가능 클래스가 된다.
이렇게 하면 보안이나 효율성 측면에서 장점이 있음.
public class Base
{
public void m1() {...}
public final void m2() {...} // final 메서드 선언
}
public class Derived extends Base
{
public void m1() {...} // Base 클래스의 m1() 상속
public void m2() {...} // 오버라이딩, 즉 상속받은 메서드 수정 불가!
}
만약 어떤 클래스를 상속하는데 그 안에 final 메서드가 있다면, 오버라이딩으로 수정할 수 없다.
상속 받은 클래스에서 해당 메서드를 수정해서 사용하지 못하도록 할 수 있는것이 메서드에 final을 붙이는 이유이다.
public class Service {
public void variableFinal() {
final int value = 2;
final Person person = new Person("사바라다", 29);
System.out.println("value = " + value);
System.out.println("person_1 = " + person);
// value = 2; // 컴파일 에러
person.setAge(10);
person.setName("사바라");
System.out.println("person_2 = " + person);
// person = new Person("염광호", 29); // 컴파일 에러
}
}
class Person {
private String name;
private int age;
//.. get, set, toString 메서드 존재하나 길이상 생략
}
value = 2
person_1 = Person{name='사바라다', age=29}
person_2 = Person{name='사바라', age=10}
변수에 final을 붙이면 이 변수는 수정할 수 없다는 의미를 가진다.
수정될 수 없기 때문에 초기화 값은 필수적이다. 만약에 객체안의 변수라면 생성자, static 블럭을 통한 초기화까지는 허용.
수정 할 수 없다는 범위는 그 변수의 값에 한정되기 때문에 다른 객체를 참조하거나 할 때 참조하는 객체의 내부의 값은 변경할 수 있다.
생각
final은 좀 더 안전한 코드를 만들 수 있게 해주는 키워드 같다.
https://sabarada.tistory.com/148
http://dailusia.blog.fc2.com/blog-entry-311.html