final 예약어는 마지막으로 정한 것이니 더 이상 수정할 수 없다는 뜻이다.
변수, 메서드, 클래스에 사용할 수 있다.
| 사용 위치 | 설명 |
| 변수 | final 변수는 상수를 의미한다. |
| 메서드 | final 메서드는 하위 클래스에서 재정의할 수 없다 |
| 클래스 | final 클래스는 상속할 수 없다 |
상수를 의미하는 final 변수
상수는 변하지 않는 수이다.
package finalex;
public class Constant {
int num = 10;
final int NUM = 100;
public static void main(String[] args) {
Constant cons = new Constant();
cons.num = 50;
cons.NUM = 200; //상수에 값을 대입하여 오류
System.out.println(cons.num);
System.out.println(cons.NUM);
}
}
변수를 두 개 선언했다.
변수 이름은 대소문자를 구별하기 때문에 두 변수는 다른 변수이다.
상수를 선언할 때는 일반 변수와 구별하기 위해 대문자로 쓰는 경우가 많다.
상수로 선언한 NUM에는 다른 값을 대입할 수 없기 때문에 오류가 발생한다.
여러 자바 파일에서 공유하는 상수 값 정의
여러 파일에서 똑같이 공유해야 하는 상수 값이 있을 때 이런 값을 파일마다 선언하면 코드가 중복되고 값이 변하거나 추가될 때 그 값을 사용하는 파일을 모두 수정해야한다.
따라서 여러 파일에서 공유해야 하는 상수 값은 한 파일에 모아 public static final로 선언하여 사용하면 좋다.
package finalex;
public class Define {
public static final int MIN = 1;
public static final int MAX = 99999;
public static final int ENG = 1001;
public static final int MATH = 2001;
public static final double PI = 3.14;
public static final String GOOD_MORNING = "Good Morning";
}
최솟값과 최댓값, 영어 과목 코드와 수학 과목 코드, 원주율 PI 값, 출력 문자열 등을 상수로 선언했다.
상수를 모두 public 예약어로 선언했으므로 이들 값은 외부에서도 사용할 수 있다.
그리고 모든 상수를 static으로 선언했기 때문에 인스턴스를 생성하는 것과 관계없이 클래스 이름으로 참조할 수 있다.
- 상수를 사용하는 예제
package finalex;
public class UsingDefine {
public static void main(String[] args) {
System.out.println(Define.GOOD_MORNING);
System.out.println("최솟값은 " + Define.MIN + " 입니다.");
System.out.println("최댓값은 " + Define.MAX + " 입니다.");
System.out.println("수학 과목 코드 값은 " + Define.MATH + " 입니다.");
System.out.println("영어 과목 코드 값은 " + Define.ENG + " 입니다.");
}
}

하위 클래스에서 재정의 불가능한 final 메서드
템플릿 메서드를 다루면서 final로 템플릿 메서드를 선언하였었다.
어떠한 클래스던 이 클래스를 상속받으면 수정할 필요없이 모두 공통적으로 사용하는 경우였기 때문에 final 선언하여 재정의할 수 없게 한 것이다.
https://seungmin576.tistory.com/64
상속할 수 없는 final 클래스
상속을 하면 변수나 메서드를 재정의할 수 있는데, 그러면 원래 클래스가 가지고 있는 기능에 오류가 생길 수도 있다.
따라서 보안과 관련되어 있거나 기반 클래스가 변하면 안 되는 경우에는 클래스를 final로 선언한다.
JDK에서 제공하는 클래스 중에도 있는데 대표적으로 String이나 Integer 클래스를 예로 들 수 있다.
이러한 클래스가 상속되면 클래스를 만들 때 의도한 바와 다르게 사용될 수도 있으므로 final로 선언한다.
'JAVA' 카테고리의 다른 글
| 내배캠 자바 2주차 자료 구조 (컬렉션) (1) | 2024.12.31 |
|---|---|
| 인터페이스 (0) | 2024.12.26 |
| 템플릿 메서드 응용하기 (0) | 2024.12.24 |
| 템플릿 메서드 (디자인패턴) (0) | 2024.12.24 |
| 추상 클래스 (0) | 2024.12.24 |