관리 메뉴

개발공부기록

Java Final 키워드에 대해서 설명, 각각의 쓰임에 따라 어떻게 동작하는가?(Class, Method, Variable) 본문

이론 직접 정리/자바

Java Final 키워드에 대해서 설명, 각각의 쓰임에 따라 어떻게 동작하는가?(Class, Method, Variable)

소소한나구리 2025. 3. 4. 16:21
728x90

Java의 final 키워드란?

자바의 final 키워드는 이름 그대로 끝이라는 뜻처럼 final 키워드가 적용된 대상의 변경을 금지하여 코드의 가독성과 안전성, 유지보수성을 향상시키는 데 도움을 주는 키워드이다.

final 키워드는 클래스, 메서드, 변수에 사용할 수 있다

Class에 사용되는 final

 

final 키워드가 선언된 클래스는 확장할 수 없으므로 다른 클래스가 final로 선언된 클래스를 상속받을 수 없다

상속 하려고하면 IDE에서 컴파일 오류가 발생하는 것을 확인할 수 있다

 

컴파일 오류를 무시하고 상속하고 실행해보면 Finalclass가 final이라서 상속할 수 없다는 문구와 함께 실행이 되지 않는다

 

Method에 사용되는 final

 

final로 선언된 메서드는 오버라이드 될 수 없으므로 상속받은 서브 클래스에서 final 키워드가 붙은 메서드를 변경할 수 없다

 

final 키워드가 붙어있는 finalMethod()와 final 키워드가 없는 notFinalMethod()를 가진 Parent 클래스를 BasicClass가 상속받은 다음애 상속받은 메서드를 재정의하려고하면 final 키워드가 붙은 finalMethod()는 컴파일 오류가 발생하는 것을 확인할 수 있다

 

마찬가지로 컴파일 오류를 무시하고 실행해보면 Parent 클래스의 finalMethod() 메서드는 final이기 때문에 재정의 할 수 없다는 문구와 함께 실행이 되지 않는다

Variable에 사용되는 final(지역 변수, 멤버 변수)

지역변수(매개변수도 지역변수)

 

지역변수에 final 키워드를 설정할 경우 최초 한번만 값을 할당할 수 있으며 이후에 변수의 값을 변경하면 컴파일 오류가 발생한다

매개변수도 지역변수의 종류이므로 매개변수에 final이 붙으면 메서드 내부에서 값을 변경할 수 없어 메서드 호출시점에 사용된 값이 끝까지 사용되야 한다

 

메서드 블록 안에 final 키워드가 붙은 c 지역변수에 값을 최초 할당한 후 값을 수정하려고 하면 컴파일 오류가 발생한다

메서드의 매개변수인 a에 final 키워드가 붙어있을 때 메서드 내부에서 변수 a의 값을 수정하려고하면 마찬가지로 컴파일 오류가 발생하는 것을 확인할 수 있다.

 

멤버 변수

 

멤버 변수도 지역변수와 마찬가지로 한 번 값이 할당되면 값을 변경할 수 없다

값이 할당된 final 멤버 변수를 다른 곳에서 값을 변경하려고하면 오류가 발생하는 것을 확인할 수 있다

멤버 변수의 경우에는 생성자를 통해서 값을 할당해주는 경우가 많은데, 그런 경우에도 딱 한번만 할당이 가능하며 final 키워드가 붙은 멤버 변수의 값을 변경하기 위해 메서드를 만들려고하면 컴파일 오류가 발생하는 것을 확인할 수 있다

 

컴파일 오류를 무시하고 실행해보면 final 변수인 name의 값을 할당할 수 없다는 문구와 함께 실행되지 않는다

 

참조형 변수와 기본형 변수의 final

 

final을 기본형 변수에 사용하면 할당된 값을 변경할 수 없고 참조형 변수에 사용하면 참조변수가 참조하는 참조값(메모리 주소값)을 변경할 수 없다.

final 키워드로 생성한 User 타입 참조형 변수인 user에 새로운 new User() 객체를 생성하여 참조값을 할당하려고하면 컴파일 오류가 발생하는 것을 확인할 수 있다.

 

 

그러나 여기서 주의해야 할 점이 있는데, 여기서 작성한 User 클래스의 내부의 값은 final이 아니기 때문에 참조형 변수인 user에 새로운 참조값(메모리 주소값)을 할당할 수 없을 뿐이지, User 클래스 내부의 변수의 값은 변경할 수 있게 된다

 

즉 클래스의 내부의 값도 변경하지 않게 하려면 클래스 내부의 필드(멤버 변수)도 final 키워드를 작성해야 한다.

+ Effectively final keyword - 사실상 final

  • Java8에서 추가된 기능으로 지역 변수에 final 키워드를 사용하지는 않았지만 값을 변경하지 않은 지역 변수는 상수와 동일하게 취급한다는 뜻이다
  • 이에 대한 상세한 내용은 지역 변수 캡처에 대해 깊게 다루어야 하므로 https://nagul2.tistory.com/410 글을 참고 하면 된다
728x90