JAVA

자바 final 키워드

롬복에서 @RequiredArgsConstructor 어노테이션를 적용하면 private fianl로 선언된 필드를 포함하는 생성자를 자동으로 만들어 준다.

 

최근 우아한 형제들의 우아한 테크코스 과정을 진행하시는 분들의 코드를 깃허브를 통해서 보게되었는데 필드, 매개변수등 final 키워드를 적용하는 것을 보면서 final 키워드에 대해서 한번 제대로 공부해서 정리해야겠다라는 생각을 하게 되었습니다 .ㅎ

 

final 

final 키워드는 변수(variable), 메서드(method), 또는 클래스(class)에 사용될 수 있습니다. 이 final 키워드는 어떤 곳에 사용되냐에 따라 다른 의미를 가집니다. 하지만 final 키워드를 붙이면 무언가를 제한한다는 의미를 가지는 것은 공통적이 성격입니다.

 

변수(variable)

변수에 final을 붙이면 이 변수는 수정할 수 없다는 의미를 가집니다. 수정될 수 없기 때문에 초기화 값은 필수적입니다. 만약에 객체안의 변수라면 생성자, static 블럭을 통한 초기화까지는 허용합니다.

초기화 값은 필수
수정 불가

객체 즉 참조 값의 경우 조금 헷갈리실 수 있습니다.

Person 은 final 적용하여 수정이 불가능 하지만 Person 내부의 변수는 변경이 가능합니다.

이유는 객체의 내부의 값은 final의 영향 밖에 있기 때문

물론 아래 처럼 객체 내부의 값에 final을 적용 할수 있습니다.

이렇게 된다면 내부 값도 수정할 수 없게 됩니다.

 

메서드(method)

메서드에 final을 붙이면 override를 제한하게 됩니다.

override란 클래스를 상속하였을때 부모의 메서드를 상속해서 재구현을 할 수 있습니다. 즉, 동일한 메서드지만 다르게 동작하게 만들 수 있다는 것입니다.

이렇게 상속 받은 클래스에서 해당 메서드를 수정해서 사용하지 못하도록 할 수 있는것이 메서드에 final을 붙이는 것입니다.

 

클래스(Class)

final 키워드를 클래스에 붙이면 상속 불가능 클래스가 됩니다. 즉, 다른 클래스에서 상속하여 재정의를 할 수 없는 것입니다. 클래스 설계시 재정의 여부를 생각해서 재정의 불가능하게 사용하고 싶다면 final로 등록하는게 추후 유지보수차원에서 좋습니다.

 

개인적인 생각

메서드와 클래스에서 final을 사용하는 것은 상속 등 설계 영역의 고려사항이 반영되는 것이라면

변수에서 final은 개발 단계에서 특정 값이 의도치 않게 변하지 않게 해서 안전성을 높히는 역할에 비중이 있는게 아닌가 싶습니다. 

'JAVA' 카테고리의 다른 글

Java의 직렬화(Serialize)  (0) 2021.06.26
자바 Enum 활용  (0) 2021.06.06
자바 예외 다루기 - 에러 처리 방식  (0) 2021.05.31
Error 와 Exception(Checked, Unchecked)  (0) 2021.05.31
Queue 구현 해보기 (자바)  (0) 2021.05.24