우테코 5기 강의를 듣다가 코치님의 코드에서 한가지 낯선 방식을 발견했다.
public String Something(final int a, final int b) {
...
}
함수의 파라미터에 final 키워드가 들어가는 것을 처음봐서 왜 이렇게 선언하고 어떠한 이점이 있는지 궁금하니 한번 알아보자.
final 키워드는 변경 불가능하다
라는 말에 핵심을 두고있다.
매개변수가 변경 불가능 하면 어떤 특징이 있을까?
파라미터로 받아오는 인자에 대한 값 재할당을 금지하는 이점이 있다.
매개변수를 final로 선언함으로써 인자로 들어온 값에 대한 데이터의 정합성을 유지 할 수 있다.
파라미터가 많아질수록 가독성을 해칠 수도 있다는 단점을 생각해볼 수도 있다.
public String method(final int x, final int y, final int point...) {
...
return result;
}
IntelliJ에서 메소드 추출 및 기타 코드 자동 생성 기능 사용 시 자동으로 final 키워드를 붙여줄 수 있도록 설정할 수 있다.
메소드 추출 단축키 :
CMD
+Option
+M
극히 일부지만 final로 선언되면 아주 보이지 않을정도의 미미한 성능 개선 정도는 이룰 수 있지 않을까? 라고 생각한다.
이팩티브 자바의 final 키워드를 설명하는 내용 중 새로 생성된 인스턴스를 동기화 없이 다른 스레드로 건네도 문제없이 동작하게끔 보장하는 데 필요하다.
라는 문구가 있다.
그렇다면 final로 생성된 인스턴스는 위 문구에서 말하는 동기화
라는 과정을 반드시 생략하기 때문에 성능상 이점을 가질 수 있다고 말할 수 있는것인지? 궁금하다 🤔
해당 내용은 아직 jvm의 동작 방식 및 GC의 효율성과 같은 깊은 부분에서 정답을 찾을 수 있을것 같은데 아직 학습하지 못해 자세한 내용은 기술부채로 남겨 둘 것 같다.
혹시나 어째서 성능 개선이 일어나는지 알고 계시는분은 설명 부탁드립니다...
현재 클린코드 및 코드 컨벤션을 보며 느끼는 바는 하나의 메소드에 파라미터가 3개 이상을 넘기지 않도록 구성하는 일 밖에 없었다.
아직 3개 혹은 4개 이상의 파라미터를 가진 메소드를 작성해볼일이 없어서(?) 파라미터가 길어진다는 단점을 부각시키기에는 애매한 부분이 있는 것 같다.
만약 정말로 실무에서의 파라미터를 분리하기 어려운 상황이 겪어본다면 final을 붙이지 않는것을 더욱 선호할 지도 모르지만, 아직은 파라미터에 final을 붙였을 때 오는 데이터의 정합성 유지라는 장점에 더욱 초점을 맞춰서 보게 되는 것 같다.
좋은 글이네요🔥
Q. final이 변경 불가능하다는 것은 불변하다는 의미로 작성해주신건가요?