클래스나 메소드 혹은 변수를 선언할 때 final 제어자가 붙을 수 있는데 각각 다음과 같은 제한이 생기게 된다.
[표 1] final 제어자의 효과
대상 | 제한 |
클래스 | 다른 클래스에서 상속을 하지 못 한다. |
메소드 | 상속 받은 클래스에서 오버라이딩 하지 못한다. |
클래스 변수 | 선언과 동시에 값을 지정하여야하며 이후 수정이 불가하다. |
인스턴스 변수 | 선언과 동시에 초기화하거나 생성자 내에서 값을 지정할 수 있다. 이후에는 수정이 불가하다. |
지역 변수 | 선언과 동시에 초기화하거나 그 이후에 값을 지정할 수 있다. 이후에는 수정이 불가하다. |
예를 들어보자 .
final class CA {private static final int ia = 11;private final int ib = 22;private final int ic;public CA() {ic = 22;}public final void func() {final int id = 22;final int ie;System.out.println(id);ie = 22;//이후에 id는 수정 불가}} |
클래스 CA는 파이널 클래스이므로 이것을 상속 받아서 파생클래스를 만들지 못한다. 그리고 func()메소드는 final이므로 상속 받은 클래스에서 오버라이딩하지 못한다. (이 경우는 클래스 자체가 final이므로 별 의미가 없으나 일반 클래스의 final 메소드는 자식 클래스가 오버라이딩하지 못한다.) 많이 사용되는 String 클래스나 Math클래스도 final클래스이므로 이것을 상속받아 새로운 클래스를 파생시키지 못한다.
그리고 final 정적 변수 ia는 반드시 선언하면서 그 값을 지정해 주어야 하며 다른 곳에서 초기화하지 못한다. 하지만 final 인스턴스 변수(위 예에서 ib와 ic)는 선언부에서 값을 지정하거나 생성자에서 값을 지정해 줄 수도 있으며 이후에 값을 변경하지 못하다는 점은 동일하다. 이 점을 이용해서 final 멤버 변수가 인스턴스마다 서로 다른 값을 가지도록 할 수 있다.
func()메소드의 id, ie와 같이 메소드 내부의 final 변수는 메소드가 실행되면서 생성되고 메소드가 종료되면 소멸되는 것은 일반 변수와 같지만 한 번 초기화되면 그 이후에는 값을 변경할 수 없다. 지역 변수는 인스턴스 변수와 유사하게 선언하면서 값을 지정할 수도 있고 선언한 후에 별도로 초기화할 수도 있다. 따라서 이 점을 이용하면 메소드가 호출될 때마다 final 지역 변수가 다른 값을 가지도록 할 수 있다.
만약 어떤 클래스의 인스턴스가 final로 생성되었다고 가정하자.
final ClassA ca = new ClassA(); |
ca는 클래스의 인스턴스로서 내부적으로는 참조값(주소)을 갖는 변수인데 final로 제한되면 한 번 참조가 생성된 이후에는 새로운 참조값을 가지지 못한다.
final ClassA ca = new ClassA();…. …. ca = new ClassA(); //에러 발생 |
따라서 위와 같이 다른 곳에서 ClassA()의 새로운 인스턴스(참조값)를 대입하려고 하면 에러를 발생시킨다.
'프로그래밍언어.Lib > 자바(JAVA)' 카테고리의 다른 글
javacc-6.0 윈도우 bat파일 문제 (0) | 2017.11.16 |
---|---|
자바(JAVA)의 문자열 객체 String, StringBuilder, StringBuffer 비교 (0) | 2015.07.15 |
자바(JAVA)의 import 명령어 (0) | 2015.07.14 |
자바 가상 머신 (java virtual machine, JVM) 개요 (0) | 2015.07.13 |
자바(JAVA)의 패키지(package) 이해 (0) | 2015.07.13 |