final이란? (Java)

코딩을 합시다·2023년 3월 23일
0

final이란?

한번 값을 정해주면 절대 바뀌지 않는 값!
쉽게 생각해서 ReadOnly와 같다고 생각하면 된다.

final 사용법

final 필드는 위와 같이 선언하며 final 필드의 초기값을 줄 수 있는 방법은 딱 두가지 방법밖에 없습니다. 첫번째는 필드 선언시에 주는 방법이 있고, 두번째는 생성자를 통해서 주는 방법이 있습니다. 단순 값이라면 필드 선언시에 주는 것이 가장 간단하지만 복잡한 초기화 코드가 필요하거나 객체 생성 시에 외부 데이터로 초기화를 시켜야한다면 생성자를 통해서 초기값을 부여하는 방법을 써야 합니다.

final 키워드를 클래스에 붙이면 상속 불가능 클래스가 됩니다. 즉, 다른 클래스에서 상속하여 재정의를 할 수 없는 것입니다. 대표적인 클래스로 Integer와 같은 랩퍼(Wrapper) 클래스가 있습니다.

final 메소드를 오버라이딩 하는데 오류가 생긴다.
메서드에 final을 사용하게되면 상속받은 클래스에서 부모의 final 메서드를 재정의 할 수 없습니다. 자신이 만든 메서드를 변경할 수 없게끔 하고싶을때 사용됩니다.


final로 선언된 PI의 값을 바꿀려고 하니까 오류가 나온다.


set으로 수정할려고 해도 불가능하다


하지만 이거는 일부 수정이 가능하다.
왜 그럴까?

우선 메서드에 있는 변수들은 stack 메모리에 저장이 된다.
이 변수들은 각각 값을 가지는데 기본형 변수(primitive)는 내부에 값을 가지고 참조형 변수는 객체의 주소를 가지게 된다.
따라서 참조형 변수는 객체의 값을 알 수 있지만 final 키워드는 사용된 영역에만 영향을 미친다.
따라서 Person 객체 그 자체의 값은 final로 지정이 되어있어서 수정이 불가능 하지만 그 내부의 값은 final의 영향 밖에 있기 때문에 set을 통해 변경이 가능했던 것이다.

final을 사용해야 하는 이유

  • 디버깅 하기가 쉽다
  • 사이드이팩트 적게 프로그래밍이 가능하다.
  • 협업시 코드의 가독성을 높여주는 효과를 얻을 수 있다.

0개의 댓글