본문 바로가기
Java/Java Basic

[Java Basic] 20. final 제어자

by Rosmary 2022. 7. 23.
728x90
반응형

 

 

 

 

Java에서 제어자는 클래스 또는 클래스 내부의 정보에 대한 접근을 통제하는 역할을 한다. 제어자는 크게 접근 제어자와 기타 제어자로 나뉘며, 필자는 지난 포스팅에서 접근 제어자 4가지가 어떻게 동작하는지 확인해보았다.

 

이번 포스팅에서는 기타 제어자에 대해 알아보려 한다. 기타 제어자는 지금까지 포스팅에서 많이 사용한 static 외에도 final, abstract, synchronized, strictfp 등 여러 종류가 있지만, static과 final, abstract를 제외하고는 기초 단계에서 크게 사용할 일이 없다고 한다... 더군다나 static은 필자가 java 포스팅 초반부에 설명을 한 적이 있어서 이번에는 final에 대해서만 포스팅하려 한다.

 

참고로 abstract는 추상 클래스/매서드라는 것과 관련이 있다고 하는데, 필자가 아직 이 내용까지 완전히 파악된 것이 아니라 지금 당장 글을 쓸 수 없고, 나중에도 쓸 만한 가치가 충분히 있는 내용인지 확신이 없는 상태다. 따라서 abstract도 이번 포스팅 범위에서는 제외한다.

 

단 하나의 제어자에 대한 포스팅이라 내용은 그렇게 많지 않다. 시작해보자.

 

 

 

1. final 제어자

 

final 제어자는 클래스, 멤버변수, 매서드에만 적용할 수 있는 접근자다. '마지막'이라는 의미를 가지는 이 제어자는 적용된 클래스, 멤버변수, 매서드의 변경 권한을 모조리 박탈한다. final 제어자를 각각의 컴포넌트에 적용하여 어떤 변화가 있는지 알아보자.

 

지난 포스팅에서 사용한 Customer, VIP, Main 클래스를 고스란히 다시 사용하려 한다. 새 클래스는 모두 각각의 java 파일에 정의되어 있고, 각 java 파일은 별개의 패키지에 속해있는 상태다. VIP와 Customer 클래스는 서로 자식, 부모 상속관계이며, 두 클래스 모두 접근 제어자는 public으로 설정되어 있는 상태다. Customer 매서드는 전부 protected로 지정되어 있으며, VIP는 오버라이딩을 통해 몇몇 매서드만 public 접근 제어자를 적용한 상태다. 

 

 

부모 클래스인 Customer 클래스에 final 제어자를 적용해보자. 적용하는 순간, 상속관계에서 하위 클래스인 VIP 코드의 extends 부분에서 에러가 발생한다.

 

 

 

 "VIP가 final로 지정된 Customer 클래스를 상속할 수 없다(하위 클래스가 될 수 없다)"라는 에러 문구가 출력된다. 즉 클래스에 final이 붙는 경우, 해당 클래스는 다른 클래스에 의해 상속이 될 수 없는 클래스가 된다. 따라서 클래스의 계층 구조에서 최하위 말단 구조에 해당하는 클래스에 이 final 제어자를 붙여 사용하게 된다.

 

다시 클래스에 추가한 final을 제거하고, 이번에는 cust_number_tmp 변수에 final을 붙여보자. 이 cust_number_tmp는 생성되는 고객 정보의 순번을 나타내기 위한 변수라 static으로 지정되어 있으며, 인스턴스가 생성될 때 마다 초기화 블럭에 의해 1씩 값이 증가한다. final은 값의 변경 권한을 박탈하는 제어자이므로, cust_number_tmp에 final 제어자가 적용되는 순간 바로 에러가 발생한다.

 

 

 

 

즉, final로 지정된 변수는 초기화가 완료되면 더 이상 변경이 불가능한 상수로 취급된다. 이 때문에 수학과 물리에서 고정값을 가져야하는 단위에 많이 사용한다. 원주율을 나타내는 pi나  중력가속도를 나타내는 g 등을 예로 들 수 있다.

 

클래스 내부 멤버 변수가 final 제어자의 적용을 받으면서 초기화가 되지 않은 경우, 초기화 블럭 내에서 단 한 번 초기화가 가능하다. 단, static 변수는 static 초기화 블럭에서, 일반 변수는 인스턴스 초기화 블럭에서만 초기화가 가능하다. 초기화 블럭에 대한 내용은 이 포스팅을 참고하자.

 

 

 

매서드에도 final 제어자를 적용할 수 있다. 매서드에 적용하게되면, 상속 관계에서 하위에 존재하는 클래스가 해당 매서드를 오버라이드 할 수 없게 된다. 다른 말로 하자면, 부모 클래스에서 정의된 매서드의 변경이 불가능하다는 것이다.

 

내용은 동일하나 오버라이딩 시도만으로도 에러가 발생함을 알 수 있다.

 


 

다음 포스팅에서는 Java 클래스의 다형성에 대해 다루어보려 한다.

 

 

Fin.

 

 

 

반응형

댓글