JAVA

final

seungmin576 2024. 12. 26. 09:41

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